
LDD3读书笔记
文章平均质量分 78
Vito
这个作者很懒,什么都没留下…
展开
-
构造和运行模块
1. "可在运行时添加到内核中的代码被称为 模块" (LDD3 p13 可装载模块) 2. 在root权限下 使用insmod module_name.ko装载模块; 使用rmmod module_name卸载模块3. Hello World模块#include #include MODULE_LICENSE("Dual BSD/GPL"); // 如果没有这行,编译器会产生抱怨static int hello_init(void){ printk(KERN_AL原创 2010-12-22 10:51:00 · 491 阅读 · 0 评论 -
高级字符驱动程序操作之poll(实践篇)
1. scull.h 驱动程序由scullpipe改过来的#ifndef _SCULL_H_#define _SCULL_H_#ifndef SCULL_P_NR_DEVS#define SCULL_P_NR_DEVS 2 /* scullpipe0 through scullpipe3 */#endif#ifndef SCULL_P_BUFFER#define SCULL_P_BUFFER 4000#endifextern int scull_p_buffer原创 2010-12-28 14:32:00 · 746 阅读 · 0 评论 -
高级字符驱动程序操作之异步通知IO(实践篇)
<br />1. async.c 主要展示异步通知机制在驱动程序中的实现<br />#include <linux/module.h>#include <linux/init.h>#include <linux/fs.h> /* everything... */#include <linux/types.h> /* size_t */#include <linux/cdev.h>#include <linux/fcntl.h>#include <asm/uaccess.原创 2010-12-29 13:49:00 · 798 阅读 · 0 评论 -
高级字符驱动程序操作之休眠(实践篇)
1. scull_pipe.c #include #include #include /* printk(), min() */#include /* kmalloc() */#include /* everything... */#include #include /* error codes */#include /* size_t */#include #include #include #include struct scull_原创 2010-12-27 14:33:00 · 601 阅读 · 0 评论 -
高级字符驱动程序操作之休眠(理论篇)
1. 休眠的原则第一条: "永远不要在原子上下文中进入休眠" (LDD3 p149)第二条: 当线程被唤醒时,应当检查等待的条件是否为真第三条: 确保即将休眠的线程一定会被唤醒2. 简单休眠wait_event(queue, condition) // 不可中断的休眠,不符合休眠的原则(第二条)不推荐wait_event_interruptible(queue, condition) // 接受终端的休眠,推荐wait_event_timeout(queue, condition, timeout) //原创 2010-12-27 11:55:00 · 793 阅读 · 0 评论 -
高级字符驱动程序操作之ioctl(实践篇)
为了简单,我在“字符设备驱动程序(实践篇)”的基础上进行修改,来掩饰ioctl的用法。1. scull.h 其中添加ioctl用到的命令#ifndef _SCULL_H_#define _SCULL_H_#ifndef SCULL_MAJOR#define SCULL_MAJOR 0 /* dynamic major by default */#endif#ifndef SCULL_NR_DEVS#define SCULL_NR_DEVS 4 /* scull0 t原创 2010-12-24 13:48:00 · 915 阅读 · 0 评论 -
高级字符驱动程序操作之ioctl(理论篇)
<br />1. 驱动程序中ioctl函数:<br /> <br />int (*ioctl) (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);<br />其中inode和filp对应于应用程序传递的文件描述符fd,cmd是控制命令,应用程序既可以传递数据指针也可以传递值,在驱动程序里都表现为unsigned long类型的arg<br /> <br />如果应用程序传递了一个ioctl中找不到的命令原创 2010-12-24 12:10:00 · 857 阅读 · 2 评论 -
高级字符驱动程序操作之poll(理论篇)
<br />1. poll系统调用<br /> <br />int poll(struct pollfd *fds, unsigned int nfds, int timeout);<br />poll由System V引入,作用是查询用户进程是否可以对一个或者多个打开的文件做非阻塞的读取或写入<br /> <br />那poll到底有什么用呢?举个例子说,当一个进程中有两个输入流,一个叫做A,一个叫做B;再假设A没有数据了,而B有充足的数据;这时候会发生什么?聪明的你一下就明白了,进程被阻塞在输入流A上面原创 2010-12-28 12:25:00 · 647 阅读 · 0 评论 -
并发和竞态(实践篇)
1. complete.c 只是一个简单的字符驱动,但是我加进去了completion来同步读写操作#include #include #include /* everything... */#include /* size_t */#include #include MODULE_AUTHOR("victorsummer");MODULE_LICENSE("Dual BSD/GPL");static int complete_major = 0;原创 2010-12-23 16:44:00 · 465 阅读 · 0 评论 -
并发和竞态(理论篇)
1. 信号量信号量是为了解决共享资源问题而生的,通过著名的P/V操作可以获取和释放信号量,只有获得信号量的线程才可以访问共享资源,从而防止竞态的发生。其中P操作有三种情况:void down(struct semaphore *sem); // 如果信号量可以获得,信号量减一; 如果信号量不可以获得则阻塞进程并不可中断int down_interruptible(struct semaphore *sem); // 如果信号量可以获得,信号量减一,函数返回零; 如果信号量不可以获得则阻塞进程但可以被中断,如原创 2010-12-23 16:25:00 · 478 阅读 · 0 评论 -
字符设备驱动程序(实践篇)
<br />1. scull.h<br /> <br />#ifndef _SCULL_H_#define _SCULL_H_#ifndef SCULL_MAJOR#define SCULL_MAJOR 0 /* dynamic major by default */#endif#ifndef SCULL_NR_DEVS#define SCULL_NR_DEVS 4 /* scull0 through scull3 */#endif#ifndef SCU原创 2010-12-22 17:17:00 · 603 阅读 · 0 评论 -
字符设备驱动程序(理论篇)
<br />1. 设备编号<br /> <br />"主设备号标识设备对应的驱动程序" 而 "次设备号用于正确确定设备文件所指的设备"(LDD3 p48)<br />也就是说:主设备号对应驱动程序;次设备号对应使用同个驱动程序的设备;一般一个驱动程序可以被多个设备共享<br /> <br />一个主设备号和一个次设备号 合在一起 可以唯一确定一个设备文件,Linux内核使用一个叫做dev_t的类型来保存主设备号和次设备号,我们称dev_t类型的数据为设备编号。<br />要通过设备编号获取主次设备号,可以用原创 2010-12-22 17:00:00 · 677 阅读 · 0 评论 -
高级字符驱动程序操作之异步通知IO(理论篇)
<br />1. 上一节我们已经学习了用poll轮询数据,来避免不必要的休眠,但是事实上,轮询的直接负面作用就是效率低下,这样一节我们学习如何使用异步通知IO来提高效率<br /> <br />2. fcntl系统调用<br />int fcntl(int fd, int cmd, long arg);<br />fcntl的作用是改变一个已打开文件的属性,fd是要改变的文件的描述符,cmd是命令罗列如下:<br />F_DUPFD, F_GETFD, F_SETFD, F_GETFL, F_SETFL,原创 2010-12-29 10:28:00 · 610 阅读 · 0 评论