1. 程式人生 > >跟蹤分析Linux5.0.2內核系統調用的過程

跟蹤分析Linux5.0.2內核系統調用的過程

原創 接口 src str 好的 轉載 發布系統 target 控制

鐘偉

學號515,後三位(原本以為找學號後三位的API,,,,結果沒找到。。原來是用後兩位15--chmod()

原創作品 轉載請註明出處 + 《Linux內核分析》MOOC課程:

http://mooc.study.163.com/course/USTC-1000029000


實驗內容:

實驗內容分為兩部分:

1.成功編譯linux5.0.2內核

2.選擇自己學號後兩位的系統調用進行跟蹤分析:


一、編譯linux5.0.2內核

由於感覺實驗樓的機器編譯內核會非常非常慢,於是采用自己的另外一臺電腦(不是虛擬機),可能因此遇到的問題比較少,基本上都是依賴的安裝

技術分享圖片

安裝過程就不詳細說了,linux內核編譯可以參考這裏:

https://blog.csdn.net/zhaogang1993/article/details/79514344

二、選擇一個系統調用進行分析

1.首先選擇學號後兩位的系統調用函數:(學號xxx515)

技術分享圖片

2.然後從孟寧老師的GitHub下載調用系統函數time()的示例,參考鏈接:

https://github.com/mengning/menu

3.然後修改下載的示例,改為自己選擇的系統函數(由於不同系統函數參數設置不一樣需要查閱一下相關資料確定選擇函數的參數)

技術分享圖片

4.編譯運行

技術分享圖片

三、實驗代碼以及過程分析

系統調用

操作系統為用戶態進程與硬件設備進行交互提供了一組接口——系統調用 :

    1.把用戶從底層的硬件編程中解放出來

    2.極大的提高了系統的安全性

    3.使用戶程序具有可移植性

API調用:

應用編程接口(Application program interface,API)和系統調用是不同的

    API只是一個函數定義

    系統調用通過軟中斷向內核發出一個明確的請求

Libc庫定義的一些API引用了封裝例程(wrapper routine,唯一目的就是發布系統調用)

    一般每個系統調用對應一個封裝例程
    庫再用這些封裝例程定義出給用戶的API
不是每個API都對應一個特定的系統調用
    API可能直接提供用戶態的服務

      如,一些數學函數
    一個單獨的API可能調用了幾個系用調用
    不同的API可能調用同一個系統調用

1.使用庫函數:

1 int Chmod()
2 {
3     int number = 0;
4     char* filename = "zhongwei2";
5     mode_t mode = 0755;
6     number = chmod(filename,mode);
7     printf("file %d own all permissions\n",number);
8     return 0;
9 }

chmod函數有兩個參數,第一個是文件名,第二個是權限,0755表示文件所有者可讀可寫可執行,文件所有者所在組他行,其用戶可讀可執行

2.使用C語言內嵌匯編帶碼實現:

 1 int ChmodAsm()
 2 {
 3     int number = 0;
 4     char* filename = "zhongwei2";
 5     mode_t mode = 0755;
 6     asm volatile(
 7         "movl $0xf,%%eax\n\t" //把系統待用的進程號15,壓入eax
 8         "int $0x80\n\t" //系統調用開始
 9         "movl %%eax,%0\n\t"  
10         : "=m" (number) 
11         :"b"(filename), "c"(mode)
12     );
13     printf("file %d own the all permissions\n",number);
14     return 0;
15 }

chmodt函數的兩個參數分別存入寄存器ebx和ecx中。

四、實驗總結:

  Linux系統就是通過內核發出的系統調用(system call)實現了用戶態進程和硬件設備之間的大部分接口。計算機系統的各種硬件資源是有限的,在現代多任務操作系統上同一時候執行的多個進程都須要訪問這些資源,為了更好的管理這些資源進程是不同意直接操作的,全部對這些資源的訪問都必須有操作系統控制。也就是說操作系統是使用這些資源的唯一入口,而這個入口就是操作系統提供的系統調用(System Call)。在linux中系統調用是用戶空間訪問內核的唯一手段,除異常和陷入外,他們是內核唯一的合法入口。

普通情況下應用程序通過應用編程接口API,而不是直接通過系統調用來編程。

操作系統通常是通過中斷從用戶態切換到內核態。中斷就是一個硬件或軟件請求,要求CPU暫停當前的工作,去處理更重要的事情。

比方。在x86機器上能夠通過int指令進行軟件中斷。而在磁盤完畢讀寫操作後會向CPU發起硬件中斷。

中斷有兩個重要的屬性,中斷號和中斷處理程序。中斷號用來標識不同的中斷,不同的中斷具有不同的中斷處理程序。在操作系統內核中維護著一個中斷向量表(Interrupt Vector Table)。這個數組存儲了全部中斷處理程序的地址,而中斷號就是對應中斷在中斷向量表中的偏移量。

一般地,系統調用都是通過軟件中斷實現的,x86系統上的軟件中斷由int $0x80指令產生,而128號異常處理程序就是系統調用處理程序system_call()。

跟蹤分析Linux5.0.2內核系統調用的過程