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

IIC總線初始化基本驅(qū)動(dòng)參考程序應(yīng)用代碼免費(fèi)下載

Linux內(nèi)核初始化過程中的調(diào)用順序
在51平臺下初始化文件的引入導(dǎo)致全局變量無法初始化的問題如何解決

Nand Flash驅(qū)動(dòng)(實(shí)現(xiàn)初始化以及讀操作)

tty驅(qū)動(dòng)接口分析

MSP430F5529硬件IIC驅(qū)動(dòng)OLED(初始化使用的寄存器)
基于旋轉(zhuǎn)平移解耦框架的視覺慣性初始化方法

評論