1. 程式人生 > >Linux內核知識雜記

Linux內核知識雜記

用戶空間 printk pps 通過 外圍設備 for 四種 nbsp 互動

1.內核調試手段

  1.printk打印內核狀態

  2.產生opps時使用GDB查看調用棧

2.內核空間和用戶空間區別,通信方式有哪些?

  Linux簡化了分段機制,使得虛擬地址與線性地址總是一致,因此,Linux的虛擬地址空間也為0~4G。Linux內核將這4G字節的空間分為兩部分。將最高的1G字節(從虛擬地址0xC0000000到0xFFFFFFFF),供內核使用,稱為“內核空間”。而將較低的3G字節(從虛擬地址 0x00000000到0xBFFFFFFF),供各個進程使用,稱為“用戶空間)。因為每個進程可以通過系統調用進入內核,因此,Linux內核由系統內的所有進程共享。於是,從具體進程的角度來看,每個進程可以擁有4G字節的虛擬空間。

  通信方式:到目前Linux提供了9種機制完成內核與用戶空間的數據交換,分別是內核啟動參數、模塊參數與 sysfs、sysctl、系統調用、netlink、procfs、seq_file、debugfs和relayfs,其中模塊參數與sysfs、procfs、debugfs、relayfs是基於文件系統的通信機制,用於內核空間向用戶空間輸出信息;sysctl、系統調用是由用戶空間發起的通信機制。由此可見,以上均為單工通信機制,在內核空間與用戶空間的雙向互動數據交換上略顯不足。Netlink是基於socket的通信機制,由於socket本身的雙共性、突發性、不阻塞特點,因此能夠很好的滿足內核與用戶空間小量數據的及時交互,因此在Linux 2.6內核中廣泛使用,例如SELinux,Linux系統的防火墻分為內核態的netfilter和用戶態的iptables,netfilter與iptables的數據交換就是通過Netlink機制完成。

3.用戶態和內核態區別,如何從用戶態切換到內核態?

  用戶態和內核態是系統運行的兩個級別,主要用於系統的保護作用,他們和CPU沒有必然聯系。Intel cup提供了Ring0-Ring3四種運行級別,Ring0最高Ring3最低。Linux使用Ring0運行內核態Ring3運行用戶態。

  Ring3狀態不能訪問Ring0的地址空間,包括代碼和數據。Linux進程的4GB地址空間,3G-4G部 分大家是共享的,是內核態的地址空間,這裏存放在整個內核的代碼和所有的內核模塊,以及內核所維護的數據。用戶運行一個程序,該程序所創建的進程開始是運 行在用戶態的,如果要執行文件操作,網絡數據發送等操作,必須通過read、write、rcv、snd等系統調用,這些系統調用會調用內核中的代碼來完成操作,這時,必 須切換到Ring0,然後進入3GB-4GB中的內核地址空間去執行這些代碼完成操作,完成後,切換回Ring3,回到用戶態。這樣,用戶態的程序就不能 隨意操作內核地址空間,具有一定的安全保護作用。

  用戶態切換到內核態3種方式:

  1. 系統調用:

    用戶態主動切換到內核態的一種方式,主要通過系統調用函數將進程切換到內核態執行,如:fork、read、write、ioctl等。

  2. 異常

    當程序運行在用戶態時,系統發生了某種未知異常,系統將程序切換到處理此異常的內核態程序中,如:缺頁異常

  3. 外圍設備中斷

    註冊過中斷的外圍設備,當完成程序賦予的任務後會向系統發送中斷信號。此時CPU將停止執行下一條語句轉而進行跳轉執行中斷處理程序,此時系統就陷入了內核態。

Linux內核知識雜記