C 我是否正确设置了引导扇区/加载程序中会发生的情况?

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

我正在尝试做一个简单的引导加载程序来设置我的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 (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*
。这些都是非常基本的东西…我想我会回到执行行的来源,汇编脚本。你需要花一些时间在-有教程涵盖了你所问的一切。