Каков встроенный ассемблерный код для вытеснения ядра и отключения прерываний?

#linux-kernel #interrupt #inline-assembly

#linux-ядро #прерывание #встроенная сборка

Вопрос:

Я знаю, что в ядре я могу вызвать get_cpu() , чтобы отключить вытеснение ядра и local_irq_save(flags) отключить прерывание. Мне любопытно, как я могу по-прежнему достигать той же цели, не вызывая эти функции. У меня есть три вопроса,

  1. Я обнаружил, что именно эта cli инструкция отвечает за отключение прерываний. Поэтому мне было интересно, будет ли следующая встроенная сборка,
     asm volatile("cli": : :"memory");
     

достаточно отключить прерывания. Если это работает, как я могу проверить, действительно ли это отключает прерывания?

  1. Есть ли какая-либо встроенная инструкция по сборке, которую я могу использовать для отключения вытеснения ядра?
  2. Я знаю, что невозможно отключить прерывания из пользовательского пространства. Мне просто интересно, удастся ли кому-нибудь каким-то образом выполнить эту cli инструкцию из пользовательского пространства. Сможет ли он по-прежнему отключать прерывания? Если ответ отрицательный, то почему?

Комментарии:

1. Да, cli в ядре отключит прерывания. Но вместо этого вы должны использовать определенную функцию. Cli в пользовательском коде не будет выполняться; это вызывает ошибку GP.

2. примечание: CLI не может отключить NMI или пользовательские прерывания. Если вы изучаете ОС: у вас должен быть крошечный загрузчик с вашим тестовым кодом. Вы можете протестировать там (генерируя аппаратные прерывания, например, часы / будильник, USB, …). «Вытеснение ядра» — это «ядро», а не процессор, поэтому для этого нет инструкции, это просто задача ядра, и вы просто говорите ядру не менять процессор. Для получения подробной информации ознакомьтесь с руководствами Intel (том об ОС для архитектуры ia32). Очень подробно, но вам нужно прочитать его дважды, прежде чем все начнет обретать смысл.

3. Вы можете установить уровень привилегий ввода-вывода отдельно от обычного уровня привилегий, чтобы вы могли находиться в кольце 3 и по-прежнему иметь возможность выполнять cli , если у вас iopl = 0. В Linux см. iopl Системный вызов. man7.org/linux/man-pages/man2/iopl.2.html

4. Только NMI может вернуть управление ядру. Это может произойти с помощью прерывания счетчика производительности, например, ядро по умолчанию использует его для NMI watchdog. Однако, как правило, плохая идея оставлять прерывания отключенными в пользовательском пространстве на долгое время. Я точно не знаю, что произойдет. Linux не предназначен для этого. например, RCU на других ядрах застрянет при RUN_ON попытке запустить себя на этом ядре через IPI.

5. Если вы хотите иметь процессор в своем распоряжении, вы можете изучить isolcpus=1 опцию загрузки ядра Linux.