两个globalmem设备驱动

本文详细介绍了设备驱动模块的初始化与卸载过程,特别关注于如何同时管理两个globalmem空间,包括设备号的申请与注册、内存分配与初始化、以及后续的释放操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*设备驱动模块加载函数*/
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的空间。其他的都一样,很简单。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值