1. 用 C 语言写内核
int main(void){
while(1);
return 0;
}
最最简单、没有实用的内核。咱们的目的是加载内核并初始化内核。所以内核不需要太复杂。
用 gcc 编译器:
gcc -c -o main.o main.c //编译汇编到目标代码,不进行链接。
ld 进行链接程序,指定可执行程序的起始虚拟地址。
ld main.o -Ttext 0xc0001500 -e main -o kernel.bin
最终生成的 kernel.bin 可执行文件,是一个 elf 文件。起始虚拟地址指定为0xc0001500。
把 kernel.bin 写到虚拟硬盘文件的第 9 个扇区。写100 KB,因为以后内核的体积会越来越大。
dd if=kernel.bin of=路径/hd60M.img bs=512 count=200 seek=9 conv=notrunc
此时,内核准备好了,也到硬盘中了,接下来该加载到内存中了。
2. 加载内核
加载内核是 loader 的工作。所以进一步修改 loader.S。
加载内核可以在分页之前,也可以在分页之后。为了简单,就在启用分页之前吧,使用的地址是物理地址,不是虚拟地址。
咱们把它放在低 1MB 的空间里。再看一下低 1MB 的内存布局。