簡單總結一下linux的系統呼叫過程:
層次如下:
使用者程式------>c庫(即api):int 0x80 ----->system_call------->系統呼叫服務例程-------->核心程式
先說明一下,我們常說的使用者api其實就是系統提供的c庫。
系統呼叫是通過軟中斷指令 int 0x80 實現的,而這條int 0x80指令就被封裝在c庫的函式中。
(軟中斷和我們常說的硬中斷不同之處在於,軟中斷是由指令觸發的,而不是由硬體外設引起的。)
int 0x80 這條指令的執行會讓系統跳轉到乙個預設的核心空間位址,它指向系統呼叫處理程式,即system_call函式。
(注意:!!!系統呼叫處理程式system_call 並不是系統呼叫服務例程,系統呼叫服務例程是對乙個具體的系統呼叫的核心實現函式,而系統呼叫處理程式是在執行系統呼叫服務例程之前的乙個引導過程,是針對int 0x80這條指令,面向所有的系統呼叫的。簡單來講,執行任何系統呼叫,都是先通過呼叫c庫中的函式,這個函式裡面就會有軟中斷 int 0x80 語句,然後轉到執行系統呼叫處理程式 system_call ,
system_call 再根據具體的系統呼叫號轉到執行具體的系統呼叫服務例程。)
system_call函式是怎麼找到具體的系統呼叫服務例程的呢?通過系統呼叫號查詢系統呼叫表sys_call_table!軟中斷指令int 0x80執行時,系統呼叫號會被放入 eax 暫存器中,system_call函式可以讀取eax暫存器獲取,然後將其乘以4,生成偏移位址,然後以sys_call_table為基址,基址加上偏移位址,就可以得到具體的系統呼叫服務例程的位址了!
然後就到了系統呼叫服務例程了。需要說明的是,系統呼叫服務例程只會從堆疊裡獲取引數,所以在system_call執行前,會先將引數存放在暫存器中,system_call執行時會首先將這些暫存器壓入堆疊。system_call退出後,使用者可以從暫存器中獲得(被修改過的)引數。
另外:系統呼叫通過軟中斷int 0x80陷入核心,跳轉到系統呼叫處理程式system_call函式,然後執行相應的服務例程。但是由於是代表使用者程序,所以這個執行過程並不屬於中斷上下文,而是程序上下文。因此,系統呼叫執行過程中,可以訪問使用者程序的許多資訊,可以被其他程序搶占,可以休眠。
當系統呼叫完成後,把控制權交回到發起呼叫的使用者程序前,核心會有一次排程。如果發現有優先順序更高的程序或當前程序的時間片用完,那麼會選擇優先順序更高的程序或重新選擇程序執行。
LINUX下系統呼叫執行過程
通過軟體中斷0x80,系統會跳轉到乙個預設的核心空間位址,它指向了系統呼叫處理程式 不要和系統呼叫服務例程相混淆 即在arch i386 kernel entry.s檔案中使用組合語言編寫的system call函式。很顯然,所有的系統呼叫都會同一跳轉到這個位址進而執行system call函式,那...
fork系統呼叫的執行過程
1.linux提供了三個系統呼叫用於建立程序,分別是fork,vfork,clone fork系統呼叫 核心採用寫時複製技術對傳統的fork函式進行了下面的優化.即子程序建立後,父子程序以唯讀的方式共享父程序的資源 並不包括父程序的頁表項 當子程序需要修改程序位址空間的某一頁時,才為子程序複製該頁....
Linux系統呼叫過程
linux系統分為核心空間和使用者空間 應用程式通過引發乙個異常來促使系統切換到核心狀態 去執行系統呼叫的處理函式 對於ia 32體系 通過int 0x80指令觸發該中斷 具體可參考gun庫 sysdeps unix sysv linux arch syscall.s 當系統呼叫 open read...