linux 系統(tǒng)調(diào)用與標(biāo)準(zhǔn)庫(kù)調(diào)用的區(qū)別詳細(xì)解析
1、系統(tǒng)調(diào)用和庫(kù)函數(shù)的關(guān)系
系統(tǒng)調(diào)用通過軟中斷int 0x80從用戶態(tài)進(jìn)入內(nèi)核態(tài)。 函數(shù)庫(kù)中的某些函數(shù)調(diào)用了系統(tǒng)調(diào)用。
函數(shù)庫(kù)中的函數(shù)可以沒有調(diào)用系統(tǒng)調(diào)用,也可以調(diào)用多個(gè)系統(tǒng)調(diào)用。 編程人員可以通過函數(shù)庫(kù)調(diào)用系統(tǒng)調(diào)用。
高級(jí)編程也可以直接采用int 0x80進(jìn)入系統(tǒng)調(diào)用,而不必通過函數(shù)庫(kù)作為中介。 如果是在核心編程,也可以通過int 0x80進(jìn)入系統(tǒng)調(diào)用,此時(shí)不能使用函數(shù)庫(kù)。因?yàn)楹瘮?shù)庫(kù)中的函數(shù)是內(nèi)核訪問不到的。
2、從用戶調(diào)用庫(kù)函數(shù)到系統(tǒng)調(diào)用執(zhí)行的流程。
1) 假設(shè)用戶調(diào)用ssize_t write (int fields, cont void *buff, size_t nbytes);庫(kù)函數(shù)。
2) 庫(kù)函數(shù)會(huì)執(zhí)行int 0x80中斷。因?yàn)橹袛嗍沟眠M(jìn)程從用戶態(tài)進(jìn)入內(nèi)核態(tài),所以參數(shù)通過寄存器傳送。
3) 0x80中斷對(duì)應(yīng)的中斷例程被稱為system call handler。
其工作是:
i. 存儲(chǔ)大多數(shù)寄存器到內(nèi)核堆棧中。這是匯編代碼寫的。
ii. 執(zhí)行真正的系統(tǒng)調(diào)用函數(shù)――system call service routine。這是C代碼。
iii. 通過ret_from_sys_call ()返回,回到用戶態(tài)的庫(kù)函數(shù)。這是匯編代碼。
1、系統(tǒng)調(diào)用
系統(tǒng)調(diào)用提供的函數(shù)如open, close, read, write, ioctl等,需包含頭文件unistd.h。以write為例:其函數(shù)原型為 size_t write(int fd, const void *buf, size_t nbytes),其操作對(duì)象為文件描述符或文件句柄fd(file descriptor),要想寫一個(gè)文件,必須先以可寫權(quán)限用open系統(tǒng)調(diào)用打開一個(gè)文件,獲得所打開文件的fd,例如 fd=open(/"/dev/video/", O_RDWR)。fd是一個(gè)整型值,每新打開一個(gè)文件,所獲得的fd為當(dāng)前最大fd加1。
Linux系統(tǒng)默認(rèn)分配了3個(gè)文件描述符值:
0-standard input,1-standard output,2-standard error。
系統(tǒng)調(diào)用通常用于底層文件訪問(low-level file access),例如在驅(qū)動(dòng)程序中對(duì)設(shè)備文件的直接訪問。
系統(tǒng)調(diào)用是操作系統(tǒng)相關(guān)的,因此一般沒有跨操作系統(tǒng)的可移植性。
系統(tǒng)調(diào)用發(fā)生在內(nèi)核空間,因此如果在用戶空間的一般應(yīng)用程序中使用系統(tǒng)調(diào)用來進(jìn)行文件操作,會(huì)有用戶空間到內(nèi)核空間切換的開銷。事實(shí)上,即使在用戶空間使用庫(kù)函數(shù)來對(duì)文件進(jìn)行操作,因?yàn)槲募偸谴嬖谟诖鎯?chǔ)介質(zhì)上,因此不管是讀寫操作,都是對(duì)硬件(存儲(chǔ)器)的操作,都必然會(huì)引起系統(tǒng)調(diào)用。也就是說,庫(kù)函數(shù)對(duì)文件的操作實(shí)際上是通過系統(tǒng)調(diào)用來實(shí)現(xiàn)的。例如C庫(kù)函數(shù)fwrite()就是通過write()系統(tǒng)調(diào)用來實(shí)現(xiàn)的。
這樣的話,使用庫(kù)函數(shù)也有系統(tǒng)調(diào)用的開銷,為什么不直接使用系統(tǒng)調(diào)用呢?這是因?yàn)?,讀寫文件通常是大量的數(shù)據(jù)(這種大量是相對(duì)于底層驅(qū)動(dòng)的系統(tǒng)調(diào)用所實(shí)現(xiàn)的數(shù)據(jù)操作單位而言),這時(shí),使用庫(kù)函數(shù)就可以大大減少系統(tǒng)調(diào)用的次數(shù)。這一結(jié)果又緣于緩沖區(qū)技術(shù)。在用戶空間和內(nèi)核空間,對(duì)文件操作都使用了緩沖區(qū),例如用fwrite寫文件,都是先將內(nèi)容寫到用戶空間緩沖區(qū),當(dāng)用戶空間緩沖區(qū)滿或者寫操作結(jié)束時(shí),才將用戶緩沖區(qū)的內(nèi)容寫到內(nèi)核緩沖區(qū),同樣的道理,當(dāng)內(nèi)核緩沖區(qū)滿或?qū)懡Y(jié)束時(shí)才將內(nèi)核緩沖區(qū)內(nèi)容寫到文件對(duì)應(yīng)的硬件媒介。
2、庫(kù)函數(shù)調(diào)用
標(biāo)準(zhǔn)C庫(kù)函數(shù)提供的文件操作函數(shù)如fopen, fread, fwrite, fclose, fflush, fseek等,需包含頭文件stdio.h。以fwrite為例,其函數(shù)原型為size_t fwrite(const void *buffer, size_t size, size_t item_num, FILE *pf),其操作對(duì)象為文件指針FILE *pf,要想寫一個(gè)文件,必須先以可寫權(quán)限用fopen函數(shù)打開一個(gè)文件,獲得所打開文件的FILE結(jié)構(gòu)指針pf,例如pf=fopen(/"~/proj/filename/", /"w/")。實(shí)際上,由于庫(kù)函數(shù)對(duì)文件的操作最終是通過系統(tǒng)調(diào)用實(shí)現(xiàn)的,因此,每打開一個(gè)文件所獲得的FILE結(jié)構(gòu)指針都有一個(gè)內(nèi)核空間的文件描述符fd與之對(duì)應(yīng)。同樣有相應(yīng)的預(yù)定義的FILE指針:stdin-standard input,stdout-standard output,stderr-standard error。 庫(kù)函數(shù)調(diào)用通常用于應(yīng)用程序中對(duì)一般文件的訪問。 庫(kù)函數(shù)調(diào)用是系統(tǒng)無關(guān)的,因此可移植性好。 由于庫(kù)函數(shù)調(diào)用是基于C庫(kù)的,因此也就不可能用于內(nèi)核空間的驅(qū)動(dòng)程序中對(duì)設(shè)備的操作
- Linux中獲取某個(gè)進(jìn)程的系統(tǒng)調(diào)用以及參數(shù)(故障排查案例)
- Linux C中庫(kù)函數(shù)與系統(tǒng)調(diào)用的區(qū)別詳細(xì)解析
- 三種方法實(shí)現(xiàn)Linux系統(tǒng)調(diào)用
- 基于Linux系統(tǒng)調(diào)用--getrlimit()與setrlimit()函數(shù)的方法
- 詳解linux系統(tǒng)調(diào)用原理
- Linux內(nèi)核設(shè)備驅(qū)動(dòng)之系統(tǒng)調(diào)用筆記整理
- Linux被中斷的系統(tǒng)如何調(diào)用詳解
相關(guān)文章
ubuntu16.04登錄后無dash,無啟動(dòng)欄launch,無menu bar只有桌面背景的快速解決辦法
今天打開電腦,與往常一樣輸入用戶名密碼登錄后,發(fā)現(xiàn)桌面上空空如也,啟動(dòng)欄launch,menu bar什么的都消失了,桌面上文件可以打開,但是無法拖動(dòng)位置,無法關(guān)閉,下面給大家分享ubuntu16.04登錄后無dash,無啟動(dòng)欄launch,無menu bar只有桌面背景解決辦法2017-04-04
出錯(cuò)也不怕—Linux系統(tǒng)緊急情況處理方法
出錯(cuò)也不怕—Linux系統(tǒng)緊急情況處理方法...2006-10-10

