随笔分类 -  Linux设备驱动开发

摘要:【基本概念】 1、阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作。被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到条件满足。 2、非阻塞 非阻塞操作是指在进行设备操作是,若操作条件不满足并不会挂起,而是直接返回或重 阅读全文
posted @ 2016-12-27 21:17 GreenHand# 阅读(5138) 评论(0) 推荐(2) 编辑
摘要:内核定时器使用 内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于 <Linux/timer.h> 和 kernel/timer.c 文件中。 被调度的函数肯定是异步执行的,它类似于一种“软件中断”,而且是处于非进程的上下文中,所以调度函数必须遵守以 阅读全文
posted @ 2016-12-27 17:02 GreenHand# 阅读(14365) 评论(0) 推荐(5) 编辑
摘要:【主要内容】 Linux设备驱动编程中的中断与定时器处理 【正文】 一、基础知识 1、中断 所谓中断是指CPU在执行程序的过程中,出现了某些突发事件急待处理,CPU必须暂停执行当前的程序,转去处理突发事件,处理完毕后CPU又返回程序被中断的位置并继续执行。 2、中断的分类 1)根据中断来源分为:内部 阅读全文
posted @ 2016-12-27 16:20 GreenHand# 阅读(11415) 评论(0) 推荐(0) 编辑
摘要:1 #ifndef MYDEV_H 2 #define MYDEV_H 3 4 #define DYNAMIC_MINOR 256 5 6 struct mydev{ 7 const char *name; 8 const struct file_operations *fops; 9 10 int 阅读全文
posted @ 2016-12-21 22:05 GreenHand# 阅读(1550) 评论(1) 推荐(0) 编辑
摘要:对于Linux系统中,一般字符设备和驱动之间的函数调用关系如下图所示 上图描述了用户空间应用程序通过系统调用来调用程序的过程。一般而言在驱动程序的设计中,会关系 struct file 和 struct inode 这两个结构体。 用户空间使用open()系统调用函数打开一个字符设备时( int f 阅读全文
posted @ 2016-12-14 22:56 GreenHand# 阅读(19192) 评论(2) 推荐(8) 编辑
摘要:struct _file_operations struct _file_operations在Fs.h这个文件里面被定义的,如下所示: Linux使用file_operations结构访问驱动程序的函数,这个结构的每一个成员的名字都对应着一个调用。 用户进程利用在对设备文件进行诸如read/wri 阅读全文
posted @ 2016-12-14 22:18 GreenHand# 阅读(22057) 评论(0) 推荐(3) 编辑
摘要:第一种是使用mknod手工创建:# mknod <devfilename> <devtype> <major> <minor> 第二种是自动创建设备节点:利用udev(mdev)来实现设备文件的自动创建,首先应保证支持udev(mdev),由busybox配置。 具体udev相关知识这里不详细阐述, 阅读全文
posted @ 2016-12-13 21:09 GreenHand# 阅读(5442) 评论(0) 推荐(0) 编辑
摘要:一、字符设备基础 字符设备 二、字符设备驱动与用户空间访问该设备的程序三者之间的关系 三、字符设备模型 1、Linux内核中,使用 struct cdev 来描述一个字符设备 动态申请(构造)cdev内存(设备对象) 初始化cdev的成员,并建立cdev和file_operations之间关联起来 阅读全文
posted @ 2016-12-13 20:26 GreenHand# 阅读(24856) 评论(2) 推荐(6) 编辑
摘要:1. MODULE_DEVICE_TABLE (usb, skel_table);该宏生成一个名为__mod_pci_device_table的局部变量,该变量指向第二个参数。内核构建时,depmod程序会在所有模块中搜索符号__mod_pci_device_table,把数据(设备列表)从模块中抽 阅读全文
posted @ 2016-12-10 15:50 GreenHand# 阅读(1779) 评论(0) 推荐(0) 编辑
摘要:头文件目录中总共有32个.h头文件。其中主目录下有13个,asm子目录中有4个,linux子目录中有10个,sys子目录中有5个。这些头文件各自的功能如下: 1、主目录 <a.out.h>:a.out头文件,定义了a.out执行文件格式和一些宏。<const.h>:常数符号头文件,目前仅定义了i节点 阅读全文
posted @ 2016-12-08 19:32 GreenHand# 阅读(3682) 评论(0) 推荐(0) 编辑
摘要:一、基本概念 二、中断屏蔽 三、原子操作 四、自旋锁 五、信号量 六、互斥体 七、自旋锁与信号量的比较 Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发的访问会导致竞态,即使是经验丰富的驱动工程师也常常设计出包含并发问题的bug驱动程序。 Linux提供了多种解决竞态问题的 阅读全文
posted @ 2016-12-06 22:55 GreenHand# 阅读(4675) 评论(0) 推荐(0) 编辑
摘要:1、什么是内核模块? 内核模块是Linux提供的一种机制,允许在内核运行时动态加载进内核中,具有两个特点: 1)内核模块本身不编译入内核映像,有效控制缩减内核镜像大小 2)内核模块一旦被加载,他就和内核中的其他部分完全一样 2、为什么需要内核模块? 如果在内核编译时把所有的功能都编译进去,就会导致内 阅读全文
posted @ 2016-12-03 13:33 GreenHand# 阅读(4793) 评论(1) 推荐(2) 编辑