版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kakascx/article/details/83579054
static int scdev_init(void)
{
int ret = 0,i;
dev_t num_dev;
printk(KERN_EMERG "numdev_major is %d!\n",numdev_major);
printk(KERN_EMERG "numdev_minor is %d!\n",numdev_minor);
if(numdev_major){
num_dev = MKDEV(numdev_major,numdev_minor);
ret = register_chrdev_region(num_dev,DEVICE_MINOR_NUM,DEVICE_NAME);
}
else{
/*动态注册设备号*/
ret = alloc_chrdev_region(&num_dev,numdev_minor,DEVICE_MINOR_NUM,DEVICE_NAME);
/*获得主设备号*/
numdev_major = MAJOR(num_dev);
printk(KERN_EMERG "adev_region req %d !\n",numdev_major);
}
if(ret<0){
printk(KERN_EMERG "register_chrdev_region req %d is failed!\n",numdev_major);
}
my_devices = kmalloc(DEVICE_MINOR_NUM * sizeof(struct reg_dev),GFP_KERNEL);
if(!my_devices){
ret = -ENOMEM;
goto fail;
}
memset(my_devices,0,DEVICE_MINOR_NUM * sizeof(struct reg_dev));
/*设备初始化*/
for(i=0;i<DEVICE_MINOR_NUM;i++){
my_devices[i].data = kmalloc(REGDEV_SIZE,GFP_KERNEL);
memset(my_devices[i].data,0,REGDEV_SIZE);
/*设备注册到系统*/
reg_init_cdev(&my_devices[i],i);
}
printk(KERN_EMERG "scdev_init!\n");
/*打印信息,KERN_EMERG表示紧急信息*/
return 0;
fail:
/*注销设备号*/
unregister_chrdev_region(MKDEV(numdev_major,numdev_minor),DEVICE_MINOR_NUM);
printk(KERN_EMERG "kmalloc is fail!\n");
return ret;
}
关于空间申请的两个函数
- 分配内存空间函数kmalloc
功能:分配连续的虚拟地址,用于小内存分配。在include/linux/slab.h文件中。
参数1:申请的内存大小(最大128K)
参数2:GFP_KERNEL,代表优先权,内存不够可以延迟分配 - 清空内存空间的数据函数memset
可以清空内存空间,也就是全部写为0;
参数1:内存地址
参数2:0
参数3:内存长度
关于字符设备注册:
-
字符设备初始化函数cdev_init
功能:注册设备本质是向linux设备文件中添加数据,这些数据需要初始化,在头文件include/linux/cdev.h中
参数1:cdev字符设备文件结构体
参数2:file_operations结构体 -
字符设备注册函数cdev_add
功能:向系统注册设备,也就是向linux系统添加数据,在头文件include/linux/cdev.h中
参数1:cdev字符设备文件结构体
参数2:设备号
参数3:设备范围大小 -
卸载设备函数cdev_del、
功能:移除字符设备
参数1:cdev结构体