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

添加Linux系統(tǒng)調(diào)用與利用QEMU測(cè)試

什么是Linux系統(tǒng)調(diào)用,包括哪些內(nèi)容
ARM linux系統(tǒng)調(diào)用的實(shí)現(xiàn)原理
基于linux系統(tǒng)實(shí)現(xiàn)的vivado調(diào)用VCS仿真教程

透了解系統(tǒng)調(diào)用助你成為Linux下編程高手

Linux下系統(tǒng)調(diào)用的技巧
Linux的系統(tǒng)調(diào)用是什么
以源代碼為例,講解ARM Linux系統(tǒng)調(diào)用的實(shí)現(xiàn)原理
系統(tǒng)調(diào)用是如何實(shí)現(xiàn)的?

系統(tǒng)調(diào)用具體是如何實(shí)現(xiàn)的
如何區(qū)分xenomai、linux系統(tǒng)調(diào)用/服務(wù)
Linux內(nèi)核系統(tǒng)調(diào)用概述及實(shí)現(xiàn)原理

Linux中的系統(tǒng)調(diào)用是怎樣實(shí)現(xiàn)

評(píng)論