通過(guò)兩種方式使用系統(tǒng)調(diào)用

本實(shí)驗(yàn)選擇的系統(tǒng)調(diào)用號(hào)為34,在syscall_32.tbl中對(duì)應(yīng)如下項(xiàng):
41 i386 dup sys_dup
功能描述:
Dup() duplicates an existing object descriptor and returns its value to
the calling process (fildes2 = dup(fildes)). The argument fildes is a
small non-negative integer index in the per-process descriptor table.
The value must be less than the size of the table, which is returned by
getdtablesize(2). The new descriptor returned by the call is the lowest
numbered descriptor currently not in use by the process.
RETURN VALUES

Upon successful completion, the new file descriptor is returned. Otherwise, a value of -1 is returned and the global integer variable errno is set to indicate the error.

使用 libc 中提供的庫(kù)函數(shù)調(diào)用 的 C 代碼以及運(yùn)行結(jié)果如圖1所示:

圖1

其中,給 dup 函數(shù)傳遞的參數(shù)是1.
其中的程序成功通過(guò)新復(fù)制的 fild 進(jìn)行了寫入操作,在屏幕上輸出字符串.

直接在 C 代碼中使用內(nèi)聯(lián)匯編調(diào)用該系統(tǒng)調(diào)用的代碼及運(yùn)行結(jié)果如圖2所示:


圖2

從圖中可以看出對(duì) ebx 寄存器賦值為1,達(dá)到了傳遞參數(shù)的效果.同樣在屏幕上輸出了字符串.可知fild 復(fù)制成功.
匯編代碼調(diào)用系統(tǒng)調(diào)用的程序如下:

#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char const *argv[])
{
    int new_fildes=0;
    char *szTemp="test_dup\n";

    asm volatile(
        "mov $1,%%ebx\n\t"  //傳遞參數(shù)
        "mov $41,%%eax\n\t"  //設(shè)置系統(tǒng)調(diào)用號(hào)
        "int $0x80\n\t" //進(jìn)行軟中斷觸發(fā)
        "mov %%eax,%0\n\t" //保存返回值
        :"=m"(new_fildes)
        );
    printf("new fildes: %d\n",new_fildes);
    write(new_fildes,szTemp,strlen(szTemp));

    return 0;
}

系統(tǒng)調(diào)用的總?cè)肟谑?x80中斷,用 eax 寄存器存儲(chǔ)具體的中斷調(diào)用號(hào),本例中是41.除了系統(tǒng)調(diào)用號(hào)以外,大部分系統(tǒng)調(diào)用都還需要一些外部的參數(shù)輸人艺玲。所以涨醋,在發(fā)生異常的時(shí)候却特,應(yīng)該把這些參數(shù)從用戶空間傳給內(nèi)核扁位。最簡(jiǎn)單的辦法就是像傳遞系統(tǒng)調(diào)用號(hào)一樣把這些參數(shù)也存放在寄存器里羊瘩。在x86系統(tǒng)上岛心,ebx, ecx, edx, esi和edi按照順序存放前五個(gè)參數(shù)题画。需要六個(gè)或六個(gè)以上參數(shù)的情況不多見(jiàn)餐曼,此時(shí)压储,應(yīng)該用一個(gè)單獨(dú)的寄存器存放指向所有這些參數(shù)在用戶空間地址的指針。 給用戶空間的返回值也通過(guò)寄存器傳遞源譬。在x86系統(tǒng)上集惋,它存放在eax寄存器中。接下來(lái)許多關(guān)于系統(tǒng)調(diào)用處理程序的描述都是針對(duì)x86版本的踩娘。但不用擔(dān)心刮刑,所有體系結(jié)構(gòu)的實(shí)現(xiàn)都很類似。最終依據(jù)具體調(diào)用號(hào)調(diào)用對(duì)應(yīng)的系統(tǒng)調(diào)用處理過(guò)程并使用傳遞的參數(shù).

總結(jié)

系統(tǒng)調(diào)用在用戶空間進(jìn)程和硬件設(shè)備之間的接口养渴,它和普通庫(kù)函數(shù)調(diào)用非常相似雷绢,只是系統(tǒng)調(diào)用由操作系統(tǒng)核心提供,運(yùn)行于核心態(tài)理卑,而普通的函數(shù)調(diào)用由函數(shù)庫(kù)或用戶自己提供翘紊,運(yùn)行于用戶態(tài)。主要有三個(gè)作用:

它為用戶空間提供了一種統(tǒng)一的硬件的抽象接口藐唠。比如當(dāng)需要讀些文件的時(shí)候帆疟,應(yīng)用程序就可以不去管磁盤類型和介質(zhì),甚至不用去管文件所在的文件系統(tǒng)到底是哪種類型宇立。
系統(tǒng)調(diào)用保證了系統(tǒng)的穩(wěn)定和安全踪宠。作為硬件設(shè)備和應(yīng)用程序之間的中間人,內(nèi)核可以基于權(quán)限和其他一些規(guī)則對(duì)需要進(jìn)行的訪問(wèn)進(jìn)行裁決妈嘹。舉例來(lái)說(shuō)柳琢,這樣可以避免應(yīng)用程序不正確地使用硬件設(shè)備,竊取其他進(jìn)程的資源蟋滴,或做出其他什么危害系統(tǒng)的事情染厅。
每個(gè)進(jìn)程都運(yùn)行在虛擬系統(tǒng)中痘绎,而在用戶空間和系統(tǒng)的其余部分提供這樣一層公共接口津函,也是出于這種考慮。如果應(yīng)用程序可以隨意訪問(wèn)硬件而內(nèi)核又對(duì)此一無(wú)所知的話孤页,幾乎就沒(méi)法實(shí)現(xiàn)多任務(wù)和虛擬內(nèi)存尔苦,當(dāng)然也不可能實(shí)現(xiàn)良好的穩(wěn)定性和安全性。在Linux中,系統(tǒng)調(diào)用是用戶空間訪問(wèn)內(nèi)核的惟一手段允坚;除異常和中斷外魂那,它們是內(nèi)核惟一的合法入口。
API與系統(tǒng)調(diào)用并不存在一一對(duì)應(yīng)的關(guān)系稠项,只是為用戶提供的標(biāo)準(zhǔn)接口涯雅,提高了程序移植性。用戶在請(qǐng)求系統(tǒng)調(diào)用的時(shí)候展运,一般只與API打交道活逆。而內(nèi)核只與系統(tǒng)調(diào)用打交道,至于API是怎樣申請(qǐng)系統(tǒng)調(diào)用的拗胜,是由Glibc等標(biāo)準(zhǔn)制定者負(fù)責(zé)的蔗候。UNIX尊奉的一句話是:Provide mechanism, not policy,即提供機(jī)制而不是策略埂软。這里的機(jī)制就是:

用戶空間的程序無(wú)法直接執(zhí)行內(nèi)核代碼锈遥。它們不能直接調(diào)用內(nèi)核空間中的函數(shù),因?yàn)閮?nèi)核駐留在受保護(hù)的地址空間上勘畔。如果進(jìn)程可以直接在內(nèi)核的地址空間上讀寫的話所灸,系統(tǒng)安全就會(huì)失去控制。所以炫七,應(yīng)用程序應(yīng)該以某種方式通知系統(tǒng)庆寺,告訴內(nèi)核自己需要執(zhí)行一個(gè)系統(tǒng)調(diào)用,希望系統(tǒng)切換到內(nèi)核態(tài)诉字,這樣內(nèi)核就可以代表應(yīng)用程序來(lái)執(zhí)行該系統(tǒng)調(diào)用了懦尝。
通知內(nèi)核的機(jī)制是靠軟件中斷實(shí)現(xiàn)的。首先壤圃,用戶程序?yàn)橄到y(tǒng)調(diào)用設(shè)置參數(shù)陵霉。其中一個(gè)參數(shù)是系統(tǒng)調(diào)用編號(hào)。參數(shù)設(shè)置完成后伍绳,程序執(zhí)行“系統(tǒng)調(diào)用”指令踊挠。x86系統(tǒng)上的軟中斷由int產(chǎn)生。這個(gè)指令會(huì)導(dǎo)致一個(gè)異常:產(chǎn)生一個(gè)事件冲杀,這個(gè)事件會(huì)致使處理器切換到內(nèi)核態(tài)并跳轉(zhuǎn)到一個(gè)新的地址效床,并開(kāi)始執(zhí)行那里的異常處理程序。此時(shí)的異常處理程序?qū)嶋H上就是系統(tǒng)調(diào)用處理程序权谁。它與硬件體系結(jié)構(gòu)緊密相關(guān)剩檀。
新地址的指令會(huì)保存程序的狀態(tài),計(jì)算出應(yīng)該調(diào)用哪個(gè)系統(tǒng)調(diào)用旺芽,調(diào)用內(nèi)核中實(shí)現(xiàn)那個(gè)系統(tǒng)調(diào)用的函數(shù)沪猴,恢復(fù)用戶程序狀態(tài)辐啄,然后將控制權(quán)返還給用戶程序。系統(tǒng)調(diào)用是設(shè)備驅(qū)動(dòng)程序中定義的函數(shù)最終被調(diào)用的一種方式运嗜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末壶辜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子担租,更是在濱河造成了極大的恐慌砸民,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奋救,死亡現(xiàn)場(chǎng)離奇詭異阱洪,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)菠镇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門冗荸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人利耍,你說(shuō)我怎么就攤上這事蚌本。” “怎么了隘梨?”我有些...
    開(kāi)封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵程癌,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我轴猎,道長(zhǎng)嵌莉,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任捻脖,我火速辦了婚禮锐峭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘可婶。我一直安慰自己沿癞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布矛渴。 她就那樣靜靜地躺著椎扬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪具温。 梳的紋絲不亂的頭發(fā)上蚕涤,一...
    開(kāi)封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音铣猩,去河邊找鬼揖铜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛剂习,可吹牛的內(nèi)容都是我干的蛮位。 我是一名探鬼主播较沪,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鳞绕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼失仁!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起们何,我...
    開(kāi)封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤萄焦,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后冤竹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拂封,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年鹦蠕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了冒签。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钟病,死狀恐怖萧恕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肠阱,我是刑警寧澤票唆,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站屹徘,受9級(jí)特大地震影響走趋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜噪伊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一簿煌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鉴吹,春花似錦啦吧、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至肆糕,卻和暖如春般堆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诚啃。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工淮摔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人始赎。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓和橙,卻偏偏與公主長(zhǎng)得像仔燕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子魔招,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容