簡體   English   中英

可以使用此ASM引導程序調用內核嗎? 怎么樣?

[英]It is possible to call kernel with this ASM bootloader? How?

我做了一個小引導程序。 現在,我想加載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

這是一個非常簡單的引導程序,這是我第一次制作引導程序(帶有教程)。 我在Windows中使用NASM來編譯asm代碼。

現在我想加載c ++內核。 我可以使用我的小asm引導加載程序嗎?

使用您編寫的代碼,因為在引導加載程序中,實際上是將內核文件帶入內存是您的責任。 僅聲明一個外部標簽[extern _start_kernel]不會有任何好處。
搜索論壇,您將找到管理此問題的示例。

到目前為止您所做的努力的說明。
因為你寫[ORG 0x7C00]你希望你的地址是相對於線性地址0。這里也實在是你的責任,以確保該段寄存器相應設置。 您需要添加到代碼中:

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

如果要在內核中調用外部函數,則需要首先在內核文件中聲明該函數,然后從引導加載程序中對其進行調用。 您還將需要一個鏈接程序文件,該文件將內核與引導加載程序鏈接在一起,成為一個單獨的二進制文件,然后可以使用GRUB進行引導。 請訪問站點, 站點向您展示了如何使引導加載程序從內核開始執行,然后使用鏈接器文件進行鏈接。 如果您使用的是Linux,並且打算使用該站點上的代碼,則可能需要GCC交叉編譯器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM