从kernel.bin中根据elf文件格式执行内核
加载kernel.bin步骤和加载loader.bin步骤一样,将kernel.bin加载到内存后,
因为kernel的编译参数-Ttext 0x30400
指定了程序入口(可以在/boot/include/load.inc
中修改,并且修改kernel编译参数-Ttext
就能加载到自己指定的内存地址处).
因为**kernel被编译成elf格式,而非纯二进制,那么根据elf格式在把kernel程序段加载到内存中(program header中指定了,本书并未选择作内存映射,而是直接根据编译结果),**如果是纯二进制的话,也是应该加载到内存并且找到kernel执行入口处,控制转移就行了
此时esp和GDT还在loader中
把IDT和GDT以及一些全局变量定义在global.c
中
gcc编译除去内建函数
就是自己写的函数和printf这种函数重名,指定编译参数来避免冲突,不包含内建函数(内)
int printf(int i);
int printf(int i)
{return i;
}
int main()
{return printf(10);
}
gcc默认选项是built-in function
,指定-fno-builtin
或者只需要指定某个函数名-fno-builtin-printf
,解决冲突gcc -fno-builtin test.c -o test
kernel的主要作用就是和c一起设置GDT和IDT,
内核-添加中断:
整体思路:在kernel.asm中编写每个中断处理例(因为 门描述符 需要偏移地址,),其他的函数通过c编写,添加cpu中断异常(每个单独写) -> 8259A15个硬件中断(nasm宏实现) -> 向8259A写OCW开启键盘中断测试
在内核完善中断时,因为门描述符填充处理例程的物理地址(平坦模式),在kernel/kernel.asm中写基本中断能够确定中断函数所在位置(kernel开头处),填IDT中例程偏移地址和disp交给c来做
kernel/