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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux内核分析——扒开系统调用的三层皮(上)

發(fā)布時間:2023/12/2 linux 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux内核分析——扒开系统调用的三层皮(上) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

20135125陳智威

?原創(chuàng)作品轉載請注明出處

? 《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000

?

系統(tǒng)調用:庫函數(shù)封裝了系統(tǒng)調用,通過庫函數(shù)和系統(tǒng)調用打交道

用戶態(tài):低級別執(zhí)行狀態(tài),代碼的掌控范圍會受到限制。

內核態(tài):高執(zhí)行級別,代碼可移植性特權指令,訪問任意物理地址

為什么劃分級別:如果全部特權,系統(tǒng)容易崩潰

?

?

系統(tǒng)調用的三層皮:xyz,system_call,sys_xyz。即:API,中斷向量,服務程序。

????? xyz()函數(shù)是系統(tǒng)調用對應的API,這個應用程序編程接口里面封裝了一個系統(tǒng)調用,這個系統(tǒng)調用會觸發(fā)一個int0x80的中

斷,產(chǎn)生向量為128的編譯異常,0x80這個中斷向量對應著system_call這個內核代碼的起點,這個內核代碼里面會

有SAVE_ALL,然后執(zhí)行到sys_xyz()中斷服務程序,進入程序里面處理,在中斷服務程序執(zhí)行完之后會ret_from_sys_call,在return的過程

中可能會發(fā)生進程調度,如果沒有進程調度,就會iret,回到用戶態(tài)接著執(zhí)行。

內核實現(xiàn)了很多不同的系統(tǒng)調用, 進程必須指明需要哪個系統(tǒng)調用,這需要傳遞一個名為系統(tǒng)調用號的參數(shù)

system_call是Linux中所有系統(tǒng)調用的入口點,每個系統(tǒng)調用至少有一個參數(shù),即由eax傳遞的系統(tǒng)調用號。具體過程如下:

1.一個應用程序調用fork()封裝例程,那么在執(zhí)行int $0x80之前就把eax寄存器的值置為2(即__NR_fork)。 2.這個寄存器的設置是libc庫中的封裝例程進行的

,因此用戶一般不關心系統(tǒng)調用號 3.進入sys_call之后,立即將eax的值壓入內核堆棧

寄存器傳遞參數(shù)也有相應的限制:


1.每個參數(shù)長度不能超過寄存器的長度(32位)

2.在eax外,參數(shù)的個數(shù)不能超過6個(ebx,ecx,edx,esi,edi,ebp),超過6個就使用指針調用某一個塊的內存。

?

?

?

?

3、使用庫函數(shù)API和C代碼中嵌入?yún)R編代碼觸發(fā)同一個系統(tǒng)調用:

? 使用庫函數(shù)獲取系統(tǒng)當前的時間:

?

命令:

編寫time程序:vi?time.c

編譯:gcc?time.c?-o?time?-m32

執(zhí)行:./time

?

?

實驗總結:

????? 我認為系統(tǒng)調用的工作機制是:當用戶態(tài)進程調用一個系統(tǒng)調用時,CPU切換到內核態(tài)并開始執(zhí)行一個內核函數(shù),由API、中斷向量和中斷處理程序協(xié)調完成。

而在系統(tǒng)調用的過程中,系統(tǒng)調用號使用eax寄存器傳遞參數(shù)。

?

轉載于:https://www.cnblogs.com/vioczw/p/5299115.html

總結

以上是生活随笔為你收集整理的linux内核分析——扒开系统调用的三层皮(上)的全部內容,希望文章能夠幫你解決所遇到的問題。

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