【第6章】模仿MINIX的中断处理【二】
来源:互联网 发布:linux文件权限修改 编辑:程序博客网 时间:2024/05/29 14:35
好了,完成了上面的工作,下一步的工作的什么呢,MINIX还把当前进程的寄存器组压栈的工作,以及判断是否发生中断重入的工作,还有切换内核栈的工作都放到了一个函数当中,并且在时钟中断处理程序的开始处调用了这个函数,那么必定在当前进程的PCB中压入的调用函数指令的下一条指令的相对偏移地址,那么PCB中又多了一个字段,就是这个相对偏移地址,那么我们就修改一下PCB的定义:
- typedef struct s_stack_frame
- {
- u32 gs;
- u32 fs;
- u32 es;
- u32 ds;
- u32 edi;
- u32 esi;
- u32 ebp;
- u32 kernel_esp;
- u32 ebx;
- u32 edx;
- u32 ecx;
- u32 eax;
- u32 retaddr;
- u32 eip;
- u32 cs;
- u32 eflags;
- u32 esp;
- u32 ss;
- }Stack_Frame;
那么下面就来修改时钟中断处理程序:
HW_Int_00:
call Save
mov al,20h
out 20h,al
sti
mov eax,0dh
push eax
push Int_Msg
call Disp_Color_Str
add esp,8
call Clock_Handler
cli
ret
...
Save:
pushad
push ds
push es
push fs
push gs
mov dx,ss
mov ds,dx
mov es,dx
mov eax,esp
inc dword [Is_Reenter]
cmp dword [Is_Reenter],0
jne .1
mov esp,Top_Of_Stack
push restart
jmp [eax + 48]
.1:
push reenter
jmp [eax + 48]
我们看到,添加了一个Save函数,一般的函数最后都会有个ret指令跳回到调用处的下一条指令处继续执行。但是这里用的是jmp,这是由于返回地址在PCB中保存的,而在时钟中断处理程序中切换到了内核栈,ret找不到返回地址,况且如果发生中断重入的话,返回地址保存在内核栈中。那就很混乱了,所以我们要以一种统一的方法来解决,先把esp送eax,再由eax找到返回地址,最后直接跳转过去。
编译运行,哪。。哪尼,出错了,哦哦,原来是在PCB中新添加的那个字段搞的鬼,修改一下:
restart:
mov esp,[p_Resume_PCB]
lea dword eax,[esp + 72]
mov [tss + 4],eax
mov ax,[esp + 72]
lldt ax
reenter:
dec dword [Is_Reenter]
pop gs
pop fs
pop es
pop ds
popad
add esp,4
iretd
好了,搞定了Save函数,让我们再来进一步修改中断处理程序。我们不想让时钟中断打断时钟中断,就是要去开中断之前屏蔽掉时钟中断,关中断之后开启时钟中断,来修改一下:
HW_Int_00:
call Save
mov al,20h
out 20h,al
in al,21h
or al,1
out 21h,al
sti
mov eax,0dh
push eax
push Int_Msg
call Disp_Color_Str
add esp,8
call Clock_Handler
cli
in al,21h
and al,0feh
out 21h,al
ret
编译运行,依旧的画面。
- 【第6章】模仿MINIX的中断处理【二】
- 【第6章】模仿MINIX的中断处理【一】
- 【第6章】模仿MINIX的中断处理【三】
- 《自己动手写操作系统第六章》引入minix中断处理方式
- 第6章 中断与中断处理
- 第6章:中断和中断处理程序--学习笔记
- 【第6章】丰富中断处理程序
- 笔记二:从动态和静态,跟踪Minix中断过程
- ARM中断分析之二:裸机下面的中断处理
- ARM中断分析之二:裸机下面的中断处理
- ARM中断分析之二:裸机下面的中断处理
- LDD3学习-第十章-中断处理<二>
- 中断与中断处理(二)
- 处理不可中断的阻塞(java并发编程第7章)
- 第6天 分割编译与中断处理
- 第9章 设置ISR(中断处理函数)
- LDD3读书笔记(第7章 中断处理)
- 中断子系统(6)中断嵌套的处理
- 《程序员羊皮卷》走进Tech?Ed2009
- java中使用正则表达式(2)
- 刚上初中的时候,老师问我的一道题
- 排序算法——堆排序(递归版本)
- 大学计算机课程学习路线2
- 【第6章】模仿MINIX的中断处理【二】
- 《冒号课堂》连载之九——并发范式:合作与竞争
- 利用Ajax对客户端页面的动态增删改查
- 答案_最大公约数问题
- 在定位中追寻成功
- 运行在浏览器上的操作系统
- 实用程序工具包(用户自制的头文件)
- 第二届C++技术大会@ 上海 - 我觉得可以去看看
- 为gridview“删除”列添加确认对话框