一步一步实现一个简单的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
- 一步一步实现一个简单的OS(异常处理)
- 一步一步实现一个简单的OS(HelloWorld)
- 一步一步实现一个简单的OS(先小装一下)
- 一步一步实现一个简单的OS(环境搭建)
- 一步一步实现一个简单的OS(进入保护模式)
- 一步一步实现一个简单的OS(加载内核)
- 一步一步实现一个简单的OS(时钟中断)
- 一步一步实现一个简单的OS(初始化GDT)
- 一步一步实现一个简单的OS(试验任务切换)
- 一步一步实现一个简单的OS(任务切换)
- 一步一步实现一个简单的OS(简单的让boot加载setup)
- 一步一步教你使用CGI实现一个简单的后门
- 一步一步教你使用CGI实现一个简单的后门
- 异常的简单处理
- 简单的异常处理
- try ... ctach异常处理的一个简单实例
- Symbian OS的C++异常处理
- Symbian OS的C++异常处理
- 匿名内部类!!!
- Oracle绿色客户端(Instant Client)配置方法
- Umeng友盟分享纯图片到微信
- unity3d学习笔记(十一)-NGUI结合Shader制作小map
- custom HID代码分析(一) 报文描述符
- 一步一步实现一个简单的OS(异常处理)
- iOS 免费后台系统 Bmob平台
- iOS应用架构谈(一):架构设计的方法论
- linux ACL
- ASP.NET Web API中如何传递参数
- JavaScript的相关内容
- Servlet_02:基础知识
- android 饼状报表的 简化动画 使用简单 注解我基本加上了
- Python3.3 学习笔记 20160309