20242822《Linux核心原理與分析》第五週作業

zzzxp13發表於2024-10-23

實驗四——使用庫函式API和C程式碼中嵌入彙編程式碼兩種方式使用同一個系統呼叫

本次實驗採用4號系統呼叫write

一、使用庫函式API

1.建立hello.c檔案

vim hello.c

2.編譯並執行

編譯

gcc -o hello hello.c

執行

./hello

二、C程式碼中嵌入彙編程式碼

1.建立hello-asm.c檔案

vim hello-asm.c

這段程式碼是使用內聯彙編的C程式,它透過系統呼叫 write 向標準輸出(即螢幕)列印字串 "hello world!"。

①定義了一個 msg 字串為 "hello world!",長度 len 為12。

②使用 asm volatile 來嵌入彙編程式碼,volatile 關鍵字告訴編譯器不要最佳化這段彙編。

③彙編部分:

  • movl %2, %%edx: 將字串長度 len 移入暫存器 edx,作為系統呼叫的第三個引數。
  • movl %1, %%ecx: 將 msg 的地址放入暫存器 ecx,作為系統呼叫的第二個引數。
  • movl $1, %%ebx: 檔案描述符1(標準輸出)傳遞給 ebx,作為第一個引數。
  • movl $4, %%eax: 系統呼叫號4,表示 sys_write,將其放入 eax
  • int $0x80: 執行系統呼叫。

④最後透過 int $0x80 觸發系統呼叫,將訊息輸出到螢幕。

2.編譯並執行

編譯

gcc -o hello-asm hello-asm.c

執行

./hello-asm

總結

Linux 系統呼叫的工作機制可以包括以下幾點:

  1. 使用者態和核心態的切換:系統呼叫是使用者程式請求作業系統核心服務的介面,呼叫時會從使用者態切換到核心態。
  2. 系統呼叫號:每個系統呼叫都有一個唯一的呼叫號,使用者程式透過 eax 暫存器傳遞呼叫號給核心。
  3. 引數傳遞:系統呼叫的引數透過暫存器(如 ebx, ecx, edx 等)傳遞,核心透過這些引數執行相應的操作。
  4. 中斷觸發:透過觸發中斷(如 int 0x80)來通知核心執行特定的系統呼叫。
  5. 返回結果:核心處理完請求後,將結果放回暫存器並返回使用者態程式。

相關文章