cdev 结构体与字符设备的注册.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
cdev 结构体与字符设备的注册

cdev 结构体与字符设备的注册 在 linux 2.6内核中,使用 cdev结构体描述字符设备,cdev 的定义在 linux/cdev.h 中可找到,其定义如下: 引用 struct cdev { ??????? struct kobject kobj; ??????? struct module *owner; ??????? const struct file_operations *ops; ??????? struct list_head list; ??????? dev_t dev; ??????? unsigned int count; }; cdev 结构体中的 dev_t 成员定义了设备号,为 32 位,其中高 12 位为主设备号,低 20 位为次设备号。 其中,struct kobject 是内嵌的 kobject 对象; ??????????? struct module 是所属模块; ??????????? struct file_operations 为文件操作结构体。 使用以下宏可以从 dev_t 获得主设备号和次设备号: 引用 ??????? MAJOR (dev_t dev); ??????? MINOR (dev_t dev); 而使用下面宏可以通过主设备号和次设备号生成 dev_t? : 引用 MKDEV (int major, int minor); ? 有两个方法可以分配并初始化 cedv 结构。如果希望在运行时动态的获得一个独立的 cdev 结构,可以如下这么做: 引用 struct cdev *my_cdev = cdev_alloc(); my_cdev-ops = my_fops; cdev_alloc(void) 函数的代码为(对 cdev 结构体操作的系列函数可在 fs/char_dev.c 中找到): 引用 struct cdev *cdev_alloc(void) { ??????? struct cdev *p = kzalloc(sizeof(struct cdev), GFP_KERNEL); ??????? if (p) { ??????????????? INIT_LIST_HEAD(p-list); ??????????????? kobject_init(p-kobj, ktype_cdev_dynamic); ??????? } ??????? return p; } cdev_alloc() 的源代码可能由于内核版本号的不同而有差别(上面的代码为 2.6.30) 有时可能希望就把 cdev 结构内嵌在自己的特定设备结构里,那么在分配好 cdev 结构后,就用 cdev_init() 函数对其初始化: 引用 void cdev_init (struct cdev *cdev, struct file_operations *fops) cdev_init() 函数代码为: 引用 void cdev_init(struct cdev *cdev, const struct file_operations *fops) { ??????? memset(cdev, 0, sizeof *cdev); ??????? INIT_LIST_HEAD(cdev-list); ??????? kobject_init(cdev-kobj, ktype_cdev_default); ??????? cdev-ops = fops; } 另外,像 cdev 中的 owner 要设置为 THIS_MOULE 。 一旦 cdev 结构体设置完毕,最后一步就是要把这事告诉给内核,使用下面的函数: 引用 int cdev_add(struct cdev *p, dev_t dev, unsigned count) cdev_add() 对应的代码为: 引用 /** * cdev_add() - add a char device to the system * @p: the cdev structure for the device * @dev: the first device number for which this device is responsible * @count: the number of consecutive minor numbers corresponding to this *???????? device * * cdev_add() adds the device represented by @p to the system, making it * live immediately.? A

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档