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

    文章

    1718

    浏览量

    84353
  • Linux
    +关注

    关注

    87

    文章

    10992

    浏览量

    206744
  • 框架
    +关注

    关注

    0

    文章

    297

    浏览量

    17045
  • 终端
    +关注

    关注

    1

    文章

    998

    浏览量

    29600
收藏 人收藏

    评论

    相关推荐

    现代 Linux 的五大初始化系统(1992-2015)

    系统在主流 Linux 脱颖而出,和本文中,我将你来看看在 Linux 操作系统最好的初始化系统。1. System V InitSystem V (SysV) 是一个在类 Unix 系统中最为成熟而且
    发表于 10-23 14:28

    linuxtty,控制台,虚拟终端,串口,console(控制台终端)详解

    , 可以在串口上连一两台字符哑终端. 但是linux偏要按POSIX标准把个人计算机当成小型机来用,那么就在控制台上通过getty软件虚拟了六个字符哑终端(或者叫控制台终端
    发表于 03-01 14:25

    终端、虚拟终端、shell、控制台、tty的区别

    文件系统一样,抽象出一层就可以了。tty层横空出世,tty的一边是操作系统,一边是不同的设备驱动。大家知道,在linux下所有的设备都是文件,那么假设我们要打印到显示器,只要write
    发表于 03-05 13:56

    浅析linux UART驱动tty架构

    关于linux UART驱动tty架构的理解
    发表于 07-03 09:55

    端口初始化初始化中断

    目录PA9(TX),PA10(RX)1、端口初始化2、初始化外设3、初始化中断4、使能中断5、使能外设5、发送数据PA9(TX),PA10(RX)1、端口初始化1.开启PA时钟2.PA
    发表于 08-16 06:54

    Display驱动初始化流程是怎样的?

    Display驱动初始化流程是怎样的?
    发表于 03-10 08:43

    Display驱动初始化的流程是怎样的?

    Display驱动初始化的流程是怎样的?
    发表于 03-10 07:08

    RK3288 Android6.0 Camera驱动初始化流程相关资料分享

    1、Camera驱动初始化流程是怎样的  Platform: RK3288  OS: Android 6.0  Kernel: 3.10.92  Camera驱动框架:  作者:Kri
    发表于 11-02 17:06

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

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

    Linux内存初始化

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

    Bootloader中LCD硬件初始化和软件驱动程序设计

    Android系统在正常启动中,刷屏功能一般在内核中执行,而Bootloader的任务应该是执行硬件初始化,并尽快跳转到Linux内核。在Bootloader启动过程中使能一个显示驱动,实现刷屏功能
    的头像 发表于 03-07 14:05 8593次阅读
    Bootloader中LCD硬件<b class='flag-5'>初始化</b>和软件<b class='flag-5'>驱动</b>程序设计

    你对Linux总线设备驱动框架是否了解

    Linux的设备驱动模型,或者说,Linux的设备驱动框架,都是同一个意思。应该这样理解,(Linux
    发表于 05-05 15:13 603次阅读

    Linux驱动程序框架介绍

    程序与操作系统内核的接口。通过file_operations(include/linux/fs.h)数据结构来完成的。  2.驱动程序与系统引导的接口。这部分利用驱动程序对设备进行初始化
    发表于 04-02 14:32 576次阅读

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

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

    tty驱动接口分析

    tty这个名称源于电传打字节的简称,在linux表示各种终端终端通常都跟硬件相对应。比如对应于输入设备键盘鼠标,输出设备显示器的控制终端
    的头像 发表于 07-14 12:21 591次阅读
    <b class='flag-5'>tty</b><b class='flag-5'>驱动</b>接口分析