《LINUX内核设计与实现》第五章学习总结
?
一、與內核通信
系統調用:用戶控件進程和硬件設備之間添加了一個中間層
系統調用的三個主要作用:
注意:在Linux中,系統調用是用戶控件訪問內核的唯一手段;除異常和陷入外,他們是內核唯一的合法入口。
?
二、API、POSIX和C庫
POSIX-Unix世界中最流行的應用編程接口是給予POSIX標準的。
Linux的系統調用作為C庫的一部分提供。
C庫實現了Unix系統的主要API,包括標準C庫函數和系統調用接口,即POSIXdM大部分API。
Unix的接口設計——“提供機制而不是策略”
?
三、系統調用
(一)要訪問系統調用(syscall),通常通過C庫中定義的函數調用來進行系統調用。
(二)系統調用通過返回一個long型的返回值來表示成功或者錯誤?,用一個負的返回值來表明錯誤,返回0代表成功。系統調用出現錯誤的時候會把錯誤碼寫入errno全局變量 ,?通過perror()庫函數可以把該變量翻譯成用戶可以理解的錯誤字符串
(三)定義系統調用:asmlinkage?long?sys_getpid(void) ?(asmlingkage是一個編譯指令,通知編譯器僅從棧中提取該函數的參數。所有的系統調用都需要這個限定詞。 其次, 返回值long。 為了保證32位和64位系統的兼容,系統調用在用戶空間返回值int,內核空間long 。最后,注意系統調用getpid()在內核中被定義成sys_getpid().
系統調用號:
每個系統調用號獨一無二,一旦分配就不能再有任何變更。
執行系統調用時,通過系統調用號指明,進程不會提及系統調用的名稱。
未實現系統調用——sys_ni_syscall(),返回-ENOSYS,針對無用的系統調用。
系統調用的性能:
設計原則:簡潔、高效
原因:
- 上下文切換時間短
- 系統調用處理程序和每個系統調用本身都很簡潔
四、系統調用處理程序
通知內核的機制是軟中斷:通過引發一個異常來促使系統切換到內核態中去執行異常處理程序,即系統調用處理程序system_call()。
中斷號128,指令如下:int?128 或者?int?0x80 退出是iret
(一)指定恰當的系統調用
- eax寄存器:將系統調用號傳遞給內核
- system_call():與NR_syscall比較,檢查有效性
- call *sys_call_table(,%rax,8):執行相應的系統調用
(二)參數傳遞
- x86系統,ebx,ecx,edx,esi,edi按順序存放前五個參數。
- 需要6個及以上參數,應用一個單獨的寄存器存放指向這些參數在用戶空間地址的指針。
- 返回值存放在eax。
?
轉載于:https://www.cnblogs.com/20135223heweiqin/p/5300215.html
總結
以上是生活随笔為你收集整理的《LINUX内核设计与实现》第五章学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3月19 HTML静态网页的制作
- 下一篇: p中div -- a中a