/*设备驱动模块加载函数*/
196 int globalmem_init(void)
197 {
198 int result;
199 dev_t devno = MKDEV(globalmem_major, 0);
200
201 /* 申请设备号*/
202 if (globalmem_major)
203 result = register_chrdev_region(devno, 2, "globalmem");
204 else /* 动态申请设备号 */
205 {
206 result = alloc_chrdev_region(&devno, 0, 2, "globalmem");
207 globalmem_major = MAJOR(devno);
208 }
209 if (result < 0)
210 return result;
211
212 /* 动态申请2个设备结构体的内存*/
213 globalmem_devp = kmalloc(2*sizeof(struct globalmem_dev), GFP_KERNEL);
214 if (!globalmem_devp) /*申请失败*/
215 {
216 result = - ENOMEM;
217 goto fail_malloc;
218 }
219 memset(globalmem_devp, 0, 2*sizeof(struct globalmem_dev));
220
221 globalmem_setup_cdev(&globalmem_devp[0], 0);
222 globalmem_setup_cdev(&globalmem_devp[1], 1);
223 return 0;
224
225 fail_malloc: unregister_chrdev_region(devno, 2);
226 return result;
227 }
228
229 /*模块卸载函数*/
230 void globalmem_exit(void)
231 {
232 cdev_del(&(globalmem_devp[0].cdev));
233 cdev_del(&(globalmem_devp[1].cdev)); /*注销cdev*/
234 kfree(globalmem_devp); /*释放设备结构体内存*/
235 unregister_chrdev_region(MKDEV(globalmem_major, 0), 2); /*释放设备号*/
236 }
237
238 MODULE_AUTHOR("Song Baohua");
239 MODULE_LICENSE("Dual BSD/GPL");
240
241 module_param(globalmem_major, int, S_IRUGO);
242
243 module_init(globalmem_init);
244 module_exit(globalmem_exit);
主要的不同在于同时申请了2个globalmem的空间。其他的都一样,很简单。