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 函式註冊中斷服務程式的時候,將會把中斷向量和中斷服務程式對應起來。我們來看一下 ...