当前位置: 代码迷 >> 综合 >> Orange‘s:loader->kernel以及添加基本中断异常
  详细解决方案

Orange‘s:loader->kernel以及添加基本中断异常

热度:76   发布时间:2024-01-30 02:25:56.0

从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/

  相关解决方案