操作系統-中斷(3)系統調用


系統調用:操作系統的程序接口
操作系統實現的完成某種特定功能的過程;為所有運行程序提供訪問操作系統的接口
用戶程序如何陷入操作系統,請求操作系統為其服務,需要一個硬件處理機制陷入處理機制:計算機系統中控制和實現系統調用的機制
陷入指令:也稱訪管指令,或異常中斷指令,計算機系統為實現系統調用而引起處理器中斷的指令。每個系統調用都事先規定了編號,並在約定寄存器中規定了傳遞給內部處理程序的參數
系統調用的實現要點:
  • 編寫系統調用處理程序
  • 設計一張系統調用入口地址表,每個入口地址指向一個系統調用的處理程序,並包含系統調用自帶參數的個數
  • 陷入處理機制需開辟現場保護區,以保存發生系統調用時的處理器現場
Linux提供了幾百種系統調用,主要分為以下幾類:
進程控制、文件操作、文件系統操作、系統控制、內存管理、網絡管理 、用戶管理、進程通信等
系統調用號是系統調用跳轉表索引值,跳轉表給出系統調用服務例程首址
通常,系統調用被封裝成用戶程序能直接調用的函數,如exit()、read()和open(),這些是標准C庫中系統調用對應的封裝函數 。
Linux中系統調用所用參數通過寄存器傳遞,若參數個數超出寄存器個數,則將需傳遞參數塊所在內存區首址放在寄存器中傳遞(除調用號以外,最多6個參數)。傳遞參數的寄存器順序依次為:EAX(調用號)以及最多6個參數EBX、ECX、EDX、ESI、EDI和EBP。
返回參數為整數值:正數或0表示成功,負數表示出錯碼
封裝函數對應的機器級代碼有一個統一的結構:總是若干條傳送指令后跟一條陷阱指令(如int $0x80)。
傳送指令用來傳遞系統調用的參數,陷阱指令用來陷入內核進行處理。
例如,若用戶程序調用系統調用write(1, “hello, world!\n”,14),將字符串“hello, world!\n”中14個字符顯示在標准輸出設備文件stdout上,則其封裝函數對應機器級代碼(用匯編指令表示)如下:
movl  $4, %eax       //調用號為4,送EAX
movl  $1, %ebx       //標准輸出設備stdout的文件描述符為1,送EBX 
movl  $string, %ecx  //字符串“hello, world!\n”首址送ECX 
movl  $14, %edx     //字符串的長度為14,送EDX
int   $0x80         //系統調用
 
軟中斷指令int $0x80的執行過程:
它是陷阱類(編程異常)事件,因此它與異常響應過程一樣。
1)    將IDTi(i=128)中段選擇符(0x60)所指GDT中的內核代碼段描述符取出, 其DPL=0,此時CPL=3(因為int $0x80指令在用戶進程中執行),因而CPL>DPL且IDTi 的 DPL=CPL,故未發生13號異常。
2)    讀 TR 寄存器,以訪問TSS,從TSS中將內核棧的段寄存器內容和棧指針裝入SS和ESP; 
3)    依次將執行完指令int $0x80時的SS、ESP、EFLAGS、CS、EIP的內容(即斷點和程序狀態)保存到內核棧中,即當前SS∶ESP所指之處; 
4)    將IDTi(i=128)中段選擇符(0x60)裝入CS,偏移地址裝入EIP。這里,CS:EIP即是系統調用處理程序system_call(所有系統調用的入口程序)第一條指令的邏輯地址。
通過快速系統調用指令進入和退出系統調用:
執行int $0x80需一連串的一致性和安全性檢查,因而速度較慢。從Pentium II開始,Intel增加了三個特殊的MSR寄存器,引入了快速系統調用指令sysenter和sysexit,分別用於從用戶態到內核態、從用戶態到內核態的快速切換。
  • YSTEM_CS_MSR: 存放內核代碼段的段選擇符。
  • YSTEM_EIP _MSR: 存放內核中系統調用處理程序的起始地址。 
  • YSTEM_ESP _MSR: 存放內核棧的棧指針。
執行sysenler指令時,CPU將SYSTEM_CS_MSR、SYSTEM_EIP_MSR和SYSTEM_ESP_MSR的內容分別復制到CS、EIP和ESP,同時將SYSTEM_CS_MSR的內容加8的值設定到SS。因此,CPU執行完sysenter指令,即可切換到內核態,並開始執行系統調用處理程序的第一條 指令。
MSR寄存器的內容只能通過特權指令rdmsr和wrmsr進行讀寫。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM