У меня возникают трудности с пониманием того, как работает простой загрузчик. Загрузочный загрузчик, о котором я говорю, - это курс MIT "Операционные системы".
Во-первых, позвольте мне показать вам фрагмент кода сборки, который выполняет BIOS:
[f000:fec3] 0xffec3: lidtw %cs:0x7908
[f000:fec9] 0xffec9: lgdtw %cs:0x7948
[f000:fecf] 0xffecf: mov %cr0,%eax
[f000:fed2] 0xffed2: or $0x1,%eax
[f000:fed6] 0xffed6: mov %eax,%cr0
[f000:fed9] 0xffed9: ljmpl $0x8,$0xffee1
По внешнему виду, этот код устанавливает таблицу прерываний и таблицу дескрипторов, а затем включает защищенный режим.
- Почему мы переходим в защищенный режим в BIOS? Не следует загрузчик запускается в реальном режиме (btw - почему он должен работать в реальном режим?)
- Я искал, но не нашел нигде как именно команда ljmpl работает, и есть разница между это и ljmp и обычный jmp - I было бы признательно, если бы кто-то точки в правильном направлении.
- Почему мы выполняем прыжок? Что цель этой инструкции?
Переход на код загрузчика -
# Switch from real to protected mode, using a bootstrap GDT
# and segment translation that makes virtual addresses
# identical to their physical addresses, so that the
# effective memory map does not change during the switch.
lgdt gdtdesc
movl %cr0, %eax
orl $CR0_PE_ON, %eax
movl %eax, %cr0
# Jump to next instruction, but in 32-bit code segment.
# Switches processor into 32-bit mode.
ljmp $PROT_MODE_CSEG, $protcseg
- В нем говорится, что процессор находится в реальный режим - но мы просто видели, что BIOS переключается в защищенный режим... Я в замешательстве - как это может быть возможно?
- Как мы переключаемся на 32-битный режим? Какие заставляет процессор волноваться в 32-битный режим из-за ljmp инструкция?
И еще одна вещь, которую я не понимаю - когда я отслеживаю выполнение загрузчика с помощью gdb, я вижу, что выполняется следующая инструкция (что инструкция ljmp из кода загрузчика):
ljmp $0x8,$0x7c32
Но когда я заглянул в файл .asm, я увидел следующее:
ljmp $0xb866,$0x87c32
Полностью потерян здесь. Как получается, что команда, написанная в файле .asm, и исполняемая команда различны? У меня есть догадка, что это связано с защищенным режимом и тем, как он преобразует адреса, но я действительно не понимаю.
Буду признателен за любую помощь!