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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

發(fā)布時(shí)間:2023/11/27 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

賀邦+原創(chuàng)作品轉(zhuǎn)載請(qǐng)注明出處 + 《Linux內(nèi)核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000

實(shí)驗(yàn)?zāi)康?#xff1a;

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

實(shí)驗(yàn)過(guò)程:

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

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

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



程序中通過(guò)調(diào)用getuid()和getgid()函數(shù)來(lái)獲取當(dāng)前執(zhí)行用戶uid和gid

參考:《Advanced Programming in the UNIX Environment》

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


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

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

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

執(zhí)行int 0x80來(lái)執(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,庫(kù)函數(shù)API方式uidgid,內(nèi)嵌匯編方式uidgid_asm這三種方式運(yùn)行得到的結(jié)果是一樣的。

實(shí)驗(yàn)分析:

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

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

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

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

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

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

在Linux系統(tǒng)中是通過(guò)激活0x80中斷來(lái)觸發(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,如果超過(guò)6個(gè)則通過(guò)指針變量指向另一片堆棧區(qū),如果無(wú)參數(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)的操作,就需要通過(guò)系統(tǒng)調(diào)用來(lái)實(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)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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