2018-2019-1 20189201 《LInux內核原理與分析》第五周作業
阿新 • • 發佈:2018-11-12
文件的 stdio.h 軟中斷 linux系統 穩定 出了 分析 應該 同時
甜死人的圖片
一、書本第四章知識總結【系統調用的三層機制(上)】
- 無參數系統調用
依次通過c語言和內嵌匯編的c語言實現time()函數中封裝的系統調用。 - 用戶態、內核態和中斷
- 用戶態:在低的執行級別下,代碼能夠掌控的範圍有所限制,只能訪問部分內存。
-內核態:在高的執行級別下,代碼可以執行特權指令,訪問任意的物理內存。
-中斷:從用戶態進入內核態的主要方式。
-中斷類別- 硬件中斷:在用戶態進程執行時,硬件中斷信號到來,進入內核態,就會執行這個中斷對應的中斷服務例程。
- 軟中斷:在用戶態進程執行過程中,調用了一個系統調用(一種特殊中斷),進入內核態。
- 用戶態:在低的執行級別下,代碼能夠掌控的範圍有所限制,只能訪問部分內存。
- 寄存器上下文切換
當用戶態切換到內核態時,就要把用戶態寄存器上下文保存起來,同時把內核態的寄存器的值放到當前CPU中。
int指令觸發中斷機制會在堆棧上保存一些寄存器的值,會保存用戶態棧頂地址、當時的狀態字、當時的CS:EIP的值。
同時會將內核態的棧頂地址、內核態的狀態字放入CPU對應的寄存器,並且CS:EIP寄存器的值會指向中斷處理程序的
入口,對於系統調用來說是指向system_call。int指令或中斷信號發生之後,第一件事就是保存現場,進入中斷處理程
序,執行SAVE_ALL。中斷處理程序結束後,中斷處理結束前的最後一件事是恢復現場,執行RESTORE_ALL。 - API和系統調用關系
- API:應用程序編程接口,只是函數定義。
- 系統調用:是通過軟中斷向內核發出了中斷請求,int指令的執行就會觸發一個中斷請求。
libc函數庫定義的一些API內部使用了系統調用的封裝例程,其主要目的是發布系統調用,使程序員在寫代碼時不需要
用匯編指令和寄存器傳遞參數來觸發系統調用。一個API可能只對應一個系統調用,亦可能內部由多個系統調用實現,
一個系統調用也可能被多個API調用。 - Intel x86 CPU定義了4種不同的執行級別0、1、2、3,數字越小特權越高。Linux系統采用了其中的0、3兩個特權級別。
- 寄存器相關知識點
- 系統調用通過系統調用號進行區分,通過EAX寄存器傳遞。
- 普通函數調用是通過將參數壓棧的方式傳遞的,而系統調用因為在用戶態和內核態下使用不同的堆棧,無法通過參數壓
棧的方式進行傳遞,而是通過比較特殊的寄存器傳遞參數的方式進行。 - 參數按照順序賦值給EBX、ECX、EDX、ESI、EDI、EBP,參數的個數不能超過6個,否則的話全部參數應該依次放在
一塊連續的內存區域裏,同時在寄存器EBX中保存指向該內存區域的指針。
二、實驗部分【使用庫函數API和C代碼中嵌入匯編代碼兩種方式使用同一個系統調用】
(1)代碼(系統調用write)
int write(int fd,const char *buf, off_t count)//fd為文件描述符,buf為寫緩沖區指針,count為寫入字節數 #include<stdio.h> int main() { char* c = "this is sys_write"; write(0,c,18); return 0; }
(2)嵌入匯編代碼調用系統調用
include<stdio.h>
int main()
{
char* c = "this is sys_write";
asm volatile (
"mov $0,%%ebx\n\t"//對應fd
"mov %0,%%ecx\n\t"//對應buf,也就是c
"mov $18,%%edx\n\t"//對應count
"mov $0x4,%%eax\n\t"//系統調用號為4
"int $0x80\n\t"
:
:"r"(c)
);
return 0;
}
或
int main()
{
char* c="this is sys_write";
asm volatile(
"mov $0,%%ebx\n\t"//對應fd
"mov $18,%%edx\n\t"//對應count
"mov $0x4,%%eax\n\t"//系統調用號為4
"int $0x80\n\t"
:
:"c"(c)//直接將輸入存入ecx
}
三、實驗收獲
1. 小總結
這一節主要通過實驗,了解了系統如何進行系統調用的,加深了對內核態和用戶態的理解。操作系統平常工作都在
用戶態當中,當用戶態需要操作一些內核數據時,才會通過系統調用進入內核態,而這些系統調用都是操作系統本
身實現了,用戶無法修改。可以看出通過這種方式,操作系統實現了對關鍵數據的保護,從而維護了系統的高效穩定運行。
2. link分為兩種類型:
- 硬連接指通過索引節點來進行連接。在Linux的文件系統中,保存在磁盤分區中的文件不管是什麽類型都給它分配一個編號,
稱為索引節點號(Inode Index)。在Linux中,多個文件名指向同一索引節點是存在的。一般這種連接就是硬連接。硬連接的作用
是允許一個文件擁有多個有效路徑名,這樣用戶就可以建立硬連接到重要文件,以防止“誤刪”的功能。其原因如上所述,因為對
應該目錄的索引節點有一個以上的連接。只刪除一個連接並不影響索引節點本身和其它的連接,只有當最後一個連接被刪除後,
文件的數據塊及目錄的連接才會被釋放。也就是說,文件真正刪除的條件是與之相關的所有硬連接文件均被刪除。 - 另外一種連接稱之為符號連接(Symbolic Link),也叫軟連接。軟鏈接文件有類似於Windows的快捷方式。它實際上是一個特
殊的文件。在符號連接中,文件實際上是一個文本文件,其中包含的有另一文件的位置信息。
2018-2019-1 20189201 《LInux內核原理與分析》第五周作業