使用庫函數(shù)API和C代碼中嵌入?yún)R編代碼兩種方式使用同一個系統(tǒng)調(diào)用

網(wǎng)易云課堂《Linux內(nèi)核分析》作業(yè)

實驗?zāi)康模?/h1>

使用庫函數(shù)API和C代碼中嵌入?yún)R編代碼兩種方式使用同一個系統(tǒng)調(diào)用倾贰,理解系統(tǒng)調(diào)用的工作機制谅辣。

實驗過程:

本文實驗使用亞馬遜云計算平臺(AWS)Ubuntu 14.04.2 LTS 64bit

1

本文實驗選擇24號和47號系統(tǒng)調(diào)用一铅,分別獲取當前用戶uid(用戶ID)和gid(組ID),即模擬Linux系統(tǒng)“id”命令本今。

2

編寫兩段代碼宰僧,分別使用庫函數(shù)API和C代碼中嵌入?yún)R編代碼,源碼如下:

uidgid.c(使用庫函數(shù)API方式):

3

程序中通過調(diào)用getuid()和getgid()函數(shù)來獲取當前執(zhí)行用戶uid和gid

參考:《Advanced Programming in the UNIX Environment》

uidgid_asm.c(使用C代碼中嵌入?yún)R編代碼方式):

4

內(nèi)嵌匯編代碼版本源碼中將原來兩行通過API函數(shù)獲取uid和gid的代碼注釋掉您市,用匯編代碼替換觉痛。

首先將ebx寄存器清零,表示無參數(shù)傳入茵休。

然后分別將0x18和0x2f(十進制24和47)賦值給eax寄存器薪棒,表示需要調(diào)用的系統(tǒng)調(diào)用號,24為getuid榕莺,47為getgid俐芯。

執(zhí)行int 0x80來執(zhí)行系統(tǒng)調(diào)用。

之后eax寄存器保存了返回值帽撑,將它分別賦值給輸出uid或gid變量泼各。

完成整個匯編代碼的系統(tǒng)調(diào)用。

分別編譯兩個源碼文件:

5

分別執(zhí)行系統(tǒng)id命令以及兩個編譯好的程序:

6

上面的截圖分別表示普通用戶ubuntu和管理員用戶root分別執(zhí)行系統(tǒng)自帶命令id亏拉,庫函數(shù)API方式uidgid扣蜻,內(nèi)嵌匯編方式uidgid_asm這三種方式運行得到的結(jié)果是一樣的。

實驗分析:

通過實驗執(zhí)行結(jié)果可知及塘,程序成功完成了系統(tǒng)調(diào)用獲取當前用戶uid和gid的操作莽使,通過內(nèi)嵌匯編代碼可以清晰的看出調(diào)用系統(tǒng)調(diào)用的工作過程。

首先將ebx寄存器清零笙僚,表示無參數(shù)傳入芳肌。

然后分別將0x18和0x2f(十進制24和47)賦值給eax寄存器,表示需要調(diào)用的系統(tǒng)調(diào)用號肋层,24為getuid亿笤,47為getgid。

執(zhí)行int 0x80來執(zhí)行系統(tǒng)調(diào)用栋猖。

之后eax寄存器保存了返回值净薛,將它分別賦值給輸出uid或gid變量。

完成整個匯編代碼的系統(tǒng)調(diào)用蒲拉。

在Linux系統(tǒng)中是通過激活0x80中斷來觸發(fā)系統(tǒng)調(diào)用的肃拜,需要調(diào)用的系統(tǒng)調(diào)用號實現(xiàn)賦值給eax存儲器痴腌,如果有傳入?yún)?shù)可賦值給ebx寄存器,如果多于1個則按順序賦值給ebx燃领、ecx士聪、edx、esi猛蔽、edi剥悟、ebp,如果超過6個則通過指針變量指向另一片堆棧區(qū)枢舶,如果無參數(shù)傳入則賦值為0懦胞。

實驗總結(jié):

雖然Intel X86 CPU有4種執(zhí)行級別0~3替久,但是在Linux系統(tǒng)中僅使用了0和3級凉泄,分別表示內(nèi)核態(tài)用戶態(tài)

一些涉及底層蚯根、硬件后众、核心的操作必須在內(nèi)核態(tài)下才允許執(zhí)行,為操作系統(tǒng)程序和驅(qū)動程序?qū)O砺梗胀ǔ绦騼H能執(zhí)行在用戶態(tài)下蒂誉。如果普通程序需要涉及內(nèi)核態(tài)的操作,就需要通過系統(tǒng)調(diào)用來實現(xiàn)距帅。這樣做的好處是屏蔽平臺相關(guān)操作降低了軟件開發(fā)難度右锨,增強了系統(tǒng)安全性,使程序具有更好的移植性(Linux系統(tǒng)及其他Unix系統(tǒng)遵循統(tǒng)一標準碌秸,系統(tǒng)調(diào)用基本一樣)绍移。

aapu原創(chuàng)作品轉(zhuǎn)載請注明出處《Linux內(nèi)核分析》MOOC課

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市讥电,隨后出現(xiàn)的幾起案子蹂窖,更是在濱河造成了極大的恐慌,老刑警劉巖恩敌,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞬测,死亡現(xiàn)場離奇詭異,居然都是意外死亡纠炮,警方通過查閱死者的電腦和手機月趟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恢口,“玉大人孝宗,你說我怎么就攤上這事』∮” “怎么了碳褒?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵折砸,是天一觀的道長。 經(jīng)常有香客問我沙峻,道長睦授,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任摔寨,我火速辦了婚禮去枷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘是复。我一直安慰自己删顶,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布淑廊。 她就那樣靜靜地躺著逗余,像睡著了一般。 火紅的嫁衣襯著肌膚如雪季惩。 梳的紋絲不亂的頭發(fā)上录粱,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音画拾,去河邊找鬼啥繁。 笑死,一個胖子當著我的面吹牛青抛,可吹牛的內(nèi)容都是我干的旗闽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蜜另,長吁一口氣:“原來是場噩夢啊……” “哼适室!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蚕钦,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤亭病,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嘶居,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罪帖,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年邮屁,在試婚紗的時候發(fā)現(xiàn)自己被綠了整袁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡佑吝,死狀恐怖坐昙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芋忿,我是刑警寧澤炸客,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布疾棵,位于F島的核電站,受9級特大地震影響痹仙,放射性物質(zhì)發(fā)生泄漏是尔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一开仰、第九天 我趴在偏房一處隱蔽的房頂上張望拟枚。 院中可真熱鬧,春花似錦众弓、人聲如沸恩溅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脚乡。三九已至,卻和暖如春傻粘,著一層夾襖步出監(jiān)牢的瞬間每窖,已是汗流浹背帮掉。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工弦悉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蟆炊。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓稽莉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涩搓。 傳聞我的和親對象是個殘疾皇子污秆,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

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