C 我是否正确设置了引导扇区/加载程序中会发生的情况?
我正在尝试做一个简单的引导加载程序来设置我的C内核,我不知道怎么做。我已经用评论列出了我认为我需要做的准备工作 test.asm:C 我是否正确设置了引导扇区/加载程序中会发生的情况?,c,assembly,x86,nasm,bootloader,C,Assembly,X86,Nasm,Bootloader,我正在尝试做一个简单的引导加载程序来设置我的C内核,我不知道怎么做。我已经用评论列出了我认为我需要做的准备工作 test.asm: ;test.asm ;initialization type stuff [bits 16] [org 0x7c00] ;initialize anything I need to ;maybe move to 64-bit protected mode ;load kernel ;call kmain ;padding & magic number
;test.asm
;initialization type stuff
[bits 16]
[org 0x7c00]
;initialize anything I need to
;maybe move to 64-bit protected mode
;load kernel
;call kmain
;padding & magic number (end)
times 510-($-$$) db 0
dw 0xaa55
kernel.c:
//kernel.c
//main entry point for kernel
int kmain(void)
{
//video memory
char *vidptr = (char*)0xb8000;
vidptr[0] = 'X';
while(1) {}
return 0; //might create an error because it is unreachable
}
如果能帮助我纠正我正在尝试的过程,我将不胜感激。帮助我的引导加载程序调用内核也很好。你实际上不需要引导加载程序,但是如果你想要一个,做你想做的,然后跳转到内核的开始地址。内核的开头应该放在一个特定的内存地址,这样您就可以跳转到它,检查链接器的文档以及如何将内核放在一个特定的内存地址。您使用的是什么MCU?通过asm,通过跳转或仅将PC设置为内核的起始地址,实际调用内核的过程最容易完成。独立系统不使用
int main(void)
,您将返回谁?另外,由于原始二进制操作可能是有符号的,所以从不使用char
,而是使用uint8\t
。要访问物理地址,您需要使用volatile uint8\u t*
。这些都是非常基本的东西…我想我会回到执行行的来源,汇编脚本。你需要花一些时间在-有教程涵盖了你所问的一切。