20135307張嘉琪git
printk()和printf()在使用上最主要的區別就是前者能夠指定一個日誌級別。算法
內核根據這個級別來判斷是否在終端上打印消息。安全
內核把級別比某個特定值低的全部消息顯示在終端上。架構
內核消息都被保存在一個LOGBUFLEN大小的環形隊列中。該緩衝區大小能夠在編譯時經過設置CONFIG_LOGBUFSHIFT進行調整。在單處理器的系統上其默認值是16KB。換句話說,就是內核在同一時間只能保存16KB的內核消息。若是消息隊列已經達到最大值,那麼若是再有printk()調用時,新消息將覆蓋隊列中的老消息。這個記錄緩衝區之因此稱爲環形是由於它的讀寫都是按照環形隊列方式進行操做的。編輯器
使用環形隊列有許多好處。因爲同時讀寫環形緩衝區時,其同步問題很容易解決,因此即便在中斷上下文中也能夠方便地使用printfk()。此外,它使記錄維護起來也更容易。若是有大量的消息同時產生,新消息只需覆蓋掉舊消息便可。在某個問題引起大量消息的時候。記錄只會覆蓋掉它自己,而不會由於失控而消耗掉大量內存。而環形緩衝區的惟一缺點——可能會丟失消息可是與簡單性和健壯性的好處相比這點代價是值得的。函數
oops是內核告知用戶有不行法神最經常使用的方式。工具
oops中包含的重要信息對於全部體系結構都是徹底相同的:寄存器上下文和回溯線索。oop
回溯線索顯示了致使錯誤發生的函數調用鏈。這樣咱們就能夠觀察究竟發生了什麼:機器處於空閒狀態,正在執行idle循環,由cpuidle()循環調用defaultidle()。此時定時器中斷產生了,它引發了對定時器的處理,tulip_timer()這個定時器處理函數被調用,而就是它引用了空指針。甚至能夠經過偏移量找出致使問題的語句。性能
一些內核調用能夠用來方便標記bug方便標記bug提供斷言並輸出信息。最經常使用的兩個是BUG()和些聲明BUG_ON()。當被調用的時候,它們會引起oops,致使棧的回溯和錯誤信息的打印。大部分體系結構把BUG()和BUG_ON()定義成某種會致使oops跟硬件的體系結構是相關的非法操做,這樣天然會產生須要的oops。能夠把這些調用當作斷言使用,想要斷言某種狀況不應發生。測試
18.7 神奇的系統請求鍵
系統請求鍵功能能夠經過定義CONFIGMAGICSYSRQ配置選項來啓用。
當該功能被啓用的時候,不管內核處於什麼狀態,均可以經過特殊的組合鍵跟內核進行通訊。這種功能可讓你在面對一臺奄奄一息的系統時能完成一些有用的工做。除了配置選項之外,還要經過一個sysctl用來標記該特性的開或關。
須要啓用它時使用以下命令:echo 1> /proc/sys/kernel/sysrq
。