---恢复内容开始---
一 视频知识 1 linux系统下如何区分内核态与用户态 在内核态:cs:eip可以是任意的地址,4G的内存地址空间 在用户态:cs:eip只能访问0x00000000—0xbfffffff的地址空间 2 系统调用的三层皮:xyz、system_call和sys_xyz 第一层:API,第一层是指Libc中定义的API,这些API封装了系统调用,使用int 0x80触发一个系统调用中断;当然,并非所有的API都使用了系统调用,如完成数学加减运算的API就没有使。用系统调用;也有可能某个API使用了多个系统调用;这一层存在的价值就是为应用程序员提供易于使用的API来调用系统调用; 第二层:中断向量对应的,运行于内核态。system_call是所有系统调用在内核的入口点,在其中的开始处保护用户态程序执行上下文,结束处恢复用户态程序执行上下文,在中间根据传入的系统调用号对应的中断服务程序; 第三层:sys_xyz 系统调用封装例程:执行具体的系统调用操作,完成用户的系统调用请求;系统调用有不同种类的服务程序 二 测试实验2 1 首先用mdkir 9225 新建文件夹,cd 9225进入此目录下,使用命令vi main.c进入vim环境中编写main.chanshu代码 ![](http://images2017.cnblogs.com/blog/1249774/201710/1249774-20171030010952027-257063477.png)2 使用命令gcc -S -o main.s main.c -m32其意义是将预处理文件编成.s文件,也就是将c代码转换成汇编代码。使用命令gcc -g main.s -o main -m32,然后使用命令gdb main 进入gdb调试状态
3 在gdb中使用l指令观察函数,但出现了理解不了的乱码。继续向下操作设置断点使用命令b*main 或者 break main,然后使用命令r使其运行一下,使用i r命令查看函数的exp eax ebp eip,观察函数变化,之后重复使用命令n,意为查看下一条运行命令,再使用命令i r,以此下去但是不知道为什么函数运算一直出错
三 课本知识
通过阅读第七章我了解到了什么是中断,并知道了中断一般分为异步中断(一般由硬件引起)和同步中断(一般由处理器本身引起)。
异步中断:CPU处理中断的时间过长,所以先将硬件复位,使硬件可以继续自己的工作,然后在适当时候处理中断请求中耗时的部分
同步中断:CPU处理完中断请求的所有工作后才反馈硬件。同步中断应该处理能很快完成的一种中断。
中断相关函数
实现一个中断,主要需要知道3个函数:(1)注册中断的函数(2)释放中断的函数(3)中断处理程序的声明
中断处理的过程主要涉及3函数:
do_IRQ 与体系结构有关,对所接收的中断进行应答
handle_IRQ_event 调用中断线上所有中断处理
ret_from_intr 恢复寄存器,将内核恢复到中断前的状态
中断处理程序会异步执行,并且在最好的情况下它也会锁定当前的中断线。最起码的,中断处理程序要负责通知硬件设备中断已被接收,操作系统也把处理硬件中断的过程分为两个部分。
上半部分(top half)简单快速,执行的时候禁止一些或者全部中断。只能通过中断处理程序实现。只做有严格时限的工作。
下半部分(bottom half)稍后执行,而且执行期间可以响应所有的中断。
这周将时间放在了测试二中,我用命令gcc -g main.c按照链接中的也没有做出来,实验四我下周会补上的,我会在下周将作业努力好好完成