Как процессор x86 может получить инструкцию сразу после загрузки GDT загрузчиком? - PullRequest
1 голос
/ 22 марта 2020

В типичном простом написании загрузчика для x86 у нас есть следующий код для загрузки GDT и выполнения дальнего перехода (обратите внимание, что CS составляет 0x0 перед выполнением следующего кода):

lgdt gdtdesc
movl %cr0, %eax
orl $1, %eax
movl %eax, %cr0

# Jump to next instruction, but in 32-bit code segment.
# Switches processor into 32-bit mode.
ljmp $0x8, $protcseg

.code32                                             # Assemble for 32-bit mode
protcseg:

Однако, сразу после lgdt CS имеет значение null, указывая на нулевой дескриптор в GDT. Итак:

1. Как процессор может получить правильную инструкцию сразу после того, как GDT загружен lgdt?

2.DPL сегмента кода для дальнего перехода обычно 0, процессор выполняет проверку привилегий при выполнении дальнего перехода?

1 Ответ

1 голос
/ 22 марта 2020

Пока дальний прыжок не загрузит внутреннюю базу CS / лимит / материал из записи GDT, вы вообще не используете какую-либо запись GDT. Это не на самом деле даже защищенный режим.

В отличие от включения подкачки страниц (когда выборка команды для следующей инструкции рассматривает CS: EIP как виртуальную в следующей инструкции после записи CR0), содержимое сегмента не Это происходит до тех пор, пока после записи в регистр сегмента ЦП фактически не прочитает данные из GDT.

Базовый адрес CS не изменяется LGDT, и вы по-прежнему находитесь на максимальном уровне привилегий с операндом-размером = адресом -size = 16, поэтому выборка кода инструкции ljmp просто происходит. (Предполагая, что выполнение этого фрагмента началось в реальном или нереальном режиме.) Нахождение в защищенном режиме влияет на значение обновления CS до 8, но не влияет на выборку и запуск инструкции, которая делает это.

I не знаю формальных деталей того, считается ли он как CPL = 0 или это особый случай, или что произойдет, если ваш первый дальний прыжок был к воротам вызова. Если вы хотите большего, посмотрите https://wiki.osdev.org/GDT_Tutorial и / или руководства Intel или AMD, или, возможно, кто-то еще ответит на этот вопрос.

...