1、系统中可能的每种类型的异常都分配了一个惟一的非负整数的异常号(exception number)。这些号码中的某一些是由处理器的设计者分配的,其他号码是由操作系统内核的设计者分配的。前者如:除0项,缺页,存储器访违例,断点,算术溢出;后者的示例包括系统调用和来自外部I/O设备的信号。
在系统启动时,OS分配的初始化一张称为异常表的跳转表,使得表目k包含异常k的处理程序的地址。
2、如果控制从一个用户程序转移到内核,所有这些项目(item)都被压到内核栈中,而不是压到用户栈中。
异常处理程序运行在内核模式下,这意味着它们对所的资源都有完全的访问权限。
3、现代OS把这些突发改变(abrupt changes)称为异常,如中断。
4、异常的类别
Exceptions can be divided into four classes: interrupts, traps, faults, and aborts.
注:Anync(异步),Sync(同步)
异步异常是由处理器外部的IO设备中的事件产生的,同步异常是执行一条指令的直接产物。
1)陷阱(trap)
陷阱是有意的异常,是执行一条指令的结果。最重要的用途是在用户程序和内核之间提供一个像过程一样的接口,叫做系统调用。
用户程序经常需要向内核请求服务,如读read,创建新进程fork,加载一个新程序execve,终止当前进程exit。
从程序员角度看,系统调用和普通函数调用一样。实际他们实现不同。普通函数调用运行在user mode,用户模式限制了函数可以执行的指令类型,而且它们只能访问与调用函数相同的栈;系统调用发生在kernel mode,内核模式允许系统调用执行指令,并访问定义在内核中的栈。
2)故障(Fault)
故障的一个经典示例是缺页异常。
5、上下文(context)是由程序正确运行所需的状态组成的。这个状态包括存放在存储器中的程序的代码和数据,它的栈,它的通用目的寄存器的内容,它的程序计数器,环境变量,及打开文件描述符的集合。
PC(程序计数器)值的序列称为逻辑控制流。多任务也叫时间分片(time slicing)。
6、查看系统调用
Linux提供了160个系统调用,man syscalls查询。
man 2 info 得到_syscall宏;可以直接调用任何“系统调用”。
7、操作进程的工具
STRACE: Prints a trace of each system call invoked by a program and its children。
Compile your program with -static to get a cleaner trace without a lot of output
related to shared libraries.
PS: Lists processes (including zombies) currently in the system.
TOP: Prints information about the resource usage of current processes.
KILL: Sends a signal to a process.
/proc : A virtual filesystem that exports the contents of numerous kernel data
structures in an ASCII text form that can be read by user programs. For example, type
"cat /proc/loadavg" to see the current load average on your Linux system.
<Computer Systems:A Programmer's Perspective>