Linux驱动

字符设备驱动模型

在这里插入图片描述
在字符设备中使用struct cdev这种结构来描述设备。
在这里插入图片描述
应用程序:读写文件,点灯;获取按键。用一些接口调用驱动程序去实现一些引用。

open这些函数,是C库实现的。从而进入内核,C库怎么进入内核?本质上,这些函数对应的汇编指令会引发一个异常,类似于中断一样,发生了就会进入相应的异常处理函数(进入到了内核空间)。根据发生异常的原因,调用不同的处理函数,比如sys_open,sys_read函数等 (内核的接口处就是系统调用的接口)。

最简单的莫过于led:
在这里插入图片描述
中间就依赖于驱动程序框架。

过程:

  1. 应用程序是有设备号的。应用程序会经过C库进入内核,内核最后会去调用驱动。
  2. 具体怎么通过内核找到驱动中的具体实现,就是框架中实现的。
  3. 在chrdev这个数组中找到file_operation这个 结构。这个结构是从驱动程序实现的。(驱动程序中就实现了这些led_open ,led_read ,led_write函数,以及file_operation结构体,这个结构体就有.open,指向我们写的led_open。)
  4. 然后入口函数这边,用register_chrdev函数,将结构体放到主设备号中。
    在这里插入图片描述
    file_operations 的结构体,此结构体就是 Linux 内核驱动操作函数集合。

驱动运行的方式有两种,其中有一种就是将驱动编译为模块,启动内核的时候,就使用命令加载驱动模块。这里就涉及到两个函数:

module_init(xxx_init); //注册模块加载函数  入口函数
module_exit(xxx_exit); //注册模块卸载函数 出口函数

字符设备注册和注销:

static inline int register_chrdev(unsigned int major, const char *name,const struct file_operations *fops)
static inline void unregister_chrdev(unsigned int major, const char *name)

一般字符设备的注册在入口函数中进行,字符设备的注销在出口函数中进行。

现在,我们可以看到已经定义了file_operations结构体,这个结构体就是设备的具体操作函数。现在就需要对用到的函数尽心初始化。比如open /realease/read/write。

附上面试题:

  1. TCP和UDP的区别?
  2. I2C驱动的框架
  3. 双链表怎么删除节点
  4. 编译的条件
  5. makefile的作用?gcc的作用?
  6. 代码生成可执行程序的过程?
  7. 中断切换的过程?
  8. 中断前的进程上下文保存在栈里,保存在哪个栈?
  9. 为什么有MMU,MMU有什么作用?
  10. 用过哪些系统调用,切换到内核态的接口API?
  11. 编译过程
  12. 链接分为哪些种类(动,静,装载时链接)
  13. 栈的大小由什么决定
  14. 栈的增长方式socket三种类型
  15. 内核中如何查找优先级
  16. MMU的简单介绍,具体实现
  17. new和malloc的区别
  18. 内核分配内存的方法
  19. 智能指针的底层实现
  20. 如何避免内存泄漏
  21. I2C和SPI 的区别
  22. 线程池和进程池的区别
  23. 同步与竞争
  24. 自旋锁和互旋锁的区别
  25. 数据结构中队列和栈的区别
  26. SD与EMMC。(汇川)
  27. PWM设置的流程
  28. SPI是全双吗?怎么判断
  29. CPU主频是多少
  30. 面向对象和面向过程的区别
  31. RTOS的实时性是如何保的
  32. CAN通信了解吗
  33. 内核管理硬件的方式
  34. 对缓存的理解
  35. SPI通信过程
  36. 对中断的理解。优先级反转用抢占不会乱掉吗
  37. ARM有多少个寄存器
  38. 字符设备有哪些?和块设备的区别

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/299845.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

udp多播/组播那些事

多播与组播 多播(multicast)和组播(groupcast)是相同的概念,用于描述在网络中一对多的通信方式。在网络通信中,单播(unicast)是一对一的通信方式,广播(broad…

IDEA相关操作

目录 连接MySQL IDEA配置Maven 配置全局Maven 导入Maven项目 方法一 方法二 安装Mybatisx插件 连接MySQL 填写user和Password之后测试连接 如果是第一次连接需要联网下载数据库连接驱动,安装提示下载即可 如果显示如下错误需要更改时区 Server returns …

count distinct在spark中的运行机制

文章目录 预备 数据和执行语句Expand第一次HashAggregateShuffle and Second HashAggregate最后结果性能原文 预备 数据和执行语句 SELECT COUNT(*), SUM(items), COUNT(DISTINCT product), COUNT(DISTINCT category) FROM orders;假设源数据分布在两个1核的结点上&#xff0…

【DevOps 工具链】软件版本号命名规范 - 3种规则(读这一篇就够了)

文章目录 1、简述2、常见软件的版本号命名规则3、版本号命名规范整理3.1、XYZ/MMP3.1.1、规则3.1.2、确定3.1.3、举例3.1.4、详细规则 3.2、XYZD/MMPD3.3、VRC3.3.1、规则3.3.2、对"Vxxx"的说明3.3.3、对"Rxxx"的说明3.3.4、对"LLL"的说明3.3.5、…

算法导论复习(四)主方法的专题

主方法我们要记住的是什么呢?

Java原来可以这么玩!CV实现多张图片生成视频

前言 比如我像将几张图片变成一个视频的形式发不到短视频平台,虽然短视频平台也有上传图片变成视频的功能,但是我想要具体控制每张图片显示多久后切换到下一个图片,短视频平台目前无法实现,于是乎,我用java代码实现了…

2023版本QT学习记录 -6- UDP通信之UDP接收端

———————UDP接收端——————— 🎄动图演示 🎄发送端通信步骤思维导图 🎄添加组件 QT core gui network🎄添加头文件 #include "qudpsocket.h"🎄创建接收对象 QUdpSocket *recvsocket;&…

JAVA JDK8时间类之Period、Duration、ChronoUnit的使用【详解】

JAVA JDK8时间类之Period、Duration、ChronoUnit的使用 1. Duration1.1 简介:用于时间间隔(秒、毫秒、纳秒等)1.2 案例 2. Period时间间隔(年、月、日)2.1 简介2.2 案例 3. ChronoUnit3.1 简介案例 4. 案例所有代码: 1. Duration 1.1 简介:用…

基于AT89C51单片机的8位密码锁仿真与实物制作

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/88657969?spm1001.2014.3001.5503 源码获取 C 源码仿真图毕业设计实物制作步骤01 摘要 在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表…

Python如何使用数据库的连接池

Python 数据库连接池 python编程中可以使用pymysql进行数据库连接及增删改查操作,但每次连接mysql请求时,都是独立的去请求访问,比较浪费资源,而且访问数量达到一定数量时,对mysql的性能会产生较大的影响。因此实际使…

QT trimmed和simplified

trimmed:去除了字符串开头前和结尾后的空白; simplified:去除了字符串开头前和结尾后的空白,以及中间内部的空白字符也去掉(\t,\n,\v,\f,\r和 ) 代码: QString str " 1 2 3 4 5 …

主机安全技术措施

目录 身份鉴别 进阶 访问控制 进阶 安全审计 进阶 ​编辑 剩余信息保护 入侵防范 进阶 恶意代码防范 资源控制 身份鉴别 进阶 访问控制 进阶 安全审计 进阶 剩余信息保护 入侵防范 进阶 恶意代码防范 资源控制 ~over~