实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
賀邦+原創(chuàng)作品轉(zhuǎn)載請(qǐng)注明出處 + 《Linux內(nèi)核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000
實(shí)驗(yàn)?zāi)康?#xff1a;
使用庫函數(shù)API和C代碼中嵌入?yún)R編代碼兩種方式使用同一個(gè)系統(tǒng)調(diào)用,理解系統(tǒng)調(diào)用的工作機(jī)制。
實(shí)驗(yàn)過程:
本文實(shí)驗(yàn)選擇24號(hào)和47號(hào)系統(tǒng)調(diào)用,分別獲取當(dāng)前用戶uid(用戶ID)和gid(組ID),即模擬Linux系統(tǒng)“id”命令。編寫兩段代碼,分別使用庫函數(shù)API和C代碼中嵌入?yún)R編代碼,源碼如下:
uidgid.c(使用庫函數(shù)API方式):
程序中通過調(diào)用getuid()和getgid()函數(shù)來獲取當(dāng)前執(zhí)行用戶uid和gid
參考:《Advanced Programming in the UNIX Environment》
uidgid_asm.c(使用C代碼中嵌入?yún)R編代碼方式):
內(nèi)嵌匯編代碼版本源碼中將原來兩行通過API函數(shù)獲取uid和gid的代碼注釋掉,用匯編代碼替換。
首先將ebx寄存器清零,表示無參數(shù)傳入。
然后分別將0x18和0x2f(十進(jìn)制24和47)賦值給eax寄存器,表示需要調(diào)用的系統(tǒng)調(diào)用號(hào),24為getuid,47為getgid。
執(zhí)行int 0x80來執(zhí)行系統(tǒng)調(diào)用。
之后eax寄存器保存了返回值,將它分別賦值給輸出uid或gid變量。
完成整個(gè)匯編代碼的系統(tǒng)調(diào)用。
分別編譯兩個(gè)源碼文件、執(zhí)行系統(tǒng)id命令以及兩個(gè)編譯好的程序
上面的截圖分別表示普通用戶ubuntu和管理員用戶root分別執(zhí)行系統(tǒng)自帶命令id,庫函數(shù)API方式uidgid,內(nèi)嵌匯編方式uidgid_asm這三種方式運(yùn)行得到的結(jié)果是一樣的。
實(shí)驗(yàn)分析:
通過實(shí)驗(yàn)執(zhí)行結(jié)果可知,程序成功完成了系統(tǒng)調(diào)用獲取當(dāng)前用戶uid和gid的操作,通過內(nèi)嵌匯編代碼可以清晰的看出調(diào)用系統(tǒng)調(diào)用的工作過程。
首先將ebx寄存器清零,表示無參數(shù)傳入。
然后分別將0x18和0x2f(十進(jìn)制24和47)賦值給eax寄存器,表示需要調(diào)用的系統(tǒng)調(diào)用號(hào),24為getuid,47為getgid。
執(zhí)行int 0x80來執(zhí)行系統(tǒng)調(diào)用。
之后eax寄存器保存了返回值,將它分別賦值給輸出uid或gid變量。
完成整個(gè)匯編代碼的系統(tǒng)調(diào)用。
在Linux系統(tǒng)中是通過激活0x80中斷來觸發(fā)系統(tǒng)調(diào)用的,需要調(diào)用的系統(tǒng)調(diào)用號(hào)實(shí)現(xiàn)賦值給eax存儲(chǔ)器,如果有傳入?yún)?shù)可賦值給ebx寄存器,如果多于1個(gè)則按順序賦值給ebx、ecx、edx、esi、edi、ebp,如果超過6個(gè)則通過指針變量指向另一片堆棧區(qū),如果無參數(shù)傳入則賦值為0。
實(shí)驗(yàn)總結(jié):
雖然Intel X86 CPU有4種執(zhí)行級(jí)別0~3,但是在Linux系統(tǒng)中僅使用了0和3級(jí),分別表示內(nèi)核態(tài)和用戶態(tài)。
一些涉及底層、硬件、核心的操作必須在內(nèi)核態(tài)下才允許執(zhí)行,為操作系統(tǒng)程序和驅(qū)動(dòng)程序?qū)O?#xff0c;普通程序僅能執(zhí)行在用戶態(tài)下。如果普通程序需要涉及內(nèi)核態(tài)的操作,就需要通過系統(tǒng)調(diào)用來實(shí)現(xiàn)。這樣做的好處是屏蔽平臺(tái)相關(guān)操作降低了軟件開發(fā)難度,增強(qiáng)了系統(tǒng)安全性,使程序具有更好的移植性(Linux系統(tǒng)及其他Unix系統(tǒng)遵循統(tǒng)一標(biāo)準(zhǔn),系統(tǒng)調(diào)用基本一樣)。
轉(zhuǎn)載于:https://www.cnblogs.com/L1nke/p/5297663.html
總結(jié)
以上是生活随笔為你收集整理的实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 易拉宝多少钱啊?
- 下一篇: 打一场刑事诉讼官司要多少钱?