Как загрузить второй загрузчик этапа из первой стадии?

Я записал простой загрузчик первой стадии, который отображает "Привет мир", использующий прерывание к BIOS. Теперь как следующий очевидный шаг, который запишет второй этап, но где код для этого должен существовать и как загрузить его из первой стадии?

Вот программа для первой стадии

[BITS 16]   ;Tells the assembler that its a 16 bit code
[ORG 0x7C00]    ;Origin, tell the assembler that where the code will
                ;be in memory after it is been loaded

MOV SI, HelloString ;Store string pointer to SI
CALL PrintString    ;Call print string procedure
JMP $       ;Infinite loop, hang it here.


PrintCharacter: ;Procedure to print character on screen
    ;Assume that ASCII value is in register AL
MOV AH, 0x0E    ;Tell BIOS that we need to print one charater on screen.
MOV BH, 0x00    ;Page no.
MOV BL, 0x07    ;Text attribute 0x07 is lightgrey font on black background

INT 0x10    ;Call video interrupt
RET     ;Return to calling procedure



PrintString:    ;Procedure to print string on screen
    ;Assume that string starting pointer is in register SI

next_character: ;Lable to fetch next character from string
MOV AL, [SI]    ;Get a byte from string and store in AL register
INC SI      ;Increment SI pointer
OR AL, AL   ;Check if value in AL is zero (end of string)
JZ exit_function ;If end then return
CALL PrintCharacter ;Else print the character which is in AL register
JMP next_character  ;Fetch next character from string
exit_function:  ;End label
RET     ;Return from procedure


;Data
HelloString db 'Hello World', 0 ;HelloWorld string ending with 0

TIMES 510 - ($ - $$) db 0   ;Fill the rest of sector with 0
DW 0xAA55           ;Add boot signature at the end of bootloader
10
задан Xinus 14 January 2010 в 16:27
поделиться

1 ответ

На X86 вы сделаете следующее (упрощенное):

  • у загрузчика загружают N-го сектора диска / дискеты (где бы вы ни загружались) в память и выполняете его (т. Е. Сегмент нагрузки / смещение И делать рентф ). Лучшая альтернатива состоит в том, чтобы искать файловую систему для определенного файла (например, Kernel.bin) - но вам нужно знать тип файловой системы (например, fat12, если вы тестируете с гибкого изображения).
  • Ядро начнется в реальном режиме. Он устанавливает дескрипторы кода, GDT и так далее, активирует 32-битное адресацию (вы должны слышать о «A20»), и, наконец, входит в защищенный режим. Тогда вам нужен шаг на 32-битный сегмент кода (файл ядра должен быть связан вместе таким образом, чтобы 32-битный код находился в абсолютном положении, например, при смещении 512, сразу после 16-битного реального режима) Отказ
  • 32-битная сборка ядра, затем просто определяет Expart _Mykernel (например) и вызывает этот символ.
  • Затем вы можете начать писать свое ядро ​​в виде C функции MyKernel .

Хорошо, это был краткий обзор того, что я сделал несколько лет назад (с большим количеством копирования и вставки из Интернета;). Если это не полезно, вот несколько хороших веб-ресурсов по разработке ОС:

Надеюсь, что помогает ^^

6
ответ дан 4 December 2019 в 01:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: