前言:
这一个星期抓紧时间,把《深入理解计算机系统》给完全看完了,感觉很多以前感到迷惑的地方都已经彻底的解决了。这本书真是一本好书。现在把每一个章节做一个总结,让自己的印象更深刻。
我的github:
我实现的代码全部贴在我的github中,欢迎大家去参观。
https://github.com/YinWenAtBIT
第八章:异常控制流
定义:
异常控制流(ECF)是计算机用来应对系统变化做出的指令转移。它发生在计算机的各个层次,硬件层,操作系统层,应用层都可以发生。
一、理解ECF的好处:
1.帮助理解重要的系统概念:
ECF是操作系统用来实现I/O,进程和虚拟存储器的基本机制。
2.理解应用程序时如何与操作系统交互的:
应用程序通过一个叫做陷阱或者系统调用的ECF形式,向操作系统请求服务。
3. 理解ECF将帮助于编写有趣的程序:
操作系统为应用程序提供了强大的ECF机制,可以用来创建新进程,等待进程终止,通知其他进程等功能。
4. 理解ECF有助于理解并发:
ECF是计算机实现并发的基本机制,中断应用程序,进程和线程执行的异常处理程序和中断应用程序都是运行中并发的例子
5. 理解ECF帮助理解软件异常如何工作:
通过try, cathc等完成非本地转跳。
异常:
1. 通过异常表进行转跳:
通过一个间接的过程调用,到一个专门设计用来处理这类事件的操作系统子函数,异常处理程序。
2. 异常处理完后:
a. 处理程序将控制返回给当前指令I,即事件发生时正在执行的指令。
b. 处理程序将控制返回给下一条指令Inext,即没有异常发生将会执行的下一条指令。
c. 处理程序终止被中断的程序。
二、异常 处理:
1.系统为每种类型的异常都分配了一个唯一的非负的异常号:
通过异常号和异常表的结合查询,就可以得到要执行异常处理的代码地址。异常代码转跳的流程与子函数转跳流程相似。
2. 异常处理程序运行在内核模式下:
拥有对所有系统资源的完全访问权限
三、异常类别:
1. 中断:
中断是异步发生的,来自处理器外部的I/O设备信号的结果。硬件中断的处理程序通常叫做中断处理程序。完成处理程序后,将控制返回到下一条指令
2. 陷阱和系统调用:
陷阱是有意的异常,是执行一条指令的结果。陷阱处理程序将控制返回到下一条指令。
陷阱最重要的用途是在用户程序和内核之间提供一个像过程一样的接口,叫做系统调用。
从程序员的角度看,系统调用和普通函数调用时一样的,然后他们的实现是非常不同的,普通的函数运行在用户模式中,用户模式限制了函数可以执行的指令类型,而且只能访问与调用函数相同的栈。
系统调用运行在内核模式中,内核模式允许系统调用执行指令,并访问定义在内核中的栈。
3. 故障:
故障由错误情况引起,它可能被故障处理程序修正。如果故障处理程序能够修复这个错误情况,那么控制返回到引起故障的指令,并重新执行它,否则故障处理程序返回到内核的abort例程,终止引起故障的应用程序。
一个典型的故障例子时缺页异常。当指针引用一个虚拟地址,而与该地址对应的物理页面不再存储器中,因此必须从磁盘中取出,就会发生故障。缺页处理程序从磁盘中加载适当的页面,然后将控制返回给引起故障的指令。再次执行指令时,相应的物理页面就已经驻留在存储器中了。
4. 终止:
终止是不可恢复的致命错误造成的结果,通常是一些硬件错误,比如DRAM或者SRAm位被损坏时的奇偶错误。终止错误返回给abort例程,会终止这个应用程序。
四、系统中的常见异常:
1.除法错误:
除以0时会发生除法错误,错误一般会终止程序。
2. 一般保护故障:
通常是因为一个程序引用了一个未定义的虚拟存储器区域,或者程序试图写一个只读文本段,这也会导致程序终止。Linux外壳通常把这种保护故障报告为“段故障”(Segmentation Fault)
3. 缺页:
如上所述,缺页处理程序会让指令请求的虚拟存储器内容被加载到对应的物理内存中,然后重新执行指令。
4. 机器检查:
机器检查是在导致故障的指令执行中检测到致命的硬件错误时发生的。会终止程序。
进程:
一、定义:
经典定义:
一个执行中的程序实例,每个程序都是运行在某个进程的上下文中的。包括:存储器中的程序代码和数据,栈,通用目的寄存器,程序计数器,环境变量已经打开的文件描述符的集合。
二、系统调用错误处理,进程控制:
1.fork函数, getpid getppid exit wait waitpid:
这个就不详细说了,参见unp或者apue上说的更详细。
2. execve 函数:
执行另一个程序,可以传递参数与环境变量,同样详见apue。
三。信号:
信号处理程序同样与apue中相同,在这里就不再复述了。
总结: