Переводит ли GRUB в защищенный режим?

Я хотел бы спросить, является ли GRUB переключением CPU в защищенный режим во время загрузки или это ядро ​​Linux это делает. А также я хотел бы спросить - это само ядро ​​(vmlinuz) ELF или это простой двоичный формат? Спасибо.

Ответы

Ответ 1

GRUB отбрасывает вас в защищенный режим.

GRUB Спецификация Multiboot (версия 0.6.96) Раздел 3.2 сообщает об этом

"CR0

Бит 31 (PG) должен быть очищен. Должен быть установлен бит 0 (PE). Другие биты - все undefined.

И Отображение списка CR0 сообщает вам, что система должна находиться в защищенном режиме.


Linux не является многозадачным ядром и не полагается на некоторый загрузчик для переключения в PM, он следует за Linux Boot Protocol. Но linux делает сам режим защищенного режима и не полагается на загрузчик

check: http://lxr.linux.no/#linux+v2.6.39/arch/x86/boot/main.c

Здесь он вызывает go_to_protected_mode();, когда затем вызывает protected_mode_jump (), который затем выполняет CR0 stuff (устанавливает бит 0)

(Другой бит говорит, что пейджинг отключен)

ИЗМЕНИТЬ

Что я могу понять, так это то, что GRUB может определять протокол загрузки linux (GRUB2, а также наследие) и загружает linux в память, но не переключается в защищенный режим. Посмотрите на эту ссылку: http://www.gnu.org/software/grub/manual/grub.html#GNU_002fLinux и раздел 16 страницы в этой ссылке.

Ответ 3

Я бы сказал, что ответом здесь является то, что загрузчик GRUB переключается в "нереальный режим" перед загрузкой ядра (что объясняет, почему бит CR0 0 не установлен в этот момент). Полная 32-битная адресация включена, для GDT установлен плоский [0,4Gigs>, линия A20 включена, но подкачка не включена, поэтому ядру Linux (или любому другому ядру) все равно придется сделать это и переключиться вернуться в защищенный режим.

https://en.wikipedia.org/wiki/Unreal_mode