水平有限,學的不深,不對之處,多多指教
本次實驗在實驗樓linux虛擬機器
環境進行。
本次實驗中,我們以20號系統呼叫getpid為例來熟悉系統呼叫過程。該函式的功能為:返回當前程序標識。
4通過編譯執行可以看到實驗結果,這裡得到的當前程序pid為7584。
下面我們用c語言中嵌入彙編**的方式來對getpid函式進行實驗。
**asm-getpid.c為:
1 #include2 #include3同樣的,對程式進行編譯執行,可以看到本次執行結果為2213。intmain()
4
在使用者態下通過api呼叫getpid()庫函式,產生乙個中斷,第一件事就是儲存現場,即把相應的暫存器的資料等壓棧,當中斷返回恢復現場的時候再講資料都出棧到對應的暫存器。
經過int 0x80陷入核心態 。
再通過system_call處理找到對應的服務例程。 這裡的傳遞了系統呼叫號0x14,即sys_getpid,然後執行相應的核心**。
在asm-getpid.c中,我們把0x14傳給eax暫存器是因為通過eax進行系統呼叫的傳參,表示相應的系統呼叫號。
這裡我們來詳細分析下其中的彙編**:
asm volatile(
「mov $0,%%ebx\n\t」
//先把初始化pid存到ebx暫存器中
「mov $0x14,%%eax\n\t」
//通過eax暫存器來進行系統引數的傳遞。把eax置為20,表示系統呼叫號為20,對應sys_getpid的中斷向量入口。
「int $0x80\n\t」
//在linux中執行int $0x80來執行系統呼叫。這裡具體為什麼這樣不太清楚,希望指點下。
「mov %%eax, %0\n\t」
//執行結束後再把eax的值傳給0號引數,即pid
:」=m」 (pid)
=m表示輸出到pid
執行結束後把系統呼叫返回的當前程序號複製給pid變數。
一些知識點:
1)使用者態和核心態:
當程式執行在3級特權級上時,就可以稱之為執行在使用者態,因為這是最低特權級,是普通的使用者程序執行的特權級,大部分使用者直接面對的程式都是執行在使用者態;反之,當程式執行在級特權級上時,就可以稱之為執行在核心態。
比如上面的**不能直接呼叫sys_getpid(),因為前者工作在使用者態,而sys_getpid()屬於核心態程式。
這時候就需要使用者態和核心態轉換,包括1)系統呼叫2)異常3)外圍裝置的中斷。其中系統呼叫是主動發起,後兩者是被動發起的。
2)系統呼叫的過程,可以先是使用者通過api,產生中斷,然後傳參呼叫不同種類的服務程式。
系統呼叫需要輸入輸出引數,一般通過ebx、ecx等暫存器傳值。當引數個數大於6個時,可以用某個暫存器指向某個記憶體,然後利用那一塊記憶體空間來進行值傳遞。
Linux 系統呼叫簡單了解
系統呼叫決定了作業系統是否好用,功能是否齊全。建立程序 fork 原程序叫父程序,新程序叫子程序。當父程序fork建立子程序時,採用寫時拷貝的方案。先是父子共用同一記憶體,如果有一方要寫資料,就會將該記憶體塊進行拷貝。然後再寫。fork可以根據返回值進行對父子程序的區分。子程序可以使用exec函式族...
四 系統呼叫示例
獲取輸出檔名 開啟輸入檔案 如果檔案不存在,出錯退出 建立輸出檔案 如果檔案存在,出錯退出 迴圈直到讀取結束 關閉輸出檔案 在螢幕顯示完成完成資訊 正常退出 這裡涉及到的系統呼叫是 define sys write 5 define sys read 6 define sys close 7 def...
了解linux下的系統呼叫
計算機系統的各種硬體資源是有限的,在現代多工作業系統上同時執行的多個程序都需要訪問這些資源,為了更好的管理這些資源程序是不允許直接操作的,所有對這些資源的訪問都必須有作業系統控制。也就是說作業系統是使用這些資源的唯一入口,而這個入口就是作業系統提供的系統呼叫。系統呼叫是屬於作業系統核心的一部分的,必...