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>