0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux终端初始化和tty驱动框架

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:Jasonangel 2023-09-28 16:33 次阅读

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 函数。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动
    +关注

    关注

    11

    文章

    1613

    浏览量

    83833
  • Linux
    +关注

    关注

    85

    文章

    10263

    浏览量

    205820
  • 框架
    +关注

    关注

    0

    文章

    264

    浏览量

    16958
  • 终端
    +关注

    关注

    1

    文章

    879

    浏览量

    29450
收藏 人收藏

    评论

    相关推荐

    手机模块初始化向导

    初始化向导:为了刚好的对手机模块进行初始化,所以把最基本的向导写下来.本向导适用于本公司的西门子TC35I和华为GT9000模块。一、在初始化手机模块前,请先确定DT
    发表于 09-18 09:41 17次下载

    LINUX系统引导和初始化-LINUX内核解读

    Linux 的系统引导和初始化 ----------Linux2.4.22内核解读之一 一、 系统引导和初始化概述 相关代码(引导扇区的程序及其辅助程序,以 x86体系为例): \linux-2.4.22\arch\i386\boot\bootsect.S:Lin
    发表于 11-03 22:31 53次下载

    RDA1846S初始化设置

    初始化设置RDA1846S初始化设置RDA1846S初始化设置
    发表于 01-15 17:08 70次下载

    UCOS_III_配置与初始化

    发表于 12-20 22:53 5次下载

    HX711初始化程序

    初始化程序
    发表于 02-08 01:51 83次下载

    Linux内存初始化

    初始化,确实感觉这部分内容蛮复杂的。这两天在看Linux内核启动中内存的初始化,也是看的云里雾里的,想尝试下边看边写,在写博客的过程中慢慢思考,最后也能把自己
    发表于 10-12 11:16 0次下载

    IIC总线初始化基本驱动参考程序应用代码免费下载

    初始化基本驱动参考程序应用代码免费下载。程序功能:为IIC总线的基本驱动程序(此程序没有写主函数,只是一些IIC必备的子函数)
    发表于 01-16 08:00 4次下载
    IIC总线<b>初始化</b>基本<b>驱动</b>参考程序应用代码免费下载

    在51平台下初始化文件的引入导致全局变量无法初始化的问题如何解决

    初始化文件的引入导致全局变量无法初始化的问题如何解决。
    发表于 08-20 17:31 0次下载
    在51平台下<b>初始化</b>文件的引入导致全局变量无法<b>初始化</b>的问题如何解决

    Nand Flash驱动(实现初始化以及读操作)

    驱动(实现初始化以及读操作)
    发表于 12-02 12:36 10次下载
    Nand Flash<b>驱动</b>(实现<b>初始化</b>以及读操作)

    8253初始化程序分享_8253应用案例

    初始化要求及编程,最后用一个例子介绍了8253的初始化程序。
    发表于 05-23 15:52 1.9w次阅读
    8253<b>初始化</b>程序分享_8253应用案例

    Linux内核初始化过程中的调用顺序

    初始化时内核会通过这些函数指针调用这些__init函数指针,并在整个初始化完成后,释放整个init区段(包括.init.text,.initcall.init等)。
    发表于 05-12 08:40 1397次阅读

    C++之初始化列表学习的总结

    初始化列表对成员进行初始化
    的头像 发表于 12-24 17:39 416次阅读

    RT-Thread自动初始化机制

    初始化机制](https://www.rt-thread.org/document/site
    的头像 发表于 06-17 08:52 1365次阅读
    RT-Thread自动<b>初始化</b>机制

    RT-Thread自动初始化详解

    初始化后,就需要在主函数中进行调用。当我们使用RT-Thread后,完全不需要这样做了,我们可以将硬件等自动初始化。 RT-Thread 自动初始化机制是指
    的头像 发表于 06-25 21:38 7799次阅读
    RT-Thread自动<b>初始化</b>详解

    tty驱动接口分析

    tty这个名称源于电传打字节的简称,在linux表示各种终端终端通常都跟硬件相对应。比如对应于输入设备键盘鼠标,输出设备显示器的控制终端和串口终端。也有对应于不存在设备的pty驱动。在如此众多的终端模型之中,linux是怎么将它们统
    的头像 发表于 07-14 12:21 178次阅读
    <b>tty</b><b>驱动</b>接口分析