
Linux驱动
文章平均质量分 53
托马斯-木
这个作者很懒,什么都没留下…
展开
-
11、内核驱动竞争和并发(共享资源保护)
使用自旋锁会禁止抢占,单核CPU中 A进程获得自旋锁,并且进入休眠状态,B进程也想获得自旋锁,但此时被A占用 获取不到,CPU的抢占被禁止了,进程B无法调度出去,A进程就会一直不能释放自旋锁 就导致 死锁的产生;为了保护共享资源提出的一种锁机制,内核中比较常见,已原地等待的方式解决资源冲突,当资源被占用后,其他线程获取不到,只能原地打转。6、在同时使用信号量和自旋锁时,要先获取信号量 再使用自旋锁,因为信号量会导致休眠,所以不能放在自旋锁的后面;1、自旋锁里的临界区代码不能太多,会占用系统资源。原创 2024-08-02 13:10:20 · 460 阅读 · 0 评论 -
10、字符设备和杂项设备开发流程
静态分配------------------register_chrdev_region()卸载 设备号 --------unregister_chrdev_region。动态分配----------- -alloc_chrdev_region()创建一个设备 ---------device_create。初始化cdev-------------cdev_init。注册cdev-------------- cdev_add。卸载设备 -------class_device。应用层 mknod 命令。原创 2024-08-02 11:14:12 · 565 阅读 · 0 评论 -
9、LED驱动
2、配置GPIO的寄存器(复用关系、方向、数据寄存器)3、驱动代码里使用ioremap 获取寄存器的虚拟地址。1、确定LED是哪个GPIO,通过看原理图确认。原创 2024-08-02 11:02:58 · 301 阅读 · 0 评论 -
8、驱动错误处理
常使用goto语句对错误进行返回。原创 2024-08-01 17:28:48 · 244 阅读 · 0 评论 -
7、杂项设备驱动
杂项设备使用结构体 miscdevice进行描述,定义在: include/linux/miscdevice.h。杂项设备的主设备号是相同的 10,次设备号是不同的,主设备号相同可以节省内核资源。字符设备: IO传输过程中以字符为单位,没有缓冲,比如:i2c spi。块设备: IO 传输过程中以块为单位。和存储有关的,TF卡 硬盘。杂项设备是字符设备的一种,自动生成设备节点,降低了开发难度。cat /proc/misc 可以查看杂项设备。网络设备:以socket 套接字来访问;原创 2024-08-01 17:04:01 · 250 阅读 · 0 评论 -
6、注册字符类设备(使用文件私有数据)
结构体中,专门为用户留了一个域用于定义私有数据。这意味着,在编写Linux驱动时,开发者可以在这个域中存储与文件相关的私有数据,这些数据对于驱动来说是私有的,不会被其他部分(如内核的其他部分或用户空间的程序)直接访问。尽管Linux本身并没有明确规定要使用文件私有数据。这实际上是Linux驱动遵循的一种“潜规则”,体现了Linux面向对象的思想。原创 2024-07-31 17:28:07 · 264 阅读 · 0 评论 -
5、注册字符类设备
Linux中通过udev来实现设备节点的创建和删除,udev是一个用户程序,可以根据系统中设备的状态来创建或者删除设备节点,比如说,如果驱动程序成功加载到Linux时,会自动在/dev目录下创建相对应的设备节点,当驱动程序卸载时,会自动删除/dev目录下的设备节点,应用层和内核不能直接进行数据传输,可以使用 copy_from_user,copy_to_user,需要包含头文件 Linux/uaccess.h,这些函数提供了对访问违规(如地址无效或越界)的检查,从而增加了内核的稳定性。原创 2024-07-31 17:03:53 · 869 阅读 · 0 评论 -
4、驱动设备号
Linux 规定 每个字符设备或者块设备必须有一个专属的设备号;一个设备号由主设备号 和次设备号组成;原创 2024-07-31 03:15:00 · 465 阅读 · 0 评论 -
3、内核模块符号导出
驱动程序可以编译成内核文件,就是KO文件,每个Ko文件时相互独立的,模块之间无法相互访问,但是某些场景下可能需要互相访问,例如B模块要引用A模块里的函数,就需要用到符号表;使用宏 EXPORT_SYMBOL 和 EXPORT_SYMBOL_GPL 导出符号到内核符号表中。符号就是内核中的函数名、全局定义的一些变量;导出的符号可以被其他模块使用;先加载a.ko 后加载b.ko。符号表:记录符号的文件;使用前需要声明一下;原创 2024-07-31 00:45:00 · 302 阅读 · 0 评论 -
2、驱动模块传参
基本类型:char /bool/int /long/short/byte/ushort/uint.1、设置驱动的相关参数,驱动程序更灵活 ,比如 缓冲区大小。就是驱动模块加载传递参数给我们的驱动。2、设置安全校验,防止驱动被别人盗用。通过命令可以查看 传参的描述信息。字符串:string。原创 2024-07-30 14:43:12 · 173 阅读 · 0 评论 -
1、一个简单的驱动程序
2、将驱动编译到内核模块,独立于Linux内核以外,需要的时候通过命令加载驱动文件(.KO文件),使用内核模块可以减少内核的体积,加快启动速度,插入或者卸载驱动不需要重启系统;1、头文件 必须包含 1、将驱动放在Linux内核里面,然后编译Linux内核。原创 2024-07-29 16:23:01 · 407 阅读 · 0 评论 -
linux编写驱动程序常用API
在Linux设备驱动开发中,有许多常用的API,这些API提供了与内核和其他驱动程序交互的功能。9. 设备树(Device Tree)和ACPI。5. I/O端口和内存操作。8. 消息队列、管道和信号。10. 电源管理和热插拔。1. 设备注册与注销。原创 2024-07-11 04:00:00 · 592 阅读 · 0 评论 -
如何才能在Linux下编写驱动程序
1. 了解Linux驱动开发基础知识。3. 编写驱动程序代码。4. 编译和加载驱动。8. 可选的高级步骤。原创 2024-07-10 08:00:00 · 324 阅读 · 0 评论 -
写一个字符设备的驱动步骤
以上步骤是一个典型的字符设备驱动编写流程,但具体实现可能因设备和需求的不同而有所差异。在实际编写过程中,建议参考Linux内核文档和相关书籍以获得更详细和准确的信息。原创 2024-07-10 04:15:00 · 451 阅读 · 0 评论