本文我將基于 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é)果返回給應用程序。
-
寄存器
+關注
關注
31文章
5498瀏覽量
128116 -
Linux系統(tǒng)
+關注
關注
4文章
608瀏覽量
29456 -
ARM處理器
+關注
關注
6文章
361瀏覽量
43051 -
觸發(fā)中斷
+關注
關注
0文章
11瀏覽量
6677 -
函數(shù)指針
+關注
關注
2文章
57瀏覽量
4083
發(fā)布評論請先 登錄
Linux系統(tǒng)調(diào)用的實現(xiàn)與應用
Linux內(nèi)核中系統(tǒng)調(diào)用詳解

什么是Linux系統(tǒng)調(diào)用,包括哪些內(nèi)容
ARM linux系統(tǒng)調(diào)用的實現(xiàn)原理
基于linux系統(tǒng)實現(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)用的實現(xiàn)原理
系統(tǒng)調(diào)用是如何實現(xiàn)的?

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

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

評論