0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux終端初始化和tty驅(qū)動框架

麥辣雞腿堡 ? 來源:嵌入式Linux系統(tǒng)開發(fā) ? 作者:Jasonangel ? 2023-09-28 16:33 ? 次閱讀

initcall機制

注意上述流程,我們來理解一下 initcall 機制:

普通我們寫一個程序,想要它被調(diào)用,需要在主流程中調(diào)用這個函數(shù),才算被調(diào)用。

那么這種方式如果放在 Linux 中,是難以想象的,我們自己寫的代碼要在多少個地方聲明。

而你如果采用initcall機制,意思就是說,你使用一個字符串聲明你的驅(qū)動初始化函數(shù),那么所有的驅(qū)動初始化函數(shù)都存在內(nèi)存中一個連續(xù)的段中,系統(tǒng)啟動以后,會從這個段的第一個函數(shù)開始,一個一個遍歷,進而一個一個調(diào)用,這就是initcall 機制。這就是為什么我們寫驅(qū)動只需要使用 module_init 聲明,編譯進去即可自動被調(diào)用的原因?。?!

System.map

編譯后的內(nèi)核根目錄 System.map 文件記載了所有的驅(qū)動加載順序,如果你不確定驅(qū)動的加載順序,在這里查看就可以,每次編譯 Linux 內(nèi)核就會產(chǎn)生一個新的 System.map。

tty 驅(qū)動

我們不要把 tty 驅(qū)動和 串口驅(qū)動 弄混了,tty 驅(qū)動架構(gòu)如下:

圖片

其中 tty driver 等價于我們普通寫的驅(qū)動,可以自己寫。

也就是說,在 tty 驅(qū)動框架主要有三層:tty core、tty line discipline、tty driver,另外最上層是用戶空間,最下層是硬件。

tty core 稱之為 tty 核心,主要作用是向用戶提供統(tǒng)一的接口。

tty line discipline 稱之為 tty 線路規(guī)程,主要從上下兩層接收數(shù)據(jù),并按照一定協(xié)議進行轉(zhuǎn)換,比如 ppp 或者藍牙協(xié)議,這樣你的tty 終端就不止可以用普通的串口,還可以通過其他協(xié)議訪問到我們的系統(tǒng)。比如手機鏈接 PCB 板子的 WiFi 接入系統(tǒng)控制終端,輸入 ls、cd等命令。這一層并不是必須的,你可以直接使用驅(qū)動和 tty core 進行通信,但一般這一層都會有。

tty driver 就是我們常說的串口驅(qū)動。

在 console_init 函數(shù)中,它做的兩件事,就是注冊 tty 線路規(guī)程,注冊 tty 驅(qū)動,tty 核心是包含在內(nèi)核當中的。tty 線路規(guī)程和tty 驅(qū)動可以有很多個。

有的人會有疑問,為什么有了 tty 驅(qū)動了,還會有一個 tty 線路規(guī)程。得益于 Linux 模塊化的思想,這里主要是為了分層與隔離。tty驅(qū)動只和硬件相關(guān),只解析基本的硬件信息,把硬件信息轉(zhuǎn)換成字符。所有的對字符的進一步處理包括加入藍牙協(xié)議傳輸,監(jiān)控數(shù)據(jù)等都放在 tty 線路規(guī)程當中。這樣 tty
驅(qū)動是可以完美復用和移植的。

分享一張彭大佬的圖,本文我只講了概念,彭大佬講解過 tty 源碼:

圖片

這里只需要注意一點,在右下角,tty driver 是沒有 read 函數(shù)的,tty driver 層有 buffer,輸入的數(shù)據(jù)會存儲在buffer 中,被讀取。

原因很簡單,對于 tty 來說,輸入設(shè)備和輸出設(shè)備不是同一個設(shè)備,輸入設(shè)備是鍵盤,輸出設(shè)備是屏幕,這和普通的 IIC、SPI驅(qū)動同一個設(shè)備不一樣。因此在設(shè)計上 tty driver 沒有 read 函數(shù)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 驅(qū)動
    +關(guān)注

    關(guān)注

    12

    文章

    1840

    瀏覽量

    85296
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11304

    瀏覽量

    209542
  • 框架
    +關(guān)注

    關(guān)注

    0

    文章

    403

    瀏覽量

    17491
  • 終端
    +關(guān)注

    關(guān)注

    1

    文章

    1135

    瀏覽量

    29889
收藏 人收藏

    評論

    相關(guān)推薦

    手機模塊初始化向?qū)?/a>

    手機模塊初始化向?qū)?為了剛好的對手機模塊進行初始化,所以把最基本的向?qū)懴聛?本向?qū)нm用于本公司的西門子TC35I和華為GT9000模塊。一、在初始化手機模塊前,請先確定DT
    發(fā)表于 09-18 09:41 ?17次下載

    LINUX系統(tǒng)引導和初始化-LINUX內(nèi)核解讀

    Linux 的系統(tǒng)引導和初始化 ----------Linux2.4.22內(nèi)核解讀之一 一、 系統(tǒng)引導和初始化概述 相關(guān)代碼(引導扇區(qū)的程序及其輔助程序,以 x86體系為例): \
    發(fā)表于 11-03 22:31 ?53次下載

    RDA1846S初始化設(shè)置

    RDA1846S初始化設(shè)置RDA1846S初始化設(shè)置RDA1846S初始化設(shè)置
    發(fā)表于 01-15 17:08 ?0次下載

    UCOS_III_配置與初始化

    UCOS_III_配置與初始化
    發(fā)表于 12-20 22:53 ?5次下載

    HX711初始化程序

    這是HX711的初始化程序
    發(fā)表于 02-08 01:51 ?90次下載

    Linux內(nèi)存初始化

    之前有幾篇博客詳細介紹了Xen的內(nèi)存初始化,確實感覺這部分內(nèi)容蠻復雜的。這兩天在看Linux內(nèi)核啟動中內(nèi)存的初始化,也是看的云里霧里的,想嘗試下邊看邊寫,在寫博客的過程中慢慢思考,最后也能把自己
    發(fā)表于 10-12 11:16 ?0次下載

    8253初始化程序分享_8253應(yīng)用案例

    本文首先介紹了8253概念及8253各通道的工作方式,其次詳細介紹了8253初始化要求及編程,最后用一個例子介紹了8253的初始化程序。
    發(fā)表于 05-23 15:52 ?2.2w次閱讀
    8253<b class='flag-5'>初始化</b>程序分享_8253應(yīng)用案例

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

    本文檔的主要內(nèi)容詳細介紹的是IIC總線初始化基本驅(qū)動參考程序應(yīng)用代碼免費下載。程序功能:為IIC總線的基本驅(qū)動程序(此程序沒有寫主函數(shù),只是一些IIC必備的子函數(shù))
    發(fā)表于 01-16 08:00 ?5次下載
    IIC總線<b class='flag-5'>初始化</b>基本<b class='flag-5'>驅(qū)動</b>參考程序應(yīng)用代碼免費下載

    Linux內(nèi)核初始化過程中的調(diào)用順序

    所有的__init函數(shù)在區(qū)段.initcall.init中還保存了一份函數(shù)指針,在初始化時內(nèi)核會通過這些函數(shù)指針調(diào)用這些__init函數(shù)指針,并在整個初始化完成后,釋放整個init區(qū)段(包括.init.text,.initcall.init等)。
    發(fā)表于 05-12 08:40 ?1614次閱讀

    在51平臺下初始化文件的引入導致全局變量無法初始化的問題如何解決

    本文檔的主要內(nèi)容詳細介紹的是在51平臺下初始化文件的引入導致全局變量無法初始化的問題如何解決。
    發(fā)表于 08-20 17:31 ?0次下載
    在51平臺下<b class='flag-5'>初始化</b>文件的引入導致全局變量無法<b class='flag-5'>初始化</b>的問題如何解決

    C++之初始化列表學習的總結(jié)

    類中可以使用初始化列表對成員進行初始化。
    的頭像 發(fā)表于 12-24 17:39 ?849次閱讀

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

    Nand Flash驅(qū)動(實現(xiàn)初始化以及讀操作)
    發(fā)表于 12-02 12:36 ?11次下載
    Nand Flash<b class='flag-5'>驅(qū)動</b>(實現(xiàn)<b class='flag-5'>初始化</b>以及讀操作)

    tty驅(qū)動接口分析

    tty這個名稱源于電傳打字節(jié)的簡稱,在linux表示各種終端,終端通常都跟硬件相對應(yīng)。比如對應(yīng)于輸入設(shè)備鍵盤鼠標,輸出設(shè)備顯示器的控制終端
    的頭像 發(fā)表于 07-14 12:21 ?1140次閱讀
    <b class='flag-5'>tty</b><b class='flag-5'>驅(qū)動</b>接口分析

    MSP430F5529硬件IIC驅(qū)動OLED(初始化使用的寄存器)

    MSP430F5529硬件IIC驅(qū)動OLED(初始化使用的寄存器)
    發(fā)表于 11-24 16:36 ?1次下載

    基于旋轉(zhuǎn)平移解耦框架的視覺慣性初始化方法

    精確和魯棒的初始化對于視覺慣性里程計(VIO)至關(guān)重要,因為不良的初始化會嚴重降低姿態(tài)精度。
    的頭像 發(fā)表于 11-01 10:16 ?361次閱讀
    基于旋轉(zhuǎn)平移解耦<b class='flag-5'>框架</b>的視覺慣性<b class='flag-5'>初始化</b>方法