本文我將基于 ARM 體系結(jié)構(gòu)角度,從 Linux 應用層例子到內(nèi)核系統(tǒng)調(diào)用函數(shù)的整個過程來梳理一遍,講清楚linux系統(tǒng)調(diào)用實現(xiàn)原理,這里我們以open系統(tǒng)調(diào)用為例來講解。
在應用層調(diào)用 open 系統(tǒng)調(diào)用時,實際上調(diào)用的是 C 標準庫函數(shù),具體的代碼如下:
其中,open 函數(shù)的第一個參數(shù)是要打開的文件路徑,第二個參數(shù)則是打開方式(例如只讀、讀寫等)。在這里我們使用了 O_RDONLY 參數(shù)表示只讀。
在 C 標準庫中,open 函數(shù)實際上是通過系統(tǒng)調(diào)用來完成文件的打開操作。接下來,我們來看一下系統(tǒng)調(diào)用的具體實現(xiàn)。
在 ARM 架構(gòu)的 Linux 內(nèi)核中,系統(tǒng)調(diào)用的處理流程分為以下幾步:
1.應用程序通過 swi 匯編指令觸發(fā)中斷,將 CPU 切換到特權(quán)模式。
在 ARM 架構(gòu)中,每一個系統(tǒng)調(diào)用都對應有一個系統(tǒng)調(diào)用號,比如open系統(tǒng)調(diào)用的號碼就是5,應用程序通過 swi 指令從用戶態(tài)切換到內(nèi)核態(tài),CPU進入特權(quán)模式,通過R7寄存器將中系統(tǒng)調(diào)用號傳遞給內(nèi)核。下面是 open 系統(tǒng)調(diào)用的匯編代碼示例:
2.中斷處理程序根據(jù)傳遞的系統(tǒng)調(diào)用號找到對應的系統(tǒng)調(diào)用函數(shù)。
內(nèi)核中的系統(tǒng)調(diào)用處理程序是通過一張系統(tǒng)調(diào)用表來實現(xiàn)的,該表包含了所有系統(tǒng)調(diào)用的函數(shù)指針。當中斷處理程序接收到一個系統(tǒng)調(diào)用請求時,它會根據(jù)系統(tǒng)調(diào)用號查找該表,并跳轉(zhuǎn)到相應的系統(tǒng)調(diào)用函數(shù)。在 ARM 架構(gòu)中,系統(tǒng)調(diào)用表存儲在地址為 0x9000 的內(nèi)存位置上。
對于 open 系統(tǒng)調(diào)用,在內(nèi)核中的實現(xiàn)代碼為 sys_open() 函數(shù),其定義在 fs/open.c 文件中。在 ARM 架構(gòu)中,sys_open() 函數(shù)的函數(shù)指針存儲在系統(tǒng)調(diào)用表的第 5 個位置上。
3.將用戶空間的參數(shù)復制到內(nèi)核空間,并在系統(tǒng)調(diào)用函數(shù)中進行相應的操作。
在 ARM 架構(gòu)中,內(nèi)核將用戶空間和內(nèi)核空間分開,以確保用戶空間的數(shù)據(jù)不會被惡意程序修改。因此,在執(zhí)行系統(tǒng)調(diào)用之前,內(nèi)核需要將用戶空間的數(shù)據(jù)復制到內(nèi)核空間。對于 open 系統(tǒng)調(diào)用,它的參數(shù)包括文件名和標志,這些參數(shù)都需要從用戶空間復制到內(nèi)核空間。
在內(nèi)核中,copy_from_user() 和 copy_to_user() 函數(shù)用于從用戶空間復制數(shù)據(jù)到內(nèi)核空間和從內(nèi)核空間復制數(shù)據(jù)到用戶空間。對于 open 系統(tǒng)調(diào)用,它需要從用戶空間復制文件名和標志,并將它們傳遞給 sys_open() 函數(shù)進行處理。下面是 sys_open() 函數(shù)的代碼示例:
4.將處理結(jié)果返回給用戶空間,并將 CPU 切換回用戶模式。
在 ARM 架構(gòu)中,系統(tǒng)調(diào)用的返回值通過 r0 寄存器傳遞給應用程序。對于 open 系統(tǒng)調(diào)用,它的返回值為文件描述符,即打開文件的句柄。如果打開文件成功,則返回一個非負整數(shù),表示新的文件描述符;否則,返回一個負數(shù),表示錯誤代碼。
在 sys_open() 函數(shù)中,如果成功打開文件,則將文件描述符安裝到當前進程的文件描述符表中,并返回該文件描述符。否則,返回錯誤代碼。下面是 open 系統(tǒng)調(diào)用的匯編代碼示例:
最后,當處理完 open 系統(tǒng)調(diào)用后,中斷處理程序?qū)?CPU 切換回用戶模式,將處理結(jié)果返回給應用程序。
-
寄存器
+關(guān)注
關(guān)注
31文章
5332瀏覽量
120197 -
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
593瀏覽量
27382 -
ARM處理器
+關(guān)注
關(guān)注
6文章
360瀏覽量
41701 -
觸發(fā)中斷
+關(guān)注
關(guān)注
0文章
11瀏覽量
6565 -
函數(shù)指針
+關(guān)注
關(guān)注
2文章
56瀏覽量
3778
發(fā)布評論請先 登錄
相關(guān)推薦
評論