一步一步实现一个简单的OS(异常处理)

来源:互联网 发布:java long转int 编辑:程序博客网 时间:2024/06/06 01:33

简单的对IDT进行初始化,实现系统异常显示(MMU里面有大部分宏定义是抄“自己动手写操作系统里面的pm.inc文件中的”)

main.c/** * 内核入口 */int kmain(){// 这里,就显示个信息吧,简单些printf("in the kernel code\n");// 初始化,异常处理printf("init traps\n");init_traps();// 试试呗asm ("ud2");for(;;);}

traps.c// 初始化,异常处理void init_traps(){int i;for(i = 0; i < TRAPS_NUM; i++){set_gate(&sys_traps[i], KRNL_CODE_SEG_SEL, traps[i], KRNL_DPL, DA_386IGate);}// 装载idtlidt(sys_traps, sizeof(struct TrapDesc) * TRAPS_NUM - 1);}/** * 异常和中断处理函数 * 所有的异常和中断都会跳转到这里 */void trap(struct TrapFrame *trapFrame){printf("trap No: %s\n", err_description[trapFrame->trapno]);printf("cs:eip: 0x%x:0x%x\n", trapFrame->cs, trapFrame->eip);for(;;);}

trapsasm.S.text.set SEG_KDATA_SEL, 0x10 # 内核代码段选择符# 所有中断及异常的一级处理函数.globl alltrapsalltraps:# 构建异常帧结构pushl %dspushl %espushal# 切换到系统数据段movl $SEG_KDATA_SEL, %eaxmovw %ax, %dsmovw %ax, %es# 调用C语言异常处理函数# void trap(struct TrapFrame *trapFrame);pushl %espcall trapaddl $0x04, %esp# 异常返回.globl traprettrapret:popalpopl %espopl %dsaddl $0x08, %espiret

trapimport.S# 中断及异常入口,这样写是为了简单.text# 00 #DE: 除法错误(DIV/IDIV指令).globl trap0trap0:pushl $0pushl $0jmp alltraps# 01 #DB: 单步异常(调试异常) [任何代码或数据引用,或是INT 1指令].globl trap1trap1:pushl $0pushl $1jmp alltraps# 02 --: NMI中断 .globl trap2trap2:pushl $0pushl $2jmp alltraps# 03 #BP: 单步异常(调试异常) [INT 3指令].globl trap3trap3:pushl $0pushl $3jmp alltraps***********.data# 这里创建了一个数组,用来保存异常和中断的入口点.globl trapstraps:.long trap0.long trap1.long trap2.long trap3.long trap4.long trap5.long trap6.long trap7.long trap8.long trap9.long trap10.long trap11.long trap12.long trap13.long trap14.long trap15.long trap16.long trap17.long trap18.long trap19.long trap20.long trap21.long trap22.long trap23.long trap24.long trap25

详细代码到群里面找。。。。。。。。。

下面上图:


0 0
原创粉丝点击