Реальный режим и загрузка ядра Linux запутывают

Насколько мне известно, защищенный режим будет активирован в ядре, а на этапах grub он останется в реальном режиме. Мое недоразумение: в реальном режиме общая память, доступная для использования, меньше 1 МБ, но как grub может загружать ядро ​​и даже корневую файловую систему (обычно более 1 МБ) в память?

GRUB не нужно загружать все ядро ​​в память. Изображение ядра разбивается на две части:

  • Код ядра реального режима, который является небольшим и может быть загружен в пределах порога 640 КБ доступной памяти;
  • Остальная часть ядра, которая работает в защищенном режиме и загружается после первого мегабайта памяти.

Загрузочный загрузчик загружает только код ядра реального режима, который, в свою очередь, загружает остальные (см. go_to_protected_mode() в arch/x86/boot/pm.c ). Таким образом, процесс может оставаться в пределах ограничений памяти при работе в реальном режиме.

Небольшое примечание: GRUB может работать как в реальном режиме, так и в защищенном режиме, в зависимости от того, что он делает. Он может переключиться на защищенный режим для некоторых вещей (некоторое обнаружение аппаратного обеспечения и отображение меню). Вы правы, однако, думая, что он находится в реальном режиме, когда он попадает в ядро.

Это можно сделать в реальном режиме с помощью функции BIOS int 0x15, 0x87. GDT должен быть соответствующим образом заполнен для источника и назначения. cx – количество байтов для перемещения.

  push edx push es xor ax, ax mov es, ax mov ah, 0x87 mov si, gdt int 0x15 jc error pop es pop edx ret gdt: times 16 db 0 dw 0xffff ; segment limit .src: dw 0 db 2 db 0x93 ; data access rights dw 0 dw 0xffff ; segment limit .dest: dw 0 db 0x10 ; load protected-mode kernel to 100000h db 0x93 ; data access rights dw 0 times 16 db 0 error: