#linux-kernel #interrupt #inline-assembly
#linux-ядро #прерывание #встроенная сборка
Вопрос:
Я знаю, что в ядре я могу вызвать get_cpu()
, чтобы отключить вытеснение ядра и local_irq_save(flags)
отключить прерывание. Мне любопытно, как я могу по-прежнему достигать той же цели, не вызывая эти функции. У меня есть три вопроса,
- Я обнаружил, что именно эта
cli
инструкция отвечает за отключение прерываний. Поэтому мне было интересно, будет ли следующая встроенная сборка,asm volatile("cli": : :"memory");
достаточно отключить прерывания. Если это работает, как я могу проверить, действительно ли это отключает прерывания?
- Есть ли какая-либо встроенная инструкция по сборке, которую я могу использовать для отключения вытеснения ядра?
- Я знаю, что невозможно отключить прерывания из пользовательского пространства. Мне просто интересно, удастся ли кому-нибудь каким-то образом выполнить эту
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.html4. Только NMI может вернуть управление ядру. Это может произойти с помощью прерывания счетчика производительности, например, ядро по умолчанию использует его для NMI watchdog. Однако, как правило, плохая идея оставлять прерывания отключенными в пользовательском пространстве на долгое время. Я точно не знаю, что произойдет. Linux не предназначен для этого. например, RCU на других ядрах застрянет при
RUN_ON
попытке запустить себя на этом ядре через IPI.5. Если вы хотите иметь процессор в своем распоряжении, вы можете изучить
isolcpus=1
опцию загрузки ядра Linux.