哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处
http://blog.csdn.net/woshixingaaa/archive/2010/11/13/6007342.aspx
LINUX设备驱动程序分为字符设备驱动(无缓冲且只能顺序存取),块设备驱动程序(有缓冲且可以随机存取)。每个字符设备和块设备都必须有主,次设备号,主设备号相同的设备是同类设备(使用同一驱动程序)。这些设备中,有些设备是对实际物理硬件的抽象,而有些设备则是则是内核自身提供的功能(不依赖于特定的物理硬件,又称为“虚拟设备”)。每个设备在/dev目录下都有一个对应的文件(节点),可以通过 cat /proc/devices命令查看当前已经加载的设备驱动程序的主设备号。
在内核中,dev_t类型用来保存设备编号(包括主设备号和次设备号):
-
主设备号=MAJOR(dev_t dev)
-
次设备号=MINOR(dev_t dev)
-
设备编号=MKDEV(int major,int minor)
dev_t是无符长整型
-
typedef unsigned long u_long;
分配和释放设备号:
-
int register_chrdev_region(dev_t first, unsigned int count, char *name);
-
int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name);
-
void unregister_chrdev_region(dev_t first, unsigned int count);
字符设备的注册:
-
void cdev_init(struct cdev *cdev, struct file_operations *fops);
-
int cdev_add(struct cdev *dev, dev_t num, unsigned int count);
-
void cdev_del(struct cdev *dev);
早期的办法:
-
int register_chrdev(unsigned int major, const char *name, struct file_operations *fops);
-
int unregister_chrdev(unsigned int major, const char *name);
在内核空间和用户空间之间拷贝数据使用:
-
unsigned long copy_to_user(void __user*to,const void *from,unsigned long count);
-
unsigned long copy_from_user(void *to, const void __user *from,unsigned long count);
scull设备的布局:
这个结构是一个二维数组,qset是第一个下限,quantum是第二个下限。
下面是我写的驱动程序,没有用书上的,数了一下,书上的例子快到两千行代码了,所以自己写个容易的,设备是内存,first.c
需要注意的地方是,下面的struct file_operations first_fops是用C99标准写的,是标记化结构体初始化语法。左边的open,release,read,write都是系统调用,也就是说调用read是去执行read_test,调用write时执行write_test。在用户空间和内核空间之间传输数据应该使用函数copy_to_user和copy_from_user.
初始化模块时:
-
获得设备号 alloc_chrdev_region,若已知则调用register_chrdev_region
-
初始化字符设备 cdev_init
-
将设备添加到系统中 cdev_add
注销模块:
-
释放设备号 unregister_chrdev_region
-
删除已经注册的char设备 cdev_del
Makefile
首先make,进行编译,生成first.ko文件。执行:
-
sudo insmod first.ko
-
cat /proc/devices 查看主设备号
-
sudo mknod /dev/test c 252 0 (c是字符设备的意思,250是我查看得到的主设备号,0是次设备号)
test.c
分享到:
相关推荐
“mydriver”的简单字符设备驱动程序,该驱动程序以可加载的模块方式进行编译,这样可以免去重新编译内核的工作。
字符设备驱动程序 操作系统OS的课程设计 附带完整课程设计报告
本文档为Linux下最简单的字符设备驱动程序
深入浅出 Linux字符设备驱动程序解析
操作系统课程设计字符设备驱动程序 Ubuntu下的Linux
需要不断编写新的驱动程序以支持硬件, 通过虚拟字符设备驱动程序的编写,来说明 Linux 系统中字符设备驱动程序的工作 原理。首先介绍了 Linux 系统中设备驱动程序的基本结构, 以及字符设备驱动程序应提供的入口点, ...
Linux 设备驱动程序是为特定的硬件提供给用户程序的 一组标准化接口,它隐藏了设备工作的细节。Linux 系统下 驱动程序是运行在内核态的,是和内核连接在一起的程序。 如果运行在用户态的应用程序想控制硬件设备,...
介绍了Linux 字符设备驱动程序中建立设备,初始化设备、设备的资源分配和如 何访问设备的方法及相关函数的实现.
虚拟字符设备驱动程序在Linux的实现.pdf
这是linux下的字符设备驱动程序,对于初学驱动程序的人有很不错的参考价值。
这是字符设备驱动的经典程序,globalmem可以实现对设备的读写操作,很有意思,希望大神们多多指教。
Linux设备驱动程序学习(1)-字符设备驱动程序 - Linux设备驱动程序
linux 添加字符设备驱动程序及测试程序,linux下采用模块方法,添加一个新的设备驱动程序。要求添加字符设备的驱动。另附一个应用程序,测试添加的驱动程序. int main(void) { int fd; char buf[MAX_SIZE]; char ...
一个字符设备驱动程序的实例 一个字符设备驱动程序的实例 一个字符设备驱动程序的实例
1.该部分是参考《Linux设备驱动程序第三版》第三章写的scull字符设备驱动程序,实现了读写功能,资源中包含了驱动程序,测试代码,启动及卸载脚本; 2.在ubuntu10.04的系统下,已测试通过,本人使用的系统相关信息为...
Linux下字符设备驱动程序的结构 Linux下字符设备驱动程序的结构
详细介绍了linux字符设备驱动程序,对各个名词做了自己的理解,在学习中的笔记,有错误还请海涵
Linux设备驱动程序学习(1)-字符设备驱动程序.pdf
字符设备驱动程序 ppt 基础内容课程
基于linux2.4内核版本的字符设备驱动,适合作为操作系统课程设计。其中包含了测试文件与makefile文件。