Когда процессор находится в режиме ядра, он может читать и записывать в любой регистр? - PullRequest
3 голосов
/ 18 апреля 2019

Когда процессор находится в режиме ядра, может ли он считывать и записывать в любой регистр, или есть какие-то регистры, которые недоступны даже в режиме ядра?

1 Ответ

3 голосов
/ 18 апреля 2019

На x86 нет зарегистрированных регистров, поэтому все регистры архитектурно видны одновременно.

И да, в режиме ядра (кольцо 0) x86 может записать любой регистр. (Пока ядро ​​работает в 64-битном режиме, в противном случае оно не может получить доступ к x / ymm8..16 или zmm8..31 или r8..r15).

И да, ядро, которое переключается в 32-битный режим после входа в ядро ​​из 64-битного пространства пользователя; Solaris x86-64, очевидно, сделал это, и MacOS X использовал это для совместимости с 32-битными драйверами ядра. На машинах с менее чем 4 ГБ ОЗУ и меньшим объемом кэша использование меньших указателей в ядре имеет некоторые преимущества, и недостатки могут быть не такими большими.


wrmsr (запись специфичного для модели регистра) требуется режим ядра. Так же rdmsr читать MSR. Таким образом, в отличие от целочисленных и векторных регистров (rax..rsi / r8..r15 и xmm0..15), которые пользовательское пространство может свободно использовать, являются регистрами, которые может изменять только ядро.

Возможно, существуют некоторые специфичные для модели регистры, которые доступны только в режиме управления системой. (иногда называют кольцо -1) Я не знаю, я мало читал о SMM. И / или регистры, связанные с SGX (используются для «анклавов»), которые я опять не изучал.

Также могут быть некоторые MSR только для чтения, которые вы никогда не сможете написать с помощью wrmsr. IDK, если вы это имеете в виду, или если вы учитываете только регистры, которые обычно считаются частью архитектурного состояния, которое сохраняется / восстанавливается при переключениях контекста, например, целочисленные регистры общего назначения. Все эти регистры доступны для записи в любом режиме, даже сегментные регистры.


Внутренние регистры сегмента базы / предела не читаются напрямую, но в длинном 64-битном режиме они фиксируются на base = 0 / limit = -1, за исключением FS и GS. Но эти базы доступны с rdmsr / wrmsr на MSR_GS_BASE / MSR_FS_BASE.

Добавлено расширение ISA FSGSBASE wrfsbase и т. Д., Которое позволяет более эффективно считывать / записывать базы FS и GS более эффективно, чем MSR. (В любом случае ядру не нужно фактически изменять запись GDT или LDT и перезагружать fs, чтобы обновить базу fs для локального хранилища потока). Подробно о MSR_GS_BASE в Linux x86 64

Но я не думаю, что база / лимит cs / ds / es / ss выставляется через MSR, и они актуальны для 32-битного защищенного режима. (Или для возврата в реальный режим для создания «нереального» режима.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...