由此可见,两个函数完成的功能基本一致,只是 cdev_init()还多赋了一个 cdev->ops的值。 这里需要注意的是kzalloc后的空间是不需要再执行memset的,因为它本身就包含了这个操作。而memset一般作用在已经存在的空间上。 由此基本上对这两个函数有了一个基本的概念:cdev_alloc函数针对于需要空间申请的操作,而cdev_init...
1. cdev_initandcdev_addfunctions perform the character device registration.cdev_addadds the character device to the system. Whencdev_addfunction successfully completes, the device is live and the kernel can invoke its operations. 2. class_create is used to create a virtual device class, so that...
sysfs通过class_create和device_create在设备树中创建相应的设备,应用层udev会自动根据设备树的变化生成相应的设备节点。 综上:在2.6内核之前通过函数cdev_init和cdev_add添加字符设备,另外还需要手动创建设备节点;在2.6之后的内核,通过cdev_init和cdev_add添加字符设备,通过class_create和device_create函数往sys文件系统中...
cdev_init(cdev *, fops):将struct cdev类型的结构体变量和file_operations结构体进行绑定。但若前面使用了cdev_alloc,则就可以直接利用pcdev->ops = fops;来进行绑定,就不需要cdev_init函数了。 在cdev_init函数中,除了cdev->ops = fops;之外的其他的操作都在cdev_alloc函数中做了。 voidcdev_init(structcdev...
static int __init rtc_init(void) { // 构建cdev rtc_cdev = cdev_alloc(); cdev_init(rtc_cdev, &rtc_fops); // 申请设备号 dev = MKDEV(222, 0); register_chrdev_region(dev, 1, "rtc-demo"); // 将cdev加入kobj树 cdev_add(rtc_cdev, dev, 1); ...
使用cdev_init()、cdev_add()替代register_chrdev()。加载驱动后,/proc/devices/下没有设备,lsmod显示模块加载,/dev/下有设备。驱动测试程序正,程序员大本营,技术文章内容聚合第一站。
printk("hello_init \n"); devno = MKDEV(major,minor); result = register_chrdev_region(devno,1,"test"); if(result<0) { printk("register_chrdev_region fail \n"); returnresult; } cdev_init(&cdev,&hello_ops); error = cdev_add(&cdev,devno,1); ...
kobject_init(&cdev->kobj); cdev->ops=fops; } 1. 2. 3. 4. 5. 6. 7. 8. cdev_add:向内核里面添加一个驱动,注册驱动 cdev_del(cdev *pcdev):释放cdev结构体空间,cdev_del函数内部是能知道你的struct cdev定义的对象是用的堆内存还是栈内存还是数据段内存的。这个函数cdev_del调用时,会先去看你...
kobject_init(&cdev->kobj, &ktype_cdev_default); cdev->ops = fops; } 由此可见,两个函数完成都功能基本一致,只是 cdev_init() 还多赋了一个 cdev->ops 的值。 初始化 cdev 后,需要把它添加到系统中去。为此可以调用 cdev_add() 函数。传入 cdev 结构的指针,起始设备编号,以及设备编号范围。
cdev_alloc和cdev_init都比较简单,这里就不说了。在cdev_add中有一个很重要的函数kobj_map。 int cdev_add(struct cdev *p, dev_t dev, unsigned count) { p->dev = dev; p->count = count; return kobj_map(cdev_map, dev, count, NULL, exact_match, exact_lock, p); ...