通過軟體中斷0x80,系統會跳轉到乙個預設的核心空間位址,它指向了系統呼叫處理程式(不要和系統呼叫服務例程相混淆),即在arch/i386/kernel/entry.s檔案中使用組合語言編寫的system_call函式。很顯然,所有的系統呼叫都會同一跳轉到這個位址進而執行system_call函式,那麼system_call函式又該如何派發它們到各自的服務例程呢?
軟中斷指令int 0x80執行時,系統呼叫號會被放進eax暫存器,同時,sys_call_table每一項占用4個位元組。這樣,system_call函式可以讀取eax暫存器獲得當前系統呼叫的系統呼叫號,將其乘以4天生偏移位址,然後以sys_call_table為基址,基址加上偏移位址所指向的內容即是應該執行的系統呼叫服務例程的位址。
另外,除了傳遞系統呼叫號到eax暫存器,假如需要,還會傳遞一些引數到核心,比如write系統呼叫的服務例程原型為: 呼叫write系統呼叫時就需要傳遞檔案描述符fd、要寫進的內容buf以及寫進位元組數count等幾個內容到核心。ebx、ecx、edx、esi以及edi暫存器可以用於傳遞這些額外的引數。
正如之前所述,系統呼叫服務例程定義中的asmlinkage標記表示,編譯器僅從堆疊中獲取該函式的引數,而不需要從暫存器中獲得任何引數。進進system_call函式前,使用者應用將引數存放到對應暫存器中,system_call函式執行時會首先將這些暫存器壓進堆疊。
對於系統呼叫服務例程,可以直接從system_call函式壓進的堆疊中獲得引數,對引數的修改也可以一直在堆疊中進行。在system_call函式退出後,使用者應用可以直接從暫存器中獲得被修改過的引數。
系統呼叫通過軟中斷0x80陷進核心,跳轉到系統呼叫處理程式system_call函式,並執行相應的服務例程,但由於是代表使用者程序,所以這個執行過程並不屬於中斷上下文,而是處於程序上下文。
linux 系統呼叫執行過程
簡單總結一下linux的系統呼叫過程 層次如下 使用者程式 c庫 即api int 0x80 system call 系統呼叫服務例程 核心程式 先說明一下,我們常說的使用者api其實就是系統提供的c庫。系統呼叫是通過軟中斷指令 int 0x80 實現的,而這條int 0x80指令就被封裝在c庫的函...
fork系統呼叫的執行過程
1.linux提供了三個系統呼叫用於建立程序,分別是fork,vfork,clone fork系統呼叫 核心採用寫時複製技術對傳統的fork函式進行了下面的優化.即子程序建立後,父子程序以唯讀的方式共享父程序的資源 並不包括父程序的頁表項 當子程序需要修改程序位址空間的某一頁時,才為子程序複製該頁....
Linux系統下可執行檔案的執行過程
1 首先,需要了解一下a.out這個目標檔案。a.out在linux下是elf executable linkable format 檔案格式,該目標檔案由乙個檔案頭 段 資料段 已初始化 從定位資訊區 符號表及符號名字字串構成,如下左圖所示,經過鏈結後生成執行檔案如下右圖所示,需要說明的是1 bs...