1.接口是什么?
接口就是插座,將信號進行轉換,屏蔽細節,抽象表現.
對于計算機而言,接口就是一些重要的函數調用,你比如fork()調用cpu,open()打開文件.但是又因為是系統提供的,所以叫做系統調用.
2.我們怎么使用計算機的呢?
三種方式:
a:命令行-linux--
什么是命令?---一段程序而已,不過是一個特殊的命令,比如shell:
不斷等待用戶輸入,然后一旦輸入,調用cpu執行指令,返回參數.
b:圖形化界面--windows
什么是GUI?--簡單的說就是一個消息循環中斷機制,不斷從內核中提取中斷信息,抓出來一個一個進行消息處理,執行相應的消息處理函數.
c:應用程序:ppt,word
3.具體的調用是怎樣的呢?
一個標準:POSIX-Portable Operation System Interface Of Unix
也就是一個表罷了,比如任務處理-fork-創建進程,pthread_create-創建一個線程,execl-運行可執行文件;文件系統-open-打開文件.
4.系統調用具體過程:--提供進入內核的方法:
a:直觀想法:既然系統調用函數和main.c在同一內存中,那直接調用不就行了么,搞這么麻煩?
------想的很好,但是嚴重忽略了外來調用有可能產生的信息泄露,cpu資源吃緊等問題.
b:怎么不讓jump,move執行的呢?
---顯然必須是硬件設計--內存分割為多個區域:內核態,用戶態.
在內存中對應的,內核態-內核段,用戶態-用戶段.
q1:如何標識這兩個狀態呢?
段寄存器:DPL,CPL(CS),RPL(DS)-目標特權段,現在特權段.
cs:后兩位標識-if 0-內核態,if 3-用戶態.
那么條件出來了:
DPL>=CPL,YOU CAN GET IN.
驗證可以知道正確,這將用戶程序和內核程序隔離開了.
具體操作系統完成過程:
head.s----建立GDT--DPL=0---cs:CPL=3----CPL=3>DPL=0,所以不能進入內核態.
c:要想進入內核態怎么辦呢?
-------唯一的辦法:中斷
用戶程序通過int 0x80 中斷指令唯一進入內核態,具體操作是用戶程序中包含int 0x80指令,然后OS寫中斷處理,調取編號(想想為什么?)-----然后根據編號執行系統調用.
實現示例:
調用printf(......)------ppt
庫函數printf(.....)-------c語言函數庫
庫函數write(......)----調用宏--轉化printf格式,加入int 0x80中斷
系統調用write(......)------OS內核
write:
define _systemcall_
.........
... int 0x80 (宏);"=a"(_res):"(_NR_##name)-----NR_write也就是系統調用號,放在eax中.
##int 0x80中斷----查找IDT表查找中斷處理函數執行后跳回來,初始化中斷處理函數--DPL=3 so CPL=3 用戶代碼進來----跳入80號中斷---CS=8,IP=systemcall--CPL=0跳入內核態執行.
總結:
STEP1.用戶態:
printf用戶調用------int0x80中斷 DPL=CPL=3
STEP2.內核態:
systemcall中斷處理 CPL=0--------查表systemcall_table找到編號--即_NR_table=4-------調用system執行代碼.