溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2022-03-21 14:34:15 來(lái)源:億速云 閱讀:314 作者:iii 欄目:建站服務(wù)器

這篇文章主要講解了“l(fā)inux中系統(tǒng)調(diào)用的概念是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“l(fā)inux中系統(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)核。

本教程操作環(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/types.h>
#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;
}

編譯運(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ù)?;静襟E是在SWI異常產(chǎn)生后,訪問(wèn)SPSR寄存器判斷該指令是ARM指令還是Thumb指令,然后通過(guò)訪問(wèn)LR寄存器得到整條指令地址,緊接著拿到該條指令,獲取最低24位立即數(shù)。

感謝各位的閱讀,以上就是“l(fā)inux中系統(tǒng)調(diào)用的概念是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)linux中系統(tǒng)調(diào)用的概念是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI