嵌入式Linux面试:字符设备驱动如何注册?/dev节点和read、write是怎么关联的?
字符设备驱动是Linux驱动面试中的基础题。面试官通常会从主设备号、次设备号问到cdev注册,再追问用户程序打开/dev节点后,read和write最终如何进入驱动。
嵌入式Linux面试:字符设备驱动如何注册?/dev节点和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工程实战课程

扫码关注































