日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

《操作系统》OS学习(三):系统调用

發(fā)布時(shí)間:2023/12/20 windows 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《操作系统》OS学习(三):系统调用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

例子

首先看一個(gè)標(biāo)準(zhǔn)C庫(kù)的例子:當(dāng)我們程序中使用了C庫(kù)中的printf()函數(shù),實(shí)際在底層是在內(nèi)核態(tài)中調(diào)用了write()函數(shù)。圖中右側(cè)則是將程序代碼與C庫(kù)都算到應(yīng)用程序中,內(nèi)核提供了一個(gè)系統(tǒng)調(diào)用接口。

從這個(gè)例子我們可以得到以下幾點(diǎn):

1. 系統(tǒng)調(diào)用是操作系統(tǒng)服務(wù)的編程接口;

2. 系統(tǒng)調(diào)用通常由高級(jí)語(yǔ)言編寫(C或者C++);

3. 程序訪問通常是通過高層次的API接口(比如C庫(kù))而不是直接進(jìn)行系統(tǒng)調(diào)用。最常見的三種:1. Windows下的Win32 API;2. POSIX-based系統(tǒng)(包括UNIX、LINUX、Mac OS等)下的 POSIX API;3. JAVA虛擬機(jī)中的Java API。

實(shí)現(xiàn):

每個(gè)系統(tǒng)調(diào)用對(duì)應(yīng)一個(gè)系統(tǒng)調(diào)用編號(hào)。當(dāng)使用系統(tǒng)調(diào)用時(shí),系統(tǒng)調(diào)用首先通過軟中斷的方式進(jìn)入到內(nèi)核的中斷向量表產(chǎn)生中斷,發(fā)現(xiàn)是系統(tǒng)調(diào)用軟中斷后轉(zhuǎn)移到系統(tǒng)調(diào)用表,系統(tǒng)調(diào)用表中記錄系統(tǒng)調(diào)用編號(hào)與具體實(shí)現(xiàn)之間的映射關(guān)系,根據(jù)系統(tǒng)調(diào)用編號(hào)選取不同的系統(tǒng)調(diào)用實(shí)現(xiàn),得到結(jié)果之后返回。通過這種方式,用戶不需要知道系統(tǒng)調(diào)用內(nèi)部是如何實(shí)現(xiàn)的,而只需要設(shè)置調(diào)用參數(shù)和湖區(qū)返回結(jié)果即可,并且系統(tǒng)調(diào)用接口的細(xì)節(jié)大部分都隱藏函數(shù)庫(kù)后面,通過調(diào)用庫(kù)函數(shù)實(shí)現(xiàn)。

函數(shù)調(diào)用與系統(tǒng)調(diào)用的不同:

使用的指令不同。系統(tǒng)調(diào)用使用INT和IRET,函數(shù)調(diào)用使用CALL和RET,他們的指令級(jí)是完全不同的。具體還有哪些不同呢?我們知道在調(diào)用一個(gè)函數(shù)的時(shí)候需要把參數(shù)壓到堆棧中去,然后轉(zhuǎn)到相應(yīng)函數(shù)去執(zhí)行,執(zhí)行的時(shí)候從堆棧獲取我的參數(shù)信息執(zhí)行,然后返回結(jié)果。而對(duì)于系統(tǒng)調(diào)用來講,內(nèi)核是受保護(hù)的,為了保護(hù)內(nèi)核,內(nèi)核與應(yīng)用程序之間使用不同的堆棧,因此系統(tǒng)調(diào)用時(shí)會(huì)有一個(gè)堆棧和特權(quán)級(jí)的切換,首先切換到內(nèi)核態(tài),此時(shí)可以使用特權(quán)指令,并擁有自己的堆棧,執(zhí)行完后再切換回用戶態(tài)。而常規(guī)調(diào)用是沒有堆棧切換的。

開銷不同。系統(tǒng)調(diào)用比函數(shù)調(diào)用更安全,但是開銷更大。主要原因就是有一個(gè)用戶態(tài)的切換。具體有以下操作導(dǎo)致開銷更大:1. 引導(dǎo)機(jī)制,需要引導(dǎo)用戶態(tài)到內(nèi)核態(tài)的切換;2. 建立內(nèi)核堆棧,第一次調(diào)用時(shí)需要?jiǎng)?chuàng)建新的內(nèi)核堆棧;3. 驗(yàn)證參數(shù),需要對(duì)傳入的參數(shù)的有效性合法性進(jìn)行驗(yàn)證;4. 在內(nèi)核態(tài)中需要使用到用戶態(tài)中的一些信息,此時(shí)需要建立內(nèi)核態(tài)到用戶態(tài)地址空間的映射關(guān)系;5. 建立用戶態(tài)內(nèi)核態(tài)地址空間映射時(shí)會(huì)導(dǎo)致緩存的變化,TLB中有些內(nèi)容會(huì)失效。

示例:文件復(fù)制

一個(gè)文件復(fù)制過程可以拆分如下圖所示,我們可以先看下整個(gè)過程中哪些過程會(huì)使用到系統(tǒng)調(diào)用:1.鍵盤輸入;2. 屏幕顯示;3. 讀取文件;4. 創(chuàng)建文件?5. 寫入文件。而在操作系統(tǒng)內(nèi)部,鍵盤、屏幕與文件都視為文件系統(tǒng)里的,只是鍵盤、屏幕作為特殊文件來使用。因此用到了右圖中標(biāo)紅的系統(tǒng)調(diào)用(還有一個(gè)creat)。

???

首先是一個(gè)read()函數(shù)如下圖,我們要知道參數(shù)意義和返回值。int fd是要讀的文件句柄,void *buf是緩沖區(qū)頭指針, int length是緩沖區(qū)的最大長(zhǎng)度,返回值為讀出的數(shù)據(jù)長(zhǎng)度int return_value。

那么內(nèi)部是如何實(shí)現(xiàn)的呢?首先準(zhǔn)備參數(shù),如下圖中上面的匯編代碼,前6行都是壓棧,壓棧完最后一行是一個(gè)函數(shù)調(diào)用,這個(gè)函數(shù)調(diào)用還不是系統(tǒng)調(diào)用。因?yàn)樗邢到y(tǒng)調(diào)用都是通過一個(gè)宏展開成相應(yīng)的函數(shù)。函數(shù)內(nèi)的int就是進(jìn)入內(nèi)核態(tài)的指令,i就是系統(tǒng)調(diào)用的中斷向量編號(hào),T_SYSCALL代表該軟中斷是系統(tǒng)調(diào)用,a(num)是系統(tǒng)調(diào)用編號(hào),后面是相應(yīng)的參數(shù)。

進(jìn)入到內(nèi)核態(tài)之后的過程如下圖:系統(tǒng)調(diào)用進(jìn)入內(nèi)核態(tài)實(shí)際是一個(gè)軟中斷,所有這些軟中斷會(huì)到最開始的一段匯編程序叫做alltraps(),在這里面獲取中斷的相關(guān)信息組成的數(shù)據(jù)結(jié)構(gòu),也就是TF數(shù)據(jù)結(jié)構(gòu)。接下來來到trap(),判斷tf中有一個(gè)成員trapno(中斷向量)表明了該軟中斷是系統(tǒng)調(diào)用,則進(jìn)入syscall(),發(fā)現(xiàn)系統(tǒng)調(diào)用編號(hào)代表的是sys_read()函數(shù),接下來執(zhí)行sys_read()函數(shù),該函數(shù)讀取堆棧中的參數(shù)信息,之后進(jìn)入sysfile_read()函數(shù),該函數(shù)則是直接操作底層的驅(qū)動(dòng)程序進(jìn)行讀取,最后返回時(shí)調(diào)用trapret()函數(shù)返回給用戶態(tài)


補(bǔ)充:

大多數(shù)計(jì)算機(jī)系統(tǒng)將CPU執(zhí)行狀態(tài)分為管態(tài)和目態(tài)。管態(tài)又稱為特權(quán)狀態(tài)、系統(tǒng)態(tài)或核心態(tài)。通常,操作系統(tǒng)在管態(tài)下運(yùn)行。目態(tài)又叫做常態(tài)或用戶態(tài),用戶程序只能在目態(tài)下運(yùn)行,如果用戶程序在目態(tài)下執(zhí)行特權(quán)指令,硬件將發(fā)生中斷,由操作系統(tǒng)獲得控制,特權(quán)指令執(zhí)行被禁止,這樣可以防止用戶程序有意或無意的破壞系統(tǒng)。從目態(tài)轉(zhuǎn)換為管態(tài)的唯一途徑是中斷。

系統(tǒng)調(diào)用與庫(kù)函數(shù)的區(qū)別

  • 系統(tǒng)調(diào)用:運(yùn)行在用戶空間的應(yīng)用程序向操作系統(tǒng)內(nèi)核請(qǐng)求某些服務(wù)的調(diào)用過程。是內(nèi)核提供給應(yīng)用程序的接口函數(shù),屬于系統(tǒng)的一部分。是為了方便應(yīng)用使用操作系統(tǒng)的接口
  • 函數(shù)庫(kù)調(diào)用是語(yǔ)言或應(yīng)用程序的一部分。是為了方便人們編寫應(yīng)用程序而引出的,比如你自己編寫一個(gè)函數(shù)其實(shí)也可以說就是一個(gè)庫(kù)函數(shù)。
  • write/read就是系統(tǒng)調(diào)用,而printf/fread就是C標(biāo)準(zhǔn)庫(kù)函數(shù).
    ?

總結(jié)

以上是生活随笔為你收集整理的《操作系统》OS学习(三):系统调用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。