1. 程式人生 > >【Linux 驅動】驅動開發第一步----開發環境搭配

【Linux 驅動】驅動開發第一步----開發環境搭配

訊息列印級別:
fmt----訊息級別:

#define KERN_EMERG    "<0>"
#defineKERN_ALERT    "<1>"
#define KERN_CRIT     "<2>"
#define KERN_ERR      "<3>"
#define KERN_WARNING  "<4>"
#define KERN_NOTICE   "<5>"
#define KERN_INFO     "<6>"
#define KERN_DEBUG    "<7>"

 不同級別使用不同字串表示,數字越小,級別越高。
printk輸出跟輸出的日誌級別有關係,當輸出日誌級別比控制檯的級別高時,就會顯示在控制檯上,當比控制檯低時,則會記錄在/var/log/message中.但是當系統同時運行了klogd和syslogd時,都追加到/var/log/message.在/proc/sys/kernel/printk檔案中,前兩個整數為當前的日誌級別和預設的日誌級別(預設的日誌級別即為printk的輸出級別). 

注意:
需要開啟klogd和syslogd服務才能正常輸出。通過klogd可以改變系統訊息輸出級別。

 linux0.11為什麼在核心態使用printk()函式,而在使用者態使用printf()函式?
(1)  答:printk()函式是直接使用了向終端寫函式tty_write()。而printf()函式是呼叫write()系統呼叫函式向標準輸出裝置寫。所以在使用者態(如程序0)不能夠直接使用printk()函式,而在核心態由於他已是特權級,所以無需系統呼叫來改變特權級,因而能夠直接使用printk()函式。

printk是核心輸出,在終端是看不見的。  
 你可以看一下系統日誌。/var/log/message。  
 或者使用dmesg

命令看一下

不管你可能怎麼想,printk()並不是設計用來同用戶互動的,雖然我們在hello-1就是出於這樣的目的使用它!它實際上是為核心提供日誌功能記錄核心資訊或用來給出警告。因此,每個printk()宣告都會帶一個優先順序,就像你看到的<1>KERN_ALERT那樣。核心總共定義了八個優先順序的巨集,所以你不必使用晦澀的數字程式碼,並且你可以從檔案linux/kernel.h檢視這些巨集和它們的意義。如果你不指明優先順序,預設的優先順序DEFAULT_MESSAGE_LOGLEVEL將被採用。

閱讀一下這些優先順序的巨集。標頭檔案同時也描述了每個優先順序的意義。在實際中,使用巨集而不要使用數字,就像

<4>。總是使用巨集,就像KERN_WARNING

當優先順序低於int console_loglevel,資訊將直接列印在你的終端上。如果同時syslogdklogd都在執行,資訊也同時新增在檔案/var/log/messages,而不管是否顯示在控制檯上與否。我們使用像KERN_ALERT這樣的高優先順序,來確保printk()將資訊輸出到控制檯而不是隻是新增到日誌檔案中。當你編寫真正的實用的模組時,你應該針對可能遇到的情況使用合適的優先順序。