linux内核分析——扒开系统调用的三层皮(上)
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内核分析——扒开系统调用的三层皮(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle学习笔记系列------or
- 下一篇: 每天一个linux命令(1):ln 命令