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 };