如何创建virtio平台设备?驱动中设备创建顺序咨询
解决方案
核心思路:先完成virtio设备初始化,再动态创建伪平台设备
正确的顺序是在virtio驱动的probe函数中完成虚拟设备的基础初始化后,再动态创建伪平台设备,这是完全贴合Linux驱动模型的做法,具体原因和实现步骤如下:
1. 符合设备依赖逻辑
你的场景里,伪平台设备是字符设备的父设备,而伪平台设备本身依赖virtio虚拟设备的底层资源(比如virtqueue、虚拟通信通道)。必须先确保virtio设备被正确探测、完成核心初始化(包括virtio特性协商、virtqueue配置、虚拟资源分配绑定),再基于这些就绪的资源创建上层伪平台设备,这样后续字符设备驱动触发probe时,才能正常访问父设备提供的资源。
2. 具体实现步骤
- 在virtio驱动的
probe函数中按以下顺序执行:- 常规完成virtio设备初始化:执行virtio feature协商、初始化virtqueue、分配并绑定虚拟硬件资源。
- 构建伪平台设备的
struct platform_device结构体:设置设备名称、将父设备指针指向当前virtio设备、按需复用原有设备树节点信息、将私有数据指向virtio设备的上下文结构体。 - 调用
platform_device_register()注册伪平台设备,触发对应平台设备驱动的probe流程。
- 配套清理逻辑:在virtio驱动的
remove函数中,调用platform_device_unregister()销毁伪平台设备,保证资源被正确释放。 - 设备树配置复用:如果需要把原有设备树中的配置传递给伪平台设备,可以将virtio设备的
dev.of_node赋值给伪平台设备的dev.of_node,或者根据需求截取特定节点配置。
3. 为什么不能颠倒顺序?
如果先创建平台设备再初始化virtio设备,会导致平台设备驱动probe时,底层virtio资源尚未就绪,大概率会出现空指针引用、资源访问无效等错误,完全违背了Linux驱动中“父设备就绪后再初始化子设备”的依赖原则。
内容的提问来源于stack exchange,提问作者Dufy Teguia
相关产品推荐
相关产品推荐

