天天看點

535_linux核心學習_printk函數以及終端操作

         全部學習彙總: https://github.com/GreyZhang/little_bits_of_linux

         這一次看一下printk。之前在其他地方看到過printk,當時看到的printk是把列印方式轉到了序列槽上。剛剛看到的核心代碼中出現了這個函數,接下來看看這個函數的實作。

535_linux核心學習_printk函數以及終端操作

         我看到的函數調用是在這裡,用到很多次。接下來,看看這個函數的實作。

535_linux核心學習_printk函數以及終端操作

         本身的功能不用說,肯定是類似printf的。這裡,先利用vsprintf做了一個格式轉換,接着是調用了終端列印函數console_print。看起來,這個會是這個函數實作的關鍵。

535_linux核心學習_printk函數以及終端操作

         函數的實作看上去簡單,涉及到了一段彙編。從内容看,應該是對顯示記憶體的直接操作。這裡面,有涉及到了兩個小函數的調用,分别是回車和換行。

535_linux核心學習_printk函數以及終端操作

         這個設計倒是有意思,函數參數沒用到,函數進行了變量的操作。相應的變量其實是宏,而不是變量,具體定義:

535_linux核心學習_printk函數以及終端操作
535_linux核心學習_printk函數以及終端操作

         其實是對這個量的一個操作,而這個應該應該有一個跟硬體的位址的綁定關系。這樣的操作通常會是在初始化的部分做。

535_linux核心學習_printk函數以及終端操作

         從注釋看,這裡的主要工作是初始化中斷,其他的都不做。一些顯示處理需要參考setup.s的彙編代碼。也好了解,系統啟動過程其實還是有一些顯示資訊要處理的。清屏等也需要調用tty_write來實作。看起來,繼續往下看,這個會是一個很龐大的資訊了。不過,可以大概聯想到這裡的實作方式。我繼續往下看的話,暫時了解下這個螢幕重新整理我覺得基本上這部分就可以結束了。暫時,我并不想與過多的硬體糾纏。

535_linux核心學習_printk函數以及終端操作

         螢幕的重新整理,應該是這個地方做的控制。

535_linux核心學習_printk函數以及終端操作

         相關的調用存在于終端初始化的函數調用中,也在tty的進行中,tty應該是關鍵接口。

535_linux核心學習_printk函數以及終端操作

         而這部分在鍵盤處理彙編代碼中觸發,應該是在鍵盤的資訊中斷中做的處理。

         最後,看看console.c代碼檔案的大概功能,順便就直接跳過這份代碼檔案了。

535_linux核心學習_printk函數以及終端操作

         其實,我這些疑惑看看這個檔案的注釋基本就可以得到解答。這個檔案實作的主要功能是終端IO,而且支援一些圖像以及顯示卡的操作。應該是别人貢獻的,而linus做了一個內建彙總。也不容易,還能夠工作并發展壯大到現在!

繼續閱讀