摘要:
概念 一个信号量本质是一个整数值,它和一堆函数联合使用,这一对函数通常称为P和V;希望进入临界区的进程将在相关信号量上调用P;如果信号量的值大于零,则该值会减少1,进程可以继续执行;相反,如果信号量的值为0或者更小,则进程必须等待知道其他人释放该信号量;对信号量的解锁通过调用V完成;该函数增加信号量 阅读全文
摘要:
竞态产生 Linux系统找那个存在大量的并发联系,因此会导致可能的竞态; 1. 正在运行的用户空间进程可以以多种组合方式访问我们的代码; 2. SMP系统甚至可以再不同的处理器上同时执行我们的代码; 3. 内核代码是可抢占的,因此,我们的驱动程序代码可能在任何时候丢失对处理器的独占,而拥有处理器的进 阅读全文
摘要:
read和write原型 read和write方法完成的任务是相似的,亦即,拷贝数据到应用程序空间,或者反过来从应用程序空间拷贝数据;因此,它们的原型很相似,如下: 1 ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); 阅读全文
摘要:
open方法 open方法提供给驱动程序以初始化的能力,在大部分驱动程序汇总,open应该完成以下工作: 1. 检查特定设备的错误,如设备为准备就绪或者硬件问题; 2. 如果设备是首次打开,则对其进行初始化; 3. 如有必要,更新f_op指针; 4. 分配并填写置于filp->private_dat 阅读全文
摘要:
内核内部使用struct cdev结构来标识字符设备,在内核调用设备的操作之前,必须分配并注册一个或者多个上述结构,为此,我们的代码需要包含<linux/cdev.h>,其中定义了这个结构以及相关的辅助函数; 分配和初始化 分配和初始化上述结构的方式分为两种: 1. 如果打算在运行的时候获取一个独立 阅读全文
摘要:
文件对象 文件对象是进程已经打开文件描述符的内存中的表示,单个文件可能有多个表示打开文件描述符的file结构; 1 struct file { 2 union { 3 struct llist_node fu_llist; /* 文件对象链表 */ 4 struct rcu_head fu_rcuh 阅读全文
摘要:
主设备号和次设备号 对字符设备的访问是通过文件系统内的设备名称进行的,这些名称被称为特殊文件、设备文件、或者简单称之为文件系统树的节点,它们通常位于/dev目录。字符设备驱动程序的设备文件可以通过ls -l命令输出的第一列中的c字符来识别,块设备也出现在/dev下,但它们由字符b来标识; 通过执行l 阅读全文
摘要:
模块支持参数的方法 内核允许驱动程序指定参数,这些参数可在运行insmod或者modprobe命令装载模块时赋值,modprobe还可以从它的配置文件(/etc/modporb.conf)中读取参数值; insmod加载模块时指定参数的方式如下: 1 insmod hellop howmany=10 阅读全文
摘要:
insmod使用公共内核符号表来解析模块中未定义的符号。功能内核符号表中包含了所有全局内核项(函数和变量)的地址,这是实现模块化驱动程序所必须的。当模块装载到内核后,它所导出的任何符号都会变成内核符号表的一部分。通常情况下,模块只需要实现自己的功能,无需导出任何符号,但是如果其他模块想要使用该模块的 阅读全文