linux中什么是系統(tǒng)調(diào)用

linux中,系統(tǒng)調(diào)用是指操作系統(tǒng)提供給用戶程序調(diào)用的一組特殊接口,用戶程序可以根據(jù)這組接口獲得操作系統(tǒng)內(nèi)核的服務(wù);系統(tǒng)調(diào)用規(guī)定了用戶進(jìn)程陷入內(nèi)核的具體位置,或者說(shuō)規(guī)劃了用戶訪問(wèn)內(nèi)核的路徑,只能從固定位置進(jìn)入內(nèi)核。

linux中什么是系統(tǒng)調(diào)用

本教程操作環(huán)境:linux7.3系統(tǒng)、Dell G3電腦。

linux中什么是系統(tǒng)調(diào)用

1.什么是系統(tǒng)調(diào)用

系統(tǒng)調(diào)用,指的是操作系統(tǒng)提供給用戶程序調(diào)用的一組特殊接口,用戶程序可以根據(jù)這組接口獲得操作系統(tǒng)內(nèi)核的服務(wù)。它規(guī)定了用戶進(jìn)程陷入內(nèi)核的具體位置,或者說(shuō)規(guī)劃了用戶訪問(wèn)內(nèi)核的路徑,只能從固定位置進(jìn)入內(nèi)核。

2.linux的系統(tǒng)調(diào)用

對(duì)于現(xiàn)代操作系統(tǒng)來(lái)說(shuō),系統(tǒng)調(diào)用是用戶空間和內(nèi)核通訊的普遍手段,linux也不例外。按照功能區(qū)域,linux系統(tǒng)調(diào)用大致分為進(jìn)程控制,文件訪問(wèn),系統(tǒng)控制,存儲(chǔ)管理,網(wǎng)絡(luò)管理,進(jìn)程通訊等,詳細(xì)說(shuō)明可以通過(guò)man?2?syscalls命令查看manpage說(shuō)明。

系統(tǒng)調(diào)用,僅僅通過(guò)軟中斷機(jī)制向內(nèi)核提交請(qǐng)求,進(jìn)入系統(tǒng)調(diào)用對(duì)應(yīng)服務(wù)。linux提供的用戶編程接口遵循了POSIX標(biāo)準(zhǔn),這套標(biāo)準(zhǔn)除了定義一些標(biāo)準(zhǔn)的C函數(shù)外,提供了一套封裝例程將系統(tǒng)調(diào)用封裝供用戶編程使用。不過(guò)封裝并非必須的,如果你愿意直接調(diào)用,linux內(nèi)核也提供了一個(gè)syscall()函數(shù)來(lái)實(shí)現(xiàn)調(diào)用。通過(guò)下面一個(gè)例子了解C庫(kù)調(diào)用和直接調(diào)用的區(qū)別。

/* **??file:?demo.c **??author:?eric.xu **??date:???2016-02-25 */ #include?<syscall.h> #include?<unistd.h> #include?<sys> #include?<stdio.h> int?main(void) { ????long?id1,?id2; ???? ????/*?system?call?no?20,?__NR_getpid?equal?to?SYS_getpid??*/ ????id1?=?syscall(__NR_getpid); ????printf("sys_call?getpid?%ldn",?id1); ????/*?libc?getpid?*/ ????id2?=?getpid(); ????printf("libc?getpid?%ldn",?id2); ????return?0; }</stdio.h></sys></unistd.h></syscall.h>

編譯運(yùn)行,可以看到兩者結(jié)果一致。

sys_call?getpid?2899 libc?getpid?2899

3.linux系統(tǒng)調(diào)用實(shí)現(xiàn)

當(dāng)用戶態(tài)的進(jìn)程調(diào)用一個(gè)系統(tǒng)調(diào)用時(shí),CPU切換到內(nèi)核態(tài)并開(kāi)始執(zhí)行內(nèi)核函數(shù)。因?yàn)閮?nèi)核中每個(gè)系統(tǒng)調(diào)用都有唯一的標(biāo)號(hào),所以用戶態(tài)調(diào)用必須傳遞一個(gè)系統(tǒng)調(diào)用號(hào)的參數(shù)來(lái)確定具體的系統(tǒng)調(diào)用函數(shù)。所有的系統(tǒng)調(diào)用函數(shù)都是整數(shù),在內(nèi)核中,整數(shù)和0表示系統(tǒng)調(diào)用成功結(jié)束,負(fù)數(shù)則表示出錯(cuò)條件,而這個(gè)錯(cuò)誤值會(huì)存放在errno變量中作為出錯(cuò)碼返回給應(yīng)用程序。

linux系統(tǒng)調(diào)用使用軟中斷實(shí)現(xiàn),在x86架構(gòu)中調(diào)用int?$0x80匯編指令,這條指令會(huì)產(chǎn)生向量為128的異常。而在arm架構(gòu)中通過(guò)SWI指令進(jìn)入內(nèi)核空間,下面看下這條指令的格式:

SWI?{cond}?immed24;其中immed24表示24位立即數(shù)

SWI異常中斷處理程序需要通過(guò)讀取引起軟件中斷的SWI指令,取得24位立即數(shù)。基本步驟是在SWI異常產(chǎn)生后,訪問(wèn)SPSR寄存器判斷該指令是ARM指令還是Thumb指令,然后通過(guò)訪問(wèn)LR寄存器得到整條指令地址,緊接著拿到該條指令,獲取最低24位立即數(shù)。

相關(guān)推薦:《Linux視頻教程

以上就是

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊11 分享