使用printk的注意點

2021-07-22 21:56:08 字數 675 閱讀 5670

核心開發中,使用printk十分常見,但是也要注意,一次隊友在開發中,想要列印乙個大緩衝區的資料,就用printk列印,但是只能列印前約1k的資料,後來發現printk的實現中,臨時緩衝區確實有log_line_max限制,現在簡單總結下注意點:

1.printk的實現很低效,不要在核心大量列印,尤其是在某些效能測試中,中斷上下文盡量少用,有可能大量的printk導致系統crash,親身經歷過。

2.核心在切換模式時不儲存處理器的浮點狀態,因此printk並不支援浮點數運算。

3.printk使用的「ring buffer」,如果來不及重新整理到syslog中,日誌有可能被覆蓋,即資料丟失。printk函式執行時首先設法獲取控制台訊號量,然後將要輸出的字元儲存到控制台的日誌緩衝區,再呼叫控制台驅動程式來重新整理緩衝區。若printk無法獲得控制台訊號量,則只能把要輸出的字元儲存到日誌緩衝區,並依賴擁有控制台訊號量的程序來重新整理這個緩衝區。printk函式會將資料儲存到日誌緩衝區,但是為了安全考慮,在這之前需要使用日誌緩衝區鎖,保證併發呼叫printk的安全性。

4.核心啟動初期,是無法使用printk輸出在終端上的,只有在終端和控制台被初始化後,才能輸出到終端。

簡單提及下使用者態的printf,可利用fprintf(log->file, "%s", info);//設定log->file可以將日誌記錄到指定位置,stderr,syslog或者指定檔案中等。

printk函式的使用

printk是在核心中執行的向控制台輸出顯示的函式,linux核心首先在核心空間分配乙個靜態緩衝區,作為顯示用的空間,然後呼叫sprintf,格式化顯示字串,最後呼叫tty write向終端進行資訊的顯示。printk與printf的差異,是什麼導致乙個執行在核心態而另乙個執行使用者態?其實這兩個函...

使用Knockout的注意點

1.值更改觸發時間 更改view後,焦點離開當前dom元素,view model的值就改變。你可以設定valueupdate afterkeydown 使得view值改變,view model值立馬改變 類似於onkeyup事件 更改view model後,view的值立馬改變。2.注意引用傳遞和值...

goto 的使用注意點

使用goto不能跳過變數得初始化 例子 goto test int i string str test 為什麼這裡通不過編譯呢?把string str 這一句拿到goto之前就可以了?為什麼後面的int i 這一句不需要拿到goto之前呢?解答 在c primer中倒是提到,goto 不能向前跳過變...