嵌入式Linux面试:字符设备驱动如何注册?/dev节点和read、write是怎么关联的?

浏览量:2
时间: 2026-11-15 22:30:56
FANYI EDUCATION · ENGINEERING INTERVIEW · 07/10

嵌入式Linux面试:字符设备驱动如何注册?/dev节点和read、write是怎么关联的?

字符设备驱动是Linux驱动面试中的基础题。面试官通常会从主设备号、次设备号问到cdev注册,再追问用户程序打开/dev节点后,read和write最终如何进入驱动。

面试官提问

嵌入式Linux面试:字符设备驱动如何注册?/dev节点和read、write是怎么关联的?

Linux字符设备驱动用户空间设备节点、主次设备号与内核read write回调关系图  

面试回答

字符设备驱动通过设备号把用户空间访问的设备节点关联到内核中的驱动。驱动申请或分配dev_t设备号,初始化并注册cdev,再提供file_operations中的open、read、write、release等回调。设备节点通常由device_create配合设备模型和udev/devtmpfs等机制生成,用户程序对/dev节点执行文件操作时,内核会根据设备号找到对应驱动。

01先理解主设备号和次设备号

  • 主设备号通常用于标识对应的驱动或设备类型,次设备号用于区分该驱动管理的不同设备实例或逻辑通道。

  • 用户空间看到的/dev/xxx是设备节点,不等同于驱动本身。设备节点保存设备类型和设备号,内核据此把文件操作分发到对应驱动。

02字符设备驱动的注册流程

  • 先申请设备号,再初始化cdev并关联file_operations,随后把cdev添加到内核;具体接口和错误处理要按当前内核版本的API要求实现。

  • 需要让用户空间出现设备节点时,还要结合class、device以及系统中的udev或devtmpfs机制。不能把创建cdev和创建/dev节点当成同一步。

  • 驱动退出或初始化失败时,要按注册顺序反向释放设备节点、设备类、cdev和设备号,避免资源残留。

03read和write如何进入驱动

  • 用户程序调用open打开设备节点后,内核完成设备查找并进入驱动的open回调;read、write等系统调用再映射到file_operations中对应的函数。

  • 内核与用户空间之间传递数据时,不能直接把用户指针当作内核缓冲区使用,应使用copy_to_user和copy_from_user等接口,并检查返回值。

  • 实际项目还要处理并发访问、缓冲区边界、阻塞/非阻塞语义、poll以及异常退出等情况。

容易失分的回答    

把主设备号和次设备号的作用说反;或者认为cdev_add之后/dev节点一定自动出现。驱动注册、设备模型注册和设备节点创建是不同环节。

面试官可能继续追问

如果驱动已经加载,/sys下也能看到设备,但用户空间没有对应的/dev节点,你会从哪些环节排查?

相关业务入口

了解电子硬件设计与PCB工程实战课程


声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。仅供学习交流使用,不构成商业目的。版权归原作者所有,如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时删除。侵权投诉
相关推荐HOT
开班信息