当前位置:嗨网首页>书籍在线阅读

10-加载与卸载设备驱动

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

6.3.2 加载与卸载设备驱动

globalmem设备驱动的模块加载和卸载函数遵循代码清单6.5的类似模板,其实现的工作与代码清单6.5完全一致,如代码清单6.9所示。

代码清单6.9 globalmem设备驱动模块加载与卸载函数

1 /globalmem设备驱动模块加载函数/

2 int globalmem_init(void)

3 {

4 int result;

5 dev_t devno = MKDEV(globalmem_major, 0);

6

7 / 申请字符设备驱动区域/

8 if (globalmem_major)

9 result = register_chrdev_region(devno, 1, "globalmem");

10 else {

11 / 动态获得主设备号 /

12 result = alloc_chrdev_region(&devno, 0, 1, "globalmem");

13 globalmem_major = MAJOR(devno);

14 }

15 if (result < 0)

16 return result;

17

18 globalmem_setup_cdev();

19 return 0;

20 }

21

22 /globalmem设备驱动模块卸载函数/

23 void globalmem_exit(void)

24 {

25 cdev_del(&dev.cdev); /删除cdev结构/

26 unregister_chrdev_region(MKDEV(globalmem_major, 0), 1);/注销设备区域/

27 }

第18行调用的globalmem_setup_cdev()函数完成cdev的初始化和添加,如代码清单6.10所示。

代码清单6.10 初始化并添加cdev结构体

1 /初始化并添加cdev结构体/

2 static void globalmem_setup_cdev()

3 {

4 int err, devno = MKDEV(globalmem_major, 0);

5

6 cdev_init(&dev.cdev, &globalmem_fops);

7 dev.cdev.owner = THIS_MODULE;

8 err = cdev_add(&dev.cdev, devno, 1);

9 if (err)

10 printk(KERN_NOTICE "Error %d adding globalmem", err);

11 }

在cdev_init()函数中,与globalmem的cdev关联的file_operations结构体如代码清单6.11所示。

代码清单6.11 globalmem设备驱动文件操作结构体

1 static const struct file_operations globalmem_fops = {

2 .owner = THIS_MODULE,

3 .llseek = globalmem_llseek,

4 .read = globalmem_read,

5 .write = globalmem_write,

6 .ioctl = globalmem_ioctl,

7 };