如何从第一阶段加载第二阶段启动加载程序?

Xin*_*nus 10 operating-system bootloader

我编写了简单的第一阶段bootloader,它使用对bios的中断显示"Hello world".现在作为编写第二阶段的下一个明显步骤,但是应该存在的代码以及如何从第一阶段加载它?

这是第一阶段的计划

[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
Run Code Online (Sandbox Code Playgroud)

And*_*Dog 6

在x86上,您将执行以下操作(简化):

  • 让引导加载程序将磁盘/软盘的第n个扇区(无论你从哪里启动)加载到内存中并执行它(即加载段/偏移量并执行retf).更好的选择是在文件系统中搜索某个文件名(例如KERNEL.BIN) - 但是您需要知道文件系统类型(例如,如果您正在从软盘映像进行测试,则为FAT12).
  • 然后内核将以实模式启动.它设置代码描述符,GDT等,激活32位寻址(你应该听说过"A20"),最后进入保护模式.然后你需要远程跳转到32位代码段(内核文件必须以32位代码处于绝对位置的方式链接在一起,例如在偏移512处,在16位实模式之后) .
  • 然后,32位内核程序集定义EXTERN _mykernel(例如)并调用该符号.
  • 然后,您可以开始将内核编写为C函数mykernel.

好的,这是我几年前做过的简短概述(从互联网上大量复制和粘贴;).如果这没有帮助,这里有一些关于OS开发的好的Web资源:

希望有助于^^