initcall機制
注意上述流程,我們來理解一下 initcall 機制:
普通我們寫一個程序,想要它被調用,需要在主流程中調用這個函數,才算被調用。
那么這種方式如果放在 Linux 中,是難以想象的,我們自己寫的代碼要在多少個地方聲明。
而你如果采用initcall機制,意思就是說,你使用一個字符串聲明你的驅動初始化函數,那么所有的驅動初始化函數都存在內存中一個連續的段中,系統啟動以后,會從這個段的第一個函數開始,一個一個遍歷,進而一個一個調用,這就是initcall 機制。這就是為什么我們寫驅動只需要使用 module_init 聲明,編譯進去即可自動被調用的原因!!!
System.map
編譯后的內核根目錄 System.map 文件記載了所有的驅動加載順序,如果你不確定驅動的加載順序,在這里查看就可以,每次編譯 Linux 內核就會產生一個新的 System.map。
tty 驅動
我們不要把 tty 驅動和 串口驅動 弄混了,tty 驅動架構如下:
其中 tty driver 等價于我們普通寫的驅動,可以自己寫。
也就是說,在 tty 驅動框架主要有三層:tty core、tty line discipline、tty driver,另外最上層是用戶空間,最下層是硬件。
tty core 稱之為 tty 核心,主要作用是向用戶提供統一的接口。
tty line discipline 稱之為 tty 線路規程,主要從上下兩層接收數據,并按照一定協議進行轉換,比如 ppp 或者藍牙協議,這樣你的tty 終端就不止可以用普通的串口,還可以通過其他協議訪問到我們的系統。比如手機鏈接 PCB 板子的 WiFi 接入系統控制終端,輸入 ls、cd等命令。這一層并不是必須的,你可以直接使用驅動和 tty core 進行通信,但一般這一層都會有。
tty driver 就是我們常說的串口驅動。
在 console_init 函數中,它做的兩件事,就是注冊 tty 線路規程,注冊 tty 驅動,tty 核心是包含在內核當中的。tty 線路規程和tty 驅動可以有很多個。
有的人會有疑問,為什么有了 tty 驅動了,還會有一個 tty 線路規程。得益于 Linux 模塊化的思想,這里主要是為了分層與隔離。tty驅動只和硬件相關,只解析基本的硬件信息,把硬件信息轉換成字符。所有的對字符的進一步處理包括加入藍牙協議傳輸,監控數據等都放在 tty 線路規程當中。這樣 tty
驅動是可以完美復用和移植的。
分享一張彭大佬的圖,本文我只講了概念,彭大佬講解過 tty 源碼:
這里只需要注意一點,在右下角,tty driver 是沒有 read 函數的,tty driver 層有 buffer,輸入的數據會存儲在buffer 中,被讀取。
原因很簡單,對于 tty 來說,輸入設備和輸出設備不是同一個設備,輸入設備是鍵盤,輸出設備是屏幕,這和普通的 IIC、SPI驅動同一個設備不一樣。因此在設計上 tty driver 沒有 read 函數。
-
驅動
+關注
關注
12文章
1840瀏覽量
85307 -
Linux
+關注
關注
87文章
11310瀏覽量
209603 -
框架
+關注
關注
0文章
403瀏覽量
17500 -
終端
+關注
關注
1文章
1136瀏覽量
29906
發布評論請先 登錄
相關推薦
評論