linux内核分析——扒开系统调用的三层皮(上)
20135125陳智威
?原創作品轉載請注明出處
? 《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000
?
系統調用:庫函數封裝了系統調用,通過庫函數和系統調用打交道
用戶態:低級別執行狀態,代碼的掌控范圍會受到限制。
內核態:高執行級別,代碼可移植性特權指令,訪問任意物理地址
為什么劃分級別:如果全部特權,系統容易崩潰
?
?
系統調用的三層皮:xyz,system_call,sys_xyz。即:API,中斷向量,服務程序。
????? xyz()函數是系統調用對應的API,這個應用程序編程接口里面封裝了一個系統調用,這個系統調用會觸發一個int0x80的中
斷,產生向量為128的編譯異常,0x80這個中斷向量對應著system_call這個內核代碼的起點,這個內核代碼里面會
有SAVE_ALL,然后執行到sys_xyz()中斷服務程序,進入程序里面處理,在中斷服務程序執行完之后會ret_from_sys_call,在return的過程
中可能會發生進程調度,如果沒有進程調度,就會iret,回到用戶態接著執行。
內核實現了很多不同的系統調用, 進程必須指明需要哪個系統調用,這需要傳遞一個名為系統調用號的參數
system_call是Linux中所有系統調用的入口點,每個系統調用至少有一個參數,即由eax傳遞的系統調用號。具體過程如下:
1.一個應用程序調用fork()封裝例程,那么在執行int $0x80之前就把eax寄存器的值置為2(即__NR_fork)。 2.這個寄存器的設置是libc庫中的封裝例程進行的
,因此用戶一般不關心系統調用號 3.進入sys_call之后,立即將eax的值壓入內核堆棧
寄存器傳遞參數也有相應的限制:
1.每個參數長度不能超過寄存器的長度(32位)
2.在eax外,參數的個數不能超過6個(ebx,ecx,edx,esi,edi,ebp),超過6個就使用指針調用某一個塊的內存。
?
?
?
?
3、使用庫函數API和C代碼中嵌入匯編代碼觸發同一個系統調用:
? 使用庫函數獲取系統當前的時間:
?
命令:
編寫time程序:vi?time.c
編譯:gcc?time.c?-o?time?-m32
執行:./time
?
?
實驗總結:
????? 我認為系統調用的工作機制是:當用戶態進程調用一個系統調用時,CPU切換到內核態并開始執行一個內核函數,由API、中斷向量和中斷處理程序協調完成。
而在系統調用的過程中,系統調用號使用eax寄存器傳遞參數。
?
轉載于:https://www.cnblogs.com/vioczw/p/5299115.html
總結
以上是生活随笔為你收集整理的linux内核分析——扒开系统调用的三层皮(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle学习笔记系列------or
- 下一篇: 10个对Web开发者最有用的Python