1. 程式人生 > >2018-2019-1 20189201 《LInux內核原理與分析》第五周作業

2018-2019-1 20189201 《LInux內核原理與分析》第五周作業

文件的 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內核原理與分析》第五周作業