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 函数。
手持气象站的应用领域以及它的使用效果的介绍
OpenAI发布iOS版ChatGPT,支持语音提问!上架不到12个小时,下载量飙升!
集成电路迎爆发期 产业规模高达数千亿元
五分钟了解福特1.0T发动机技术
百度AI原生应用新进展抢先看 文心一言 Apollo 网盘、如流、GBI、智舱、千帆
Linux终端初始化和tty驱动框架
高压直流输电原理图_高压直流输电应用
2022年电动汽车销量有望创新高
区块链如何彻底改变众筹行业
AMD只用7nm的的中端样品就达成了媲美i9-9900K的多核性能
中国联通5G打造智慧医疗新模式
微雪电子XNUCLEO-F411RE STM32开发板简介
Alienware15怎么样?Alienware15上手体验:强劲的电竞机皇
2019年底将有超过1200万家庭拥有智能音箱
云承载网方式构建新型网络--云专线
NPC2三电平拓扑横管过压保护开关逻辑
因产地与实际宣传不符 夏普公司在国内被告上法庭
5W电源管理ic U62113满足小家电的微需求
机器视觉检测中如何提高检测图像处理速度
互感器作用和特点分析