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

如何创建virtio平台设备?驱动中设备创建顺序咨询

解决方案

核心思路:先完成virtio设备初始化,再动态创建伪平台设备

正确的顺序是在virtio驱动的probe函数中完成虚拟设备的基础初始化后,再动态创建伪平台设备,这是完全贴合Linux驱动模型的做法,具体原因和实现步骤如下:

1. 符合设备依赖逻辑

你的场景里,伪平台设备是字符设备的父设备,而伪平台设备本身依赖virtio虚拟设备的底层资源(比如virtqueue、虚拟通信通道)。必须先确保virtio设备被正确探测、完成核心初始化(包括virtio特性协商、virtqueue配置、虚拟资源分配绑定),再基于这些就绪的资源创建上层伪平台设备,这样后续字符设备驱动触发probe时,才能正常访问父设备提供的资源。

2. 具体实现步骤

  • 在virtio驱动的probe函数中按以下顺序执行:
    1. 常规完成virtio设备初始化:执行virtio feature协商、初始化virtqueue、分配并绑定虚拟硬件资源。
    2. 构建伪平台设备的struct platform_device结构体:设置设备名称、将父设备指针指向当前virtio设备、按需复用原有设备树节点信息、将私有数据指向virtio设备的上下文结构体。
    3. 调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:05:21