可以使用此ASM引导加载程序调用内核吗?怎么样?

时间:2016-03-11 14:46:39

标签: assembly x86 kernel bootloader osdev

我做了一个小的引导程序。现在我想加载C ++内核。我可以使用我的小引导加载程序吗?

   [BITS 16]
   [ORG 0x7C00]
   [extern _start_kernel]

   MOV SI, LoadString
   CALL String
   CALL _start_kernel




   JMP $ 

   Print:
   MOV AH, 0x0E
   MOV BH, 0x00
   MOV BL, 0x07


   INT 0x10
   RET

   String:
   characters:
   MOV AL, [SI]
   INC SI
   OR AL, AL
   JZ stopPrint
   CALL Print
   JMP characters
   stopPrint
   RET


   LoadString db 'Loading...', 0


   TIMES 510 - ($ - $$) db 0
   DW 0xAA55

这是一个非常简单的bootloader,这是我第一次制作bootloader(带教程)。我在windows中使用NASM来编译asm代码。

2 个答案:

答案 0 :(得分:3)

  

现在我要加载c ++内核。我可以使用我的小asm bootloader吗?

使用您编写的代码

,因为在引导加载程序中 负责实际将内核文件带入内存。只是声明外部标签[extern _start_kernel]不会有任何好处 搜索论坛,您将找到管理此问题的示例。

到目前为止你的努力记录 因为您编写了[ORG 0x7C00],所以您希望地址与线性地址0相关。这也是您的责任,以确保相应地设置段寄存器。您需要添加到您的代码中:

xor ax, ax
mov ds, ax
MOV SI, LoadString

答案 1 :(得分:1)

如果您想在内核中调用外部函数,则需要首先在内核文件中声明它,然后从引导加载程序中调用它。您还需要一个链接器文件,该文件将内核链接到引导加载程序,并将其全部转换为单独的二进制文件,然后可以使用GRUB引导该文件。访问this站点,该站点向您展示如何使引导加载程序从内核开始执行,然后使用链接器文件链接它。如果您有Linux,并且您打算使用该站点上的代码,则可能需要GCC交叉编译器。