uefi 是可以把 grub 显示到 stdio 的
但是 seabios 不可以,只有内核启动的之后, serial 才有显示。
answer
• 这是固件与 GRUB 的默认控制台路径不同造成的;SeaBIOS 启动的 GRUB 也能显示到 stdio,只是通常需要额外配置。
先分清三个独立的设置:
层次 决定什么 ━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ QEMU 把虚拟串口连接到宿主机 stdio ───────────── ────────────────────────────── 固件 / GRUB 启动阶段向哪个设备输出 ───────────── ────────────────────────────── Linux 内核启动后使用哪个 console
接好了串口,并不意味着所有启动阶段都会向串口输出。
### 为什么 UEFI 下能看到 GRUB
UEFI 给程序提供统一的文本控制台接口,例如 ConOut->OutputString()。OVMF 可以把这个控制台同时连接到显示设备和串口,所以路径可以是:
GRUB 的 console -> UEFI ConOut -> OVMF 的串口终端驱动 -> 虚拟串口 -> QEMU stdio
因此,GRUB 即使只选择了 console,也可能通过固件重定向出现在串口上,无须 GRUB 自己使用 serial 终端。
本地 EDK2 的 /home/martins3/data/bios/edk2/OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c 中就有通过 EfiBootManagerUpdateConsoleVariable() 把串口加入 ConOut、ConIn、ErrOut 的逻辑。这符合你观察到的现象,但具体那台 VM 是否走这条路径,还 需要看其 GRUB 设置。
### 为什么 SeaBIOS 下要等到内核启动
传统 BIOS 环境里,GRUB 的 console 通常走 BIOS 显示服务,图形终端则走显卡;默认不会因为 QEMU 接了串口就重定向过去:
GRUB -> BIOS 显示服务 / 显卡 -> QEMU 显示窗口或 VNC
Linux -> console=ttyS0 -> 虚拟串口 -> QEMU stdio
Linux 启动后会根据自己的 console 配置初始化串口,因而这时开始有输出。内核参数 console=ttyS0 不会配置 GRUB 的终端。
collei 的 collei/scripts/serial.py 中,chardev_argv()、frontend_argv() 负责连接 stdio 和串口,kernel_console_args() 负责生成内核 console 参数,都是分开的。
### SeaBIOS 下也可以实现
最直接的是让 GRUB 自己使用串口。以 x86 COM1 为例,GRUB 配置可以使用:
serial –unit=0 –speed=115200 terminal_input console serial terminal_output console serial
这样菜单和交互就能经过串口,不依赖固件提供重定向。GNU GRUB 串口终端文档 (https://www.gnu.org/software/grub/manual/grub/html_node/Serial-terminal.html)
另外,你本地 SeaBIOS 的 .config 已有 CONFIG_SERCON=y,只是 /home/martins3/data/bios/seabios/src/sercon.c 的 sercon_setup() 还要求运行 时提供 etc/sercon-port,否则直接返回。对 COM1,可以给 QEMU 增加:
-fw_cfg name=etc/sercon-port,string=0x3f8
当前 collei 的 setup_bios() 没有主动传这个参数。这种方式重定向的是 BIOS 文本显示服务,不能把任意图形输出变成串口文本;只为显示 GRUB 菜 单,优先配置 GRUB 的 serial 终端更直接。
netty
没有任何关系的东西
本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。