分析system call中斷處理過程

2021-07-29 12:39:09 字數 2973 閱讀 5463

linux

核心分析》mooc課程

上一次的實驗中,我們選擇了乙個系統呼叫即系統呼叫函式system_write函式,分別使用庫函式

api即

printf

函式和c

**中嵌入彙編**的方式進行了系統呼叫。我們先複習一下系統呼叫的原理和系統呼叫的過程。首先我們看一下課堂上孟寧老師給出的「系統呼叫三層皮」的原理圖:

系統呼叫的三層皮分別指的是:api、

system_call

以及系統呼叫封裝例程。它們各自的作用如下:

api:第一層是指

libc

中定義的

api,這些

api封裝了系統呼叫,使用

int 0x80

觸發乙個系統呼叫中斷;當然,並非所有的

api都使用了系統呼叫,如完成數學加減運算的

api就沒有使用系統呼叫;也有可能某個

api使用了多個系統呼叫;這一層存在的價值就是為應用程式設計師提供易於使用的

api來呼叫系統呼叫;

system_call:執行於核心態。

system_call

是所有系統呼叫在核心的入口點,在其中的開始處保護使用者態程式執行上下文,結束處恢復使用者態程式執行上下文,在中間根據傳入的系統呼叫號對應的中斷服務程式;

sys_xyz 系統呼叫封裝例程:執行具體的系統呼叫操作,完成使用者的系統呼叫請求;每個系統呼叫都對應乙個封裝例程。

由上面的分析可以知道,理論上要請求乙個系統呼叫,我們既可以使用libc提供的

api,也可以直接在

c中內嵌彙編**觸發

0x80

中斷來完成。這次實驗,我們就用實際的例子來演示這兩種方法使用同乙個系統的呼叫。我們選擇的是比較簡單的系統呼叫

sys_write

,通過查閱系統呼叫列表發現它對應的系統呼叫號是

4;利用這個系統呼叫可以在螢幕上列印輸出「

hello world

」;而這個系統呼叫函式對應的

api就是

printf。

那麼本週的實驗我們可以更進一步,利用gdb我們可以給系統呼叫核心處裡程式設定斷點,並讓程式停在斷點處,進行斷點跟蹤系統呼叫的處理過程。由於

system_call

是完全用彙編寫就乙個的函式,雖然我們也可以在

system_call

處設定斷點,但卻無法讓系統停在

system_call

處,所以也無法通過單步跟蹤學習其處裡流程。但

system_call

是所有系統呼叫的入口,也是程式由使用者態轉入核心態執行時無法越過的乙個函式,其重要性不言而喻,所以我們跟隨老師簡化的彙編**以及源**學習其主要的流程。

實驗環境是使用本課程配備的實驗樓虛擬機器環境,開啟命令列客戶端,cd linuxkernel目錄,使用命令

rm -rf menu

刪除原來的**,使用

git clone

獲取menu

的最新**,然後

cd menu

進入menu

子資料夾,使用

gedti test.c

開啟檔案,講我上週實驗的**拷貝改寫成為

menu

的兩個選單項,主要**部分如下:

int sayhello(int argc, char *argv)  

int sayhelloasm(int argc, char *argv)

int main()

這裡主要就是加了兩個選單項 sayhello 和

sayhello-asm

及其對應的實現函式。其中

sayhello

函式是通過庫函式

api實現的,而

sayhello-asm

函式是通過

c**中嵌入彙編的方式實現的。儲存

test.c

函式,使用

make rootfs

編譯執行

menuos

系統,輸入

help

可以看到我們新加入的選單:

之後我們就可以通過利用gdb跟蹤函式呼叫的執行過程,可以在函式中設定斷點,逐步來分析系統呼叫的整個執行步驟。下面我們通過分析源**來分析一下系統呼叫的處理過程。

在函式\init\main.c start_kernel中,

trap_init

函式就是用來完成系統呼叫初始化的函式,我們進入這個

trap_init

函式,檢視一下源**,其中這幾行**非常重要:

#ifdef config_x86_32  

set_system_trap_gate(syscall_vector, &system_call);

set_bit(syscall_vector, used_vectors);

#endif

從**中可以看出,這個函式中通過中斷向量,將system_call函式和

0x80

繫結。

總結:通過中斷向量表,int 0x80和

system_call

關聯起來;

system_call

又是通過系統呼叫號,將每乙個系統呼叫和特定的系統呼叫服務例程關聯起來;在

system_call

返回使用者態之前,會執行

syscall_exit_work

,work_notifysig,schedule

等函式以應對可能的程序訊號處理和程序排程。

分析system call中斷處理過程

攥寫人 李鵬舉 學號 20132201 學習課程 linux核心分析 mooc課程 實驗要求 使用gdb跟蹤分析乙個系統呼叫核心函式 您上週選擇那乙個系統呼叫 系統呼叫列表參見 推薦在實驗樓linux虛擬機器環境下完成實驗。根據本週所學知識分析系統呼叫的過程,從system call開始到iret結...

linux中system call中斷處理過程

上次我們分析了系統呼叫大致過程,現在我們把這兩個系統呼叫的 放到menuos中,並用gdb跟蹤除錯來看看從system call開始到iret結束之間的整個過程。邊看實驗過程邊分析 首先我們要將系統裡面的menu目錄刪去,然後從github上更新到新版的menu。接著,把我們之前寫好的getpid ...

ARM Linux 中斷分析

在具體的 arm 晶元中會有很多的中斷型別,每一種型別的中斷用以上結構來表示 struct irqdesc irq desc nr irqs nr irqs 根據不同的 mcu 會有所區別 在通過request irq 函式註冊中斷服務程式的時候,將會把中斷向量和中斷服務程式對應起來。我們來看一下 ...