Virtio Console、HVC 与多端口

Virtio Console、HVC 与多端口

1. 两种功能

virtio_console.c同时提供:

  1. early/primary console,通过HVC接入内核console和TTY;
  2. generic multiport字符通道,创建/dev/vportNpn
1
2
3
4
guest userspace/TTY
-> virtio_console
-> input/output/control virtqueues
-> hypervisor host backend

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
2
3
4
5
6
7
8
9
virtio probe
-> negotiate features
-> allocate ports_device
-> find/create control queues
-> register dynamic char major
-> init config work
-> host sends PORT_ADD
-> add_port
-> cdev/device_create

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
2
3
4
5
read /dev/vport
-> wait for inbuf
-> copy available bytes
-> recycle buffer to input vq
-> kick host

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
2
3
4
5
6
7
mark removed
-> remove from list
-> device_destroy/cdev_del
-> wake readers/writers
-> flush work
-> wait/open reference cleanup
-> free buffers

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也不在此文件中。

文章互动

阅读 --

留言

0 条留言

正在加载留言…