Virtio Console、HVC 与多端口
1. 两种功能
virtio_console.c同时提供:
- early/primary console,通过HVC接入内核console和TTY;
- generic multiport字符通道,创建
/dev/vportNpn。
1 | guest userspace/TTY |
2. 对象
ports_device:一个virtio device;port:一个console或generic port;port_buffer:入站virtqueue buffer;- 全局
pdrvdata:class、major/minor和device list。
每个port有input/output virtqueue、waitqueue、spinlock、mutex、open状态和host connection状态。
3. Probe
1 | virtio probe |
Multiport依赖control virtqueues;单console可使用固定data queues。
4. Host控制消息
控制事件包括:
- DEVICE_READY;
- PORT_ADD/REMOVE;
- PORT_READY;
- CONSOLE_PORT;
- PORT_OPEN;
- PORT_NAME;
- RESIZE。
Control work解析host消息并创建/删除port。所有ID、size和状态都来自host,应验证范围和当前生命周期。
5. Read
1 | read /dev/vport |
Nonblocking无数据返回-EAGAIN;host remove或disconnect返回EOF/error并唤醒waiters。
6. Write
Write把用户buffer放入output virtqueue并等待used completion或可用descriptor。Large write可能分段;blocking状态受host消费速度影响。
不能在持port state spinlock时copy_from_user或等待virtqueue。
7. Open/Close
Generic port通常限制单open语义。Open向host发送PORT_OPEN,close通知关闭并清理fasync/wait。
Host也可改变连接状态。Local open与host open是两层状态。
8. HVC
Console port注册hvc console/tty ops,用于:
- kernel boot log;
- guest login console;
- emergency output。
Console写不能依赖普通用户进程上下文,应避免不可控长阻塞。
9. Hot Unplug
Port remove:
1 | mark removed |
Virtio device remove还需reset device、del vqs并注销major。
10. 安全
Host/hypervisor能:
- 注入console输入;
-读取guest输出; - 创建命名port;
- 触发hotplug;
-控制backpressure。
机密数据不应无加密地经vport发送给不可信host。Udev按host提供name创建symlink时需防名称策略混淆。
11. RK3588
Rockchip主要defconfig未显式启用VIRTIO_CONSOLE。裸机RK3588通常使用UART console;只有作为虚拟机guest或特殊virtio transport环境才使用本驱动。
Host侧virtio backend也不在此文件中。
正在加载留言…