You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux内核cdev_alloc()与cdev_init()用法区别及相关问题咨询

Linux内核struct cdev使用问题解答

1. cdev_alloc() 创建struct cdev的方式是否已被弃用?

该接口并未被弃用,目前仍在内核中正常支持使用。
它和cdev_init()是两种匹配不同使用场景的合法初始化方案:cdev_alloc()对应动态分配struct cdev实例的需求,适合需要运行时申请/释放字符设备对象、或者需要将struct cdev嵌入自定义设备结构体的场景;而cdev_init()对应静态声明struct cdev变量后的初始化场景,两者并行存在,没有互斥的替代关系。

2. cdev_alloc() 申请得到的struct cdev实例是否可以调用cdev_init()初始化?

不可以,这是错误的用法,具体原因可结合两个接口的内核实现逻辑说明:

  • cdev_alloc() 内部已经完成了struct cdev的基础初始化:会先通过kzalloc申请内存并清零整个结构体,初始化内嵌的kobject引用计数,将ops指针置空,返回的实例只需要手动赋值ops和owner字段即可正常使用。
  • cdev_init() 是专门为静态分配、未初始化的struct cdev变量设计的初始化接口:它内部会先清零传入的struct cdev的所有字段,再重新初始化kobject、绑定传入的file_operations指针。如果将cdev_alloc()返回的实例传入cdev_init(),会直接覆盖已经完成初始化的kobject引用计数、内存管理相关字段,轻则导致字符设备释放时出现内存泄漏,重则引发引用计数异常导致内核崩溃。

内容的提问来源于stack exchange,提问作者BowPark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:54:06