91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

探索操作系統(tǒng)底層的關(guān)鍵接口

? 來(lái)源:jf_57394773 ? 2025-11-08 12:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、前言

為什么用戶(hù)程序不能直接訪(fǎng)問(wèn)系統(tǒng)內(nèi)核模式提供的服務(wù)?

linux中,將程序的運(yùn)行空間分為內(nèi)核空間與用戶(hù)空間(內(nèi)核態(tài)和用戶(hù)態(tài)),在邏輯上它們之間是相互隔離的,因此用戶(hù)程序不能訪(fǎng)問(wèn)內(nèi)核數(shù)據(jù),也無(wú)法使用內(nèi)核函數(shù)。當(dāng)用戶(hù)進(jìn)程必須訪(fǎng)問(wèn)內(nèi)核或使用某個(gè)內(nèi)核函數(shù)時(shí),就得使用系統(tǒng)調(diào)用(System Call)。在Linux中,系統(tǒng)調(diào)用是用戶(hù)空間訪(fǎng)問(wèn)內(nèi)核空間的唯一途徑。

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

答:系統(tǒng)調(diào)用就是一種特殊的接口。通過(guò)這個(gè)接口,用戶(hù)可以訪(fǎng)問(wèn)內(nèi)核空間。系統(tǒng)調(diào)用規(guī)定了用戶(hù)進(jìn)程進(jìn)入內(nèi)核的具體位置。系統(tǒng)調(diào)用是用戶(hù)進(jìn)程進(jìn)入內(nèi)核的接口層,它本身并非內(nèi)核函數(shù),但它是由內(nèi)核函數(shù)實(shí)現(xiàn),進(jìn)入內(nèi)核后,不同的系統(tǒng)調(diào)用會(huì)找到各自對(duì)應(yīng)的內(nèi)核函數(shù),這些內(nèi)核函數(shù)被稱(chēng)為系統(tǒng)調(diào)用的“服務(wù)例程”。比如系統(tǒng)調(diào)用getpid實(shí)際調(diào)用了服務(wù)例程為sys_getpid(),或者說(shuō)系統(tǒng)調(diào)用getpid是服務(wù)例程sys_getpid()的“封裝例程”。

具體步驟:用戶(hù)進(jìn)程-->系統(tǒng)調(diào)用-->內(nèi)核-->返回用戶(hù)空間。

系統(tǒng)調(diào)用就是為了解決上述問(wèn)題而引入的,是提供給用戶(hù)的“特殊接口”,系統(tǒng)調(diào)用規(guī)定用戶(hù)進(jìn)程進(jìn)入內(nèi)核空間的具體位置。

1.程序運(yùn)行空間從用戶(hù)空間進(jìn)入內(nèi)核空間。

2.處理完后再返回用戶(hù)空間。

什么是API

答:應(yīng)用程序接口API(Application Programming Interface) ,是程序員在用戶(hù)空間下可以直接使用的函數(shù)接口。是一些預(yù)定義的函數(shù),比如常用的read()、malloc()、free()、abs()函數(shù)等,這些函數(shù)都具有一定功能,說(shuō)明了如何獲得一個(gè)給定的服務(wù),跟內(nèi)核沒(méi)有必然的聯(lián)系。提供應(yīng)用程序與開(kāi)發(fā)人員基于某軟件或硬件的以訪(fǎng)問(wèn)一組例程的能力,而又無(wú)需訪(fǎng)問(wèn)源碼,或理解內(nèi)部工作機(jī)制的細(xì)節(jié)。

兩者的區(qū)別

答:區(qū)別:api是函數(shù)的定義,規(guī)定了這個(gè)函數(shù)的功能,跟內(nèi)核無(wú)直接關(guān)系。而系統(tǒng)調(diào)用是通過(guò)中斷向內(nèi)核發(fā)請(qǐng)求,實(shí)現(xiàn)內(nèi)核提供的某些服務(wù)。

聯(lián)系:程序員調(diào)用的是API(API函數(shù)),然后通過(guò)與系統(tǒng)調(diào)用共同完成函數(shù)的功能。 因此,API是一個(gè)提供給應(yīng)用程序的接口,一組函數(shù),是與程序員進(jìn)行直接交互的。系統(tǒng)調(diào)用則不與程序員進(jìn)行交互的,它是根據(jù)API函數(shù),通過(guò)一個(gè)軟中斷機(jī)制向內(nèi)核提交請(qǐng)求,以獲取內(nèi)核服務(wù)的接口。

有時(shí)候,某些API所提供的功能會(huì)涉及到與內(nèi)核空間進(jìn)行交互。那么,這類(lèi)API內(nèi)部會(huì)封裝系統(tǒng)調(diào)用。而不涉及與內(nèi)核進(jìn)行交互的API則不會(huì)封裝系統(tǒng)調(diào)用。也就是說(shuō),API和系統(tǒng)調(diào)用并沒(méi)有嚴(yán)格的一一對(duì)應(yīng)關(guān)系,一個(gè)API可能恰好只對(duì)應(yīng)一個(gè)系統(tǒng)調(diào)用,比如read()系統(tǒng)調(diào)用和read();一個(gè)API也可能由多個(gè)系統(tǒng)調(diào)用實(shí)現(xiàn);有時(shí)候,一個(gè)API的功能可能并不需要內(nèi)核提供的服務(wù),那么此時(shí)這個(gè)API也就不需要任何的系統(tǒng)調(diào)用,比如abs()。另外,一個(gè)系統(tǒng)調(diào)用可能還被多個(gè)API內(nèi)部調(diào)用。

對(duì)于編程者來(lái)說(shuō),系統(tǒng)調(diào)用和API都是一組函數(shù),并無(wú)什么兩樣,二者關(guān)注的都是函數(shù)名、參數(shù)類(lèi)型及返回值的含義;但是事實(shí)上,系統(tǒng)調(diào)用的實(shí)現(xiàn)是在內(nèi)核完成的,API則是在函數(shù)庫(kù)中實(shí)現(xiàn)的。

例如: 在內(nèi)核中實(shí)現(xiàn)了write系統(tǒng)調(diào)用。

AI寫(xiě)代碼

在庫(kù)函數(shù)中通過(guò)宏定義的方式實(shí)現(xiàn)write API??梢栽趗nistd.h中看到write到系統(tǒng)調(diào)用的轉(zhuǎn)換。

API是用戶(hù)程序直接可以使用的函數(shù)接口,但如果每個(gè)操作系統(tǒng)都擁有只屬于自己的API,那么應(yīng)用程序的移植性將會(huì)很差?;赑OSIX(Portable Operating System Interface)標(biāo)準(zhǔn)的API擁有很好的可移植性,它定義了一套POSIX兼容標(biāo)準(zhǔn),這使得按這個(gè)標(biāo)準(zhǔn)實(shí)現(xiàn)的API可以在各種版本的UNIX中使用?,F(xiàn)如今,它也可以在除UNIX之外的操作系統(tǒng)中使用,比如Linux,Windows NT等。

二、系統(tǒng)調(diào)用

操作系統(tǒng)負(fù)責(zé)管理和分配所有的計(jì)算機(jī)資源。為了更好地服務(wù)于應(yīng)用程序,操作系統(tǒng)提供了一組特殊接口———系統(tǒng)調(diào)用。用戶(hù)程序可以通過(guò)這組特殊的接口來(lái)獲取操作系統(tǒng)內(nèi)核提供的各種功能,如分配內(nèi)存、創(chuàng)建進(jìn)程、實(shí)現(xiàn)進(jìn)程之間的通信等。

系統(tǒng)調(diào)用(system call) 其實(shí)是 Linux 內(nèi)核提供給應(yīng)用層的應(yīng)用編程接口(API) , 是 Linux 應(yīng)用層進(jìn)入內(nèi)核的入口。不止 Linux 系統(tǒng),所有的操作系統(tǒng)都會(huì)向應(yīng)用層提供系統(tǒng)調(diào)用,應(yīng)用程序通過(guò)系統(tǒng)調(diào)用來(lái)使用操作系統(tǒng)提供的各種服務(wù)。

通過(guò)系統(tǒng)調(diào)用, Linux 應(yīng)用程序可以請(qǐng)求內(nèi)核以自己的名義執(zhí)行某些事情,譬如打開(kāi)磁盤(pán)中的文件、讀寫(xiě)文件、關(guān)閉文件以及控制其它硬件外設(shè)。

通過(guò)系統(tǒng)調(diào)用 API,應(yīng)用層可以實(shí)現(xiàn)與內(nèi)核的交互,其關(guān)系可通過(guò)下圖簡(jiǎn)單描述:

內(nèi)核提供了一系列的服務(wù)、資源、支持一系列功能,應(yīng)用程序通過(guò)調(diào)用系統(tǒng)調(diào)用 API 函數(shù)來(lái)使用內(nèi)核提供的服務(wù)、資源以及各種各樣的功能, 如果大家接觸過(guò)其它操作系統(tǒng)編程,想必對(duì)此并不陌生,譬如Windows 應(yīng)用編程,操作系統(tǒng)內(nèi)核一般都會(huì)向應(yīng)用程序提供應(yīng)用編程接口 API,否則我們將我無(wú)法使用操作系統(tǒng)。

為什么用戶(hù)程序不能直接訪(fǎng)問(wèn)系統(tǒng)內(nèi)核提供的服務(wù)呢?答案是不安全。

單片機(jī)開(kāi)發(fā)中,由于不需要操作系統(tǒng),只需要知道寄存器的地址,代碼通過(guò)指針直接操作硬件,所以開(kāi)發(fā)人員可以編寫(xiě)代碼直接訪(fǎng)問(wèn)硬件。硬件>>>>>>代碼直接在內(nèi)存中運(yùn)行操作硬件。

而在嵌入式系統(tǒng)中通常都要運(yùn)行操作系統(tǒng),程序訪(fǎng)問(wèn)資源的方式就發(fā)生了改變。操作系統(tǒng)基本上都支持多任務(wù),即同時(shí)可以運(yùn)行多個(gè)程序。如果允許程序直接訪(fǎng)問(wèn)系統(tǒng)資源,肯定會(huì)帶來(lái)很多問(wèn)題。因此,所有軟硬件資源的管理和分配都由操作系統(tǒng)負(fù)責(zé)。程序要獲取資源(如分配內(nèi)存、讀寫(xiě)串口)必須通過(guò)操作系統(tǒng)來(lái)完成,即用戶(hù)程序向操作系統(tǒng)發(fā)出服務(wù)請(qǐng)求,操作系統(tǒng)收到請(qǐng)求后執(zhí)行相關(guān)的代碼來(lái)處理。硬件>>>>>>>操作系統(tǒng)>>>>>>>代碼

還有更重要的一點(diǎn)是,在Linux中,為了更好地保護(hù)內(nèi)核空間,將程序的運(yùn)行空間分為用戶(hù)空間和內(nèi)核空間(也就是常稱(chēng)的用戶(hù)態(tài)和內(nèi)核態(tài)),它們分別運(yùn)行在不同的級(jí)別上,邏輯上是相互分離的。因此,用戶(hù)進(jìn)程通常情況下不允許訪(fǎng)問(wèn)內(nèi)核數(shù)據(jù),也無(wú)法使用內(nèi)核函數(shù),它們只能在用戶(hù)空間操作用戶(hù)數(shù)據(jù),調(diào)用用戶(hù)空間的函數(shù)。但是,在有些情況下,用戶(hù)空間的進(jìn)程需要獲得內(nèi)核的系統(tǒng)服務(wù)(調(diào)用內(nèi)核空間程序),這時(shí)操作系統(tǒng)就必須利用系統(tǒng)提供用戶(hù)的特殊接口———”系統(tǒng)調(diào)用”規(guī)定用戶(hù)進(jìn)程進(jìn)入內(nèi)核空間的具體位置。在進(jìn)行系統(tǒng)調(diào)用時(shí),程序運(yùn)行空間需要從用戶(hù)空間進(jìn)入內(nèi)核空間,處理完成后再返回用戶(hù)空間。

用戶(hù)程序向操作系統(tǒng)提出請(qǐng)求的接口就是系統(tǒng)調(diào)用。所有的操作系統(tǒng)都會(huì)提供系統(tǒng)調(diào)用接口,只不過(guò)不同的操作系統(tǒng)提供的系統(tǒng)調(diào)用接口各不相同。Linux系統(tǒng)調(diào)用接口非常精簡(jiǎn)(只有250個(gè)左右),它繼承了UNIX系統(tǒng)調(diào)用中最基本和最有用的部分。這些系統(tǒng)調(diào)用按照功能大致可分為進(jìn)程控制、進(jìn)程間通信、文件系統(tǒng)控制、存儲(chǔ)管理、網(wǎng)絡(luò)管理、套接字控制、用戶(hù)管理等。

應(yīng)用編程與裸機(jī)編程、驅(qū)動(dòng)編程有什么區(qū)別?

在學(xué)習(xí)應(yīng)用編程之前,相信大家都有過(guò)軟件開(kāi)發(fā)經(jīng)驗(yàn),譬如 51、 STM32單片機(jī)軟件開(kāi)發(fā)、 以及嵌入式 Linux 硬件平臺(tái)下的驅(qū)動(dòng)開(kāi)發(fā)等, 51、 STM32 這類(lèi)單片機(jī)的軟件開(kāi)發(fā)通常是裸機(jī)程序開(kāi)發(fā),并不會(huì)涉及到操作系統(tǒng)的概念,那應(yīng)用編程與裸機(jī)編程以及驅(qū)動(dòng)開(kāi)發(fā)有什么區(qū)別呢?

就拿嵌入式 Linux 硬件平臺(tái)下的軟件開(kāi)發(fā)來(lái)說(shuō),我們大可將編程分為三種,分別為裸機(jī)編程、 Linux 驅(qū)動(dòng)編程以及 Linux 應(yīng)用編程。首先對(duì)于裸機(jī)編程這個(gè)概念來(lái)說(shuō)很好理解,一般把沒(méi)有操作系統(tǒng)支持的編程環(huán)境稱(chēng)為裸機(jī)編程環(huán)境,譬如單片機(jī)上的編程開(kāi)發(fā),編寫(xiě)直接在硬件上運(yùn)行的程序,沒(méi)有操作系統(tǒng)支持; 狹義上 Linux 驅(qū)動(dòng)編程指的是基于內(nèi)核驅(qū)動(dòng)框架開(kāi)發(fā)驅(qū)動(dòng)程序, 驅(qū)動(dòng)開(kāi)發(fā)工程師通過(guò)調(diào)用 Linux 內(nèi)核提供的接口完成設(shè)備驅(qū)動(dòng)的注冊(cè), 驅(qū)動(dòng)程序負(fù)責(zé)底層硬件操作相關(guān)邏輯, 如果學(xué)習(xí)過(guò) Linux 驅(qū)動(dòng)開(kāi)發(fā)的讀者,想必對(duì)此并不陌生; 而 Linux 應(yīng)用編程(系統(tǒng)編程)則指的是基于 Linux 操作系統(tǒng)的應(yīng)用編程,在應(yīng)用程序中通過(guò)調(diào)用系統(tǒng)調(diào)用 API 完成應(yīng)用程序的功能和邏輯, 應(yīng)用程序運(yùn)行于操作系統(tǒng)之上。通常在操作系統(tǒng)下有兩種不同的狀態(tài):內(nèi)核態(tài)和用戶(hù)態(tài),應(yīng)用程序運(yùn)行在用戶(hù)態(tài)、而內(nèi)核則運(yùn)行在內(nèi)核態(tài)。

三、用戶(hù)編程接口(API)---C庫(kù)

前面提到利用系統(tǒng)調(diào)用接口程序可以訪(fǎng)問(wèn)各種資源,但并不直接與程序員進(jìn)行交互,它僅僅是一個(gè)通過(guò)軟中斷機(jī)制向內(nèi)核提交請(qǐng)求以獲取內(nèi)核服務(wù)的接口。但在實(shí)際開(kāi)發(fā)中程序并不直接使用系統(tǒng)調(diào)用接口,而是使用用戶(hù)程序編程接口(API)。例如,創(chuàng)建進(jìn)程的API函數(shù)fork()函數(shù)對(duì)應(yīng)于內(nèi)核空間的sys_fork()系統(tǒng)調(diào)用,但并不是所有的函數(shù)都對(duì)應(yīng)一個(gè)系統(tǒng)調(diào)用。有時(shí),一個(gè)API函數(shù)會(huì)需要幾個(gè)系統(tǒng)調(diào)用來(lái)共同完成函數(shù)的功能,甚至還有一些API函數(shù)不需要調(diào)用相應(yīng)的系統(tǒng)調(diào)用(因此它所完成的不是內(nèi)核提供的服務(wù))。

前面給大家介紹了系統(tǒng)調(diào)用,系統(tǒng)調(diào)用是內(nèi)核直接向應(yīng)用層提供的應(yīng)用編程接口, 譬如 open、 write、read、 close 等。編寫(xiě)應(yīng)用程序除了使用系統(tǒng)調(diào)用之外,我們還可以使用庫(kù)函數(shù)。

庫(kù)函數(shù)也就是 C 語(yǔ)言庫(kù)函數(shù), C 語(yǔ)言庫(kù)是應(yīng)用層使用的一套函數(shù)庫(kù), 在 Linux 下,通常以動(dòng)態(tài)(.so)庫(kù)文件的形式提供,存放在根文件系統(tǒng)/lib 目錄下, C 語(yǔ)言庫(kù)函數(shù)構(gòu)建于系統(tǒng)調(diào)用之上,也就是說(shuō)庫(kù)函數(shù)其實(shí)是由系統(tǒng)調(diào)用封裝而來(lái)的,當(dāng)然也不能完全這么說(shuō), 原因在于有些庫(kù)函數(shù)并不調(diào)用任何系統(tǒng)調(diào)用,譬如一些字符串處理函數(shù) strlen()、 strcat()、 memcpy()、 memset()、 strchr()等等; 而有些庫(kù)函數(shù)則會(huì)使用系統(tǒng)調(diào)用來(lái)幫它完成實(shí)際的操作,譬如庫(kù)函數(shù) fopen 內(nèi)部調(diào)用了系統(tǒng)調(diào)用 open()來(lái)幫它打開(kāi)文件、庫(kù)函數(shù) fread()就利用了系統(tǒng)調(diào)用 read()來(lái)完成讀文件操作、 fwrite()就利用了系統(tǒng)調(diào)用 write()來(lái)完成寫(xiě)文件操作。

庫(kù)函數(shù)可以理解為是對(duì)系統(tǒng)調(diào)用的一層封裝。系統(tǒng)調(diào)用作為內(nèi)核提供給用戶(hù)程序的接口,它的執(zhí)行效率是比較高效而精簡(jiǎn)的,但有時(shí)我們需要對(duì)獲取的信息進(jìn)行更復(fù)雜的處理,或更人性化的需要,我們把這些處理過(guò)程封裝成一個(gè)函數(shù)再提供給程序員,更方便于程序猿編碼。庫(kù)函數(shù)有可能包含有一個(gè)系統(tǒng)調(diào)用,有可能有好幾個(gè)系統(tǒng)調(diào)用,當(dāng)然也有可能沒(méi)有系統(tǒng)調(diào)用,比如有些操作不需要涉及內(nèi)核的功能??梢詤⒖枷聢D來(lái)理解庫(kù)函數(shù)與系統(tǒng)調(diào)用的關(guān)系。

Linux 系統(tǒng)內(nèi)核提供了一系列的系統(tǒng)調(diào)用供應(yīng)用層使用, 我們直接使用系統(tǒng)調(diào)用就可以了呀,那為何還要設(shè)計(jì)出庫(kù)函數(shù)呢?事實(shí)上, 有些系統(tǒng)調(diào)用使用起來(lái)并不是很方便, 于是就出現(xiàn)了 C 語(yǔ)言庫(kù),這些 C 語(yǔ)言庫(kù)函數(shù)的設(shè)計(jì)是為了提供比底層系統(tǒng)調(diào)用更為方便、更為好用、 且更具有可移植性的調(diào)用接口。

來(lái)看一看它們之間的區(qū)別:

庫(kù)函數(shù)是屬于應(yīng)用層,而系統(tǒng)調(diào)用是內(nèi)核提供給應(yīng)用層的編程接口,屬于系統(tǒng)內(nèi)核的一部分;

庫(kù)函數(shù)運(yùn)行在用戶(hù)空間,調(diào)用系統(tǒng)調(diào)用會(huì)由用戶(hù)空間(用戶(hù)態(tài))陷入到內(nèi)核空間(內(nèi)核態(tài));

庫(kù)函數(shù)通常是有緩存的,而系統(tǒng)調(diào)用是無(wú)緩存的,所以在性能、效率上,庫(kù)函數(shù)通常要優(yōu)于系統(tǒng)調(diào)用;

可移植性:庫(kù)函數(shù)相比于系統(tǒng)調(diào)用具有更好的可移植性,通常對(duì)于不同的操作系統(tǒng),其內(nèi)核向應(yīng)用層提供的系統(tǒng)調(diào)用往往都是不同,譬如系統(tǒng)調(diào)用的定義、功能、參數(shù)列表、返回值等往往都是不一樣的;而對(duì)于 C 語(yǔ)言庫(kù)函數(shù)來(lái)說(shuō),由于很多操作系統(tǒng)都實(shí)現(xiàn)了 C 語(yǔ)言庫(kù), C 語(yǔ)言庫(kù)在不同的操作系統(tǒng)之間其接口定義幾乎是一樣的,所以庫(kù)函數(shù)在不同操作系統(tǒng)之間相比于系統(tǒng)調(diào)用具有更好的可移植性。

以上便上它們之間一個(gè)大致的區(qū)別, 從實(shí)現(xiàn)者的角度來(lái)看,系統(tǒng)調(diào)用與庫(kù)函數(shù)之間有根本的區(qū)別,但從用戶(hù)使用角度來(lái)看,其區(qū)別并不重要,它們都是 C 語(yǔ)言函數(shù)。 在實(shí)際應(yīng)用編程中,庫(kù)函數(shù)和系統(tǒng)調(diào)用都會(huì)使用到,所以對(duì)于我們來(lái)說(shuō),直接把它們當(dāng)做是 C 函數(shù)即可,知道你自己調(diào)用的函數(shù)是系統(tǒng)調(diào)用還是庫(kù)函數(shù)即可,不用太過(guò)于區(qū)分它們之間的差別,所以應(yīng)用編程簡(jiǎn)單點(diǎn)來(lái)說(shuō)就是:開(kāi)發(fā) Linux 應(yīng)用程序,通過(guò)調(diào)用內(nèi)核提供的系統(tǒng)調(diào)用或使用 C 庫(kù)函數(shù)來(lái)開(kāi)發(fā)具有相應(yīng)功能的應(yīng)用程序。

為什么不直接使用系統(tǒng)調(diào)用接口了。原因如下:

系統(tǒng)調(diào)用接口功能非常簡(jiǎn)單,無(wú)法滿(mǎn)足程序的要求

不同操作系統(tǒng)的系統(tǒng)調(diào)用接口不兼容,程序移植時(shí)工作量大。

用戶(hù)程序編程接口通俗的解釋就是各種庫(kù)(最重要的就是C庫(kù))中的函數(shù)。為了提高開(kāi)發(fā)效率,C庫(kù)中實(shí)現(xiàn)了很多函數(shù)。這些函數(shù)實(shí)現(xiàn)了常用的功能,供程序員調(diào)用。這樣一來(lái),程序員就不需要自己編寫(xiě)這些代碼。直接調(diào)用庫(kù)函數(shù)就可以實(shí)現(xiàn)基本功能,提高了代碼的復(fù)用率。使用用戶(hù)程序編程接口好友一個(gè)好處就是:程序具有良好的可移植性。幾乎所有的操作系統(tǒng)上都實(shí)現(xiàn)了C庫(kù),所以程序通常只需要重新編譯一下就可以在其它操作系統(tǒng)下運(yùn)行。

在Linux中,用戶(hù)程序編程接口(API)遵循了UNIX中最流行的應(yīng)用編程界面標(biāo)準(zhǔn)———POSIX標(biāo)準(zhǔn)。POSIX標(biāo)準(zhǔn)是由IEEE和ISO/IEC共同開(kāi)發(fā)的標(biāo)準(zhǔn)系統(tǒng),該標(biāo)準(zhǔn)基于當(dāng)時(shí)的UNIX實(shí)踐和經(jīng)驗(yàn),描述了操作系統(tǒng)的系統(tǒng)調(diào)用編程接口(實(shí)際上就是API),用于保證應(yīng)用程序可以在源代碼一級(jí)上在多種操作系統(tǒng)上移植運(yùn)行。這些系統(tǒng)調(diào)用編程接口主要是通過(guò)C庫(kù)(libc)實(shí)現(xiàn)的。

3.1系統(tǒng)命令

每一個(gè)系統(tǒng)命令其實(shí)就是一個(gè)可執(zhí)行的程序,這些可執(zhí)行程序的實(shí)現(xiàn)調(diào)用了某些系統(tǒng)調(diào)用。并且,這些可執(zhí)行程序又分為普通用戶(hù)可使用的命令和管理員可使用的命令。根據(jù)上述分類(lèi),普通用戶(hù)可用的命令和管理可用的命令分別被存放于/bin和/sbin目錄下。

系統(tǒng)命令相對(duì)于API更高了一層,它實(shí)際上是一個(gè)可執(zhí)行程序,它的內(nèi)部引用了用戶(hù)編程接口(API)來(lái)實(shí)現(xiàn)相應(yīng)的功能,它們之間的關(guān)系如下圖:

3.2內(nèi)核函數(shù)

內(nèi)核函數(shù)和用戶(hù)空間中函數(shù)并無(wú)兩樣,只不過(guò)內(nèi)核函數(shù)是在內(nèi)核中實(shí)現(xiàn)。雖然系統(tǒng)調(diào)用是用戶(hù)進(jìn)程進(jìn)入內(nèi)核的唯一途徑,但是系統(tǒng)調(diào)用函數(shù)內(nèi)部并不真正實(shí)現(xiàn)其功能,而是通過(guò)對(duì)內(nèi)核函數(shù)的封裝。也就是說(shuō),用戶(hù)程序通過(guò)某個(gè)系統(tǒng)調(diào)用進(jìn)入內(nèi)核后,會(huì)接著去執(zhí)行這個(gè)系統(tǒng)調(diào)用對(duì)應(yīng)的內(nèi)核函數(shù)。這個(gè)內(nèi)核函數(shù)也稱(chēng)為系統(tǒng)調(diào)用的服務(wù)例程。

由于內(nèi)核函數(shù)是在內(nèi)核中實(shí)現(xiàn)的,因此它必須符合內(nèi)核編程的規(guī)則,比如函數(shù)名以sys_開(kāi)始,函數(shù)定義時(shí)候需加asmlinkage標(biāo)識(shí)符等。

四、標(biāo)準(zhǔn)C程序的實(shí)例

首先,C程序調(diào)用API函數(shù)printf;

printf 函數(shù)的調(diào)用引發(fā)了對(duì)應(yīng)的系統(tǒng)調(diào)用write的執(zhí)行;

write執(zhí)行結(jié)束時(shí)的返回值傳遞回用戶(hù)程序;

4.1操作系統(tǒng)的模式

(1)雙重模式(DUAL MODE)

現(xiàn)代計(jì)算機(jī)系統(tǒng)有一個(gè)特殊的硬件,用于劃分系統(tǒng)的運(yùn)行狀態(tài),至少需要兩種單獨(dú)運(yùn)行模式:

用戶(hù)模式(user mode):執(zhí)行用戶(hù)代碼

內(nèi)核模式(kernel mode):執(zhí)行操作系統(tǒng)代碼

目的:確保操作系統(tǒng)正確的運(yùn)行

實(shí)現(xiàn)方式:用一個(gè)硬件模式位來(lái)表示當(dāng)前模式:0表示內(nèi)核模式,1表示用戶(hù)模式

(2)運(yùn)行模式的切換

程序執(zhí)行流剛開(kāi)始在“用戶(hù)模式”運(yùn)行,當(dāng)發(fā)生系統(tǒng)調(diào)用的時(shí)候,需要從“用戶(hù)模式”切換到“內(nèi)核模式”運(yùn)行。

這種模式切換的機(jī)制稱(chēng)為:陷阱(Trap)機(jī)制。

4.2系統(tǒng)調(diào)用的實(shí)現(xiàn)機(jī)制

如遇任何疑問(wèn)或有進(jìn)一步的需求,請(qǐng)隨時(shí)與我私信或者評(píng)論聯(lián)系。

版權(quán)聲明:本文為CSDN博主「xie13307907056」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/xie13307907056/article/details/154171834

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11758

    瀏覽量

    219008
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    7401

    瀏覽量

    129279
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    國(guó)產(chǎn)工業(yè)操作系統(tǒng)選型指南:硬實(shí)時(shí)、功能安全與生態(tài)怎么選

    在工業(yè)4.0浪潮席卷全球、國(guó)產(chǎn)化替代進(jìn)入深水區(qū)的今天,工業(yè)操作系統(tǒng)是整個(gè)工業(yè)數(shù)字生態(tài)的“底層基座”,直接決定了系統(tǒng)的穩(wěn)定性、控制精度與安全等級(jí)。從高端數(shù)控系統(tǒng)到工業(yè)機(jī)器人的精準(zhǔn)協(xié)同,再
    的頭像 發(fā)表于 03-04 09:48 ?897次閱讀

    操作系統(tǒng)體系結(jié)構(gòu)

    優(yōu)勢(shì)。   但隨著體系結(jié)構(gòu)和應(yīng)用需求的不斷發(fā)展,需要操作系統(tǒng)提供的服務(wù)越來(lái)越多,而且接口形式越來(lái)越復(fù)雜,操作系統(tǒng)的設(shè)計(jì)規(guī)模也急劇增長(zhǎng),操作系統(tǒng)也面臨著“軟件危機(jī)”困境。為此,
    發(fā)表于 01-15 08:19

    操作系統(tǒng)運(yùn)行機(jī)制

    不同的層次上。一些與硬件關(guān)聯(lián)較緊密的模塊,諸如時(shí)鐘管理、中斷處理、設(shè)備驅(qū)動(dòng)等處于最底層。其次是運(yùn)行頻率較髙的程序,諸如進(jìn)程管理、存儲(chǔ)器管理和設(shè)備管理等。這兩部分內(nèi)容構(gòu)成了操作系統(tǒng)的內(nèi)核。這部分內(nèi)容的指令
    發(fā)表于 01-15 07:12

    什么是嵌入式操作系統(tǒng)?

    、嵌入式操作系統(tǒng)的定義 嵌入式操作系統(tǒng)是專(zhuān)門(mén)為資源受限的嵌入式設(shè)備(比如 STM32 單片機(jī)、物聯(lián)網(wǎng)模塊、工業(yè)控制器)設(shè)計(jì)的微型操作系統(tǒng),核心作用是:管理硬件資源、調(diào)度多任務(wù)、提供標(biāo)準(zhǔn)化接口
    發(fā)表于 12-09 10:33

    EV10AS180A模數(shù)轉(zhuǎn)換器支持哪些操作系統(tǒng)

    基于模擬信號(hào)的采樣、量化和編碼,這些過(guò)程均由硬件電路完成,不涉及操作系統(tǒng)層面的指令或驅(qū)動(dòng)。因此,該轉(zhuǎn)換器本身不直接支持或依賴(lài)任何操作系統(tǒng)接口與通信協(xié)議:雖然EV10AS180A不直接支持操作
    發(fā)表于 11-18 09:18

    單片機(jī)的操作系統(tǒng)

    。 ? ? RT-Thread ?:國(guó)產(chǎn)開(kāi)源系統(tǒng),集成GUI、網(wǎng)絡(luò)協(xié)議棧、文件系統(tǒng)等組件,兼容POSIX接口,適合物聯(lián)網(wǎng)設(shè)備。 ? 嵌入式操作系統(tǒng) ? μClinux ?:針對(duì)無(wú)M
    發(fā)表于 11-14 06:18

    深入了解系統(tǒng)調(diào)用API:探索操作系統(tǒng)底層關(guān)鍵接口

    ,也無(wú)法使用內(nèi)核函數(shù)。當(dāng)用戶(hù)進(jìn)程必須訪(fǎng)問(wèn)內(nèi)核或使用某個(gè)內(nèi)核函數(shù)時(shí),就得使用系統(tǒng)調(diào)用(System Call)。在Linux中,系統(tǒng)調(diào)用是用戶(hù)空間訪(fǎng)問(wèn)內(nèi)核空間的唯一途徑。 什么是系統(tǒng)調(diào)用? 答:
    的頭像 發(fā)表于 11-03 09:20 ?697次閱讀

    樹(shù)莓派操作系統(tǒng):版本、特性及設(shè)置完整指南!

    樹(shù)莓派操作系統(tǒng)是什么?樹(shù)莓派操作系統(tǒng)是由樹(shù)莓派基金會(huì)專(zhuān)為樹(shù)莓派開(kāi)發(fā)的官方操作系統(tǒng)。它基于DebianLinux發(fā)行版,并針對(duì)樹(shù)莓派的ARM架構(gòu)進(jìn)行了專(zhuān)門(mén)優(yōu)化。樹(shù)莓派操作系統(tǒng)有多個(gè)版本,
    的頭像 發(fā)表于 07-28 18:26 ?1409次閱讀
    樹(shù)莓派<b class='flag-5'>操作系統(tǒng)</b>:版本、特性及設(shè)置完整指南!

    深度智能 基座躍遷 鴻道Intewell,面向“AI+智造”的新型工業(yè)操作系統(tǒng)

    科東軟件受邀參加“數(shù)字化與智能制造技術(shù)論壇”,帶來(lái)“AI+智造”的精彩分享。在“AI+智造”深度融合的時(shí)代洪流中,工業(yè)操作系統(tǒng)作為底層基座的重要性日益凸顯。鴻道Intewell操作系統(tǒng)已成為驅(qū)動(dòng)中國(guó)制造業(yè)智能化躍遷的
    的頭像 發(fā)表于 07-23 17:02 ?588次閱讀
    深度智能 基座躍遷  鴻道Intewell,面向“AI+智造”的新型工業(yè)<b class='flag-5'>操作系統(tǒng)</b>

    揭秘LuatOS:實(shí)時(shí)操作系統(tǒng)RTOS核心庫(kù)的關(guān)鍵技術(shù)剖析!

    電機(jī)控制、傳感器采集等實(shí)時(shí)數(shù)據(jù)處理場(chǎng)景。 在LuatOS開(kāi)發(fā)中, 用于實(shí)時(shí)操作系統(tǒng)(RTOS)相關(guān)功能的核心庫(kù) ——提供了定時(shí)器管理、系統(tǒng)控制、內(nèi)存監(jiān)控、路徑配置等底層操作
    的頭像 發(fā)表于 05-21 16:02 ?662次閱讀
    揭秘LuatOS:實(shí)時(shí)<b class='flag-5'>操作系統(tǒng)</b>RTOS核心庫(kù)的<b class='flag-5'>關(guān)鍵</b>技術(shù)剖析!

    鴻道Intewell操作系統(tǒng):人形機(jī)器人底層操作系統(tǒng)

    操作系統(tǒng)的實(shí)時(shí)性賦能東土科技的鴻道(Intewell)工業(yè)操作系統(tǒng)作為國(guó)內(nèi)唯一通過(guò)汽車(chē)、工業(yè)控制、醫(yī)療、軌道交通四項(xiàng)功能安全認(rèn)證的系統(tǒng),為標(biāo)準(zhǔn)體系中的技術(shù)層架構(gòu)提供了底層支持。其微內(nèi)核
    的頭像 發(fā)表于 05-16 14:44 ?765次閱讀

    基于LuatOS核心庫(kù)的實(shí)時(shí)操作系統(tǒng)開(kāi)發(fā):從理論到實(shí)踐~

    ,降低了系統(tǒng)阻塞風(fēng)險(xiǎn)。 在LuatOS開(kāi)發(fā)中,用于實(shí)時(shí)操作系統(tǒng)(RTOS)相關(guān)功能的核心庫(kù)——提供了定時(shí)器管理、系統(tǒng)控制、內(nèi)存監(jiān)控、路徑配置等底層
    的頭像 發(fā)表于 05-16 13:56 ?548次閱讀
    基于LuatOS核心庫(kù)的實(shí)時(shí)<b class='flag-5'>操作系統(tǒng)</b>開(kāi)發(fā):從理論到實(shí)踐~

    理想汽車(chē)智駕操作系統(tǒng)解讀

    (HaloOS),基于“資源集中與共享、極致性能、快速迭代、高安全性”四大設(shè)計(jì)原則,打通了底層硬件與上層智能應(yīng)用的隔閡,為自動(dòng)駕駛技術(shù)提供了強(qiáng)大而可靠的系統(tǒng)底座。 在過(guò)去的幾十年里,汽車(chē)操作系統(tǒng)的發(fā)展與汽車(chē)電子電氣架構(gòu)的演變緊
    的頭像 發(fā)表于 05-13 10:54 ?1208次閱讀
    理想汽車(chē)智駕<b class='flag-5'>操作系統(tǒng)</b>解讀

    KaihongOS操作系統(tǒng):導(dǎo)入接口模塊介紹

    導(dǎo)入接口模塊 在KaihongOS中,接口模塊是指一組定義了特定功能和行為的API(應(yīng)用程序編程接口)集合,它們?cè)试S開(kāi)發(fā)者訪(fǎng)問(wèn)和控制操作系統(tǒng)的特定功能或硬件特性。
    發(fā)表于 04-25 08:16

    模型原生操作系統(tǒng):機(jī)遇、挑戰(zhàn)與展望 CCCF精選

    本文立足人工智能時(shí)代用戶(hù)、應(yīng)用和系統(tǒng)的需求,分析“外掛式模型”演進(jìn)路徑下的操作系統(tǒng)發(fā)展困局,提出通過(guò)“模型-系統(tǒng)-芯片”的全棧協(xié)同設(shè)計(jì)來(lái)構(gòu)建模型原生操作系統(tǒng),并進(jìn)一步探討了面臨的機(jī)遇與
    的頭像 發(fā)表于 03-14 17:46 ?1157次閱讀
    模型原生<b class='flag-5'>操作系統(tǒng)</b>:機(jī)遇、挑戰(zhàn)與展望  CCCF精選