全部博文(11)
分类: LINUX
2009-07-29 21:58:20
(dev_t)-->主设备号、次设备号(获取主次设备号 | MAJOR(dev_t dev) MINOR(dev_t dev) |
主设备号、次设备号-->(dev_t) | MKDEV(int major,int minor) |
|
|
二、一些重要的数据结构
大部分基本的驱动程序操作涉及及到三个重要的内核数据结构,分别是file_operations、file和inode,它们的定义都在
(1)传统上, 一个 file_operation 结构或者其一个指针称为 fops( 或者它的一些变体). 结构中的每个成员必须指向驱动中的函数, 这些函数实现一个特别的操作, 或者对于不支持的操作留置为 NULL.
(2)参数如果包含字串 __user. 这种注解是一种文档
形式, 表明指针是一个用户空间地址. 因此不能被直接解引用,对于正常的编译, __user 没有效果,但是它可被外部检查软件使用来找出对用户空间地址的错误使用.
(3)相关参数介绍:*owner:内核使用这个字段避免在模块的操作正在被使用时卸载该模块. 几乎在所有的情况下, 它被简单初始化为
THIS_MODULE,它是定义在
三、字符设备的注册
内核内部使用struct cdev结构来表示字符设备。在内核调用设备的操作之前,必须分配并注册一个或多个struct cdev。代码应包含
注册一个独立的cdev设备的基本过程如下:
1、为struct cdev 分配空间(如果已经将struct cdev 嵌入到自己的设备的特定结构体中,并分配了空间,这步略过!)
struct cdev *my_cdev = cdev_alloc();
2、初始化struct cdev
void cdev_init(struct cdev *cdev, const struct file_operations *fops)
3、初始化cdev.owner%3