模拟 Linux 内核时出现黑屏

3

我正在尝试为ARM(万能板)构建Linux并使用Qemu进行仿真:

我按照以下教程进行操作。

在下载Qemu和arm-linux-gnueab工具链之后,步骤基本上如下:

  • make -C build ARCH=arm distclean

  • make -C build ARCH=arm versatile_defconfig

  • make -C build ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-

  • qemu-system-arm -M versatileab -m 256M -kernel build/arch/arm/boot/zImage -append "console=ttyS0" -serial stdio -dtb build/arch/arm/boot/dts/versatile-ab.dtb

然而,我得到的是一个黑屏,顶部有光标和以下消息:

pulseaudio: set_sink_input_volume() failed
pulseaudio: Reason: Invalid argument
pulseaudio: set_sink_input_mute() failed
pulseaudio: Reason: Invalid argument
Uncompressing Linux... done, booting the kernel.
vpb_sic_write: Bad register offset 0x2c

我不确定问题出在哪里:是内核配置有误?还是dtb?消息并没有提供很多信息。欢迎您的建议。
Qemu版本:
qemu-system-arm --version
QEMU emulator version 2.0.0 (Debian 2.0.0+dfsg-2ubuntu1.31), Copyright (c) 2003-2008 Fabrice Bellard

我的机器:

uname -a
Linux user-SATELLITE-C855-169 4.2.0-27-generic #32~14.04.1-Ubuntu SMP Fri Jan 22 15:32:26 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
1个回答

3

设备ttyS0通常用于PC风格的8250/16550串行端口,而QEMU模拟versatileab和versatilepb机器上的AMBA PL011,使用设备名称ttyAMA0,因此您可以尝试使用console=ttyAMA0替代。

帧缓冲控制台可能需要在启动期间由内核绑定,这由在内核配置中设置FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y来控制,这应该允许在tty0设备上使用console=tty0

您可以指定多个console=选项,因此使用console=ttyAMA0 console=tty0应该会在模拟控制台端口(使用您的选项的stdio)和帧缓冲区上显示内核引导消息。


谢谢您的反馈,我现在没有笔记本电脑,但我会尝试并回复您。只是一个问题:我们如何在启动内核之前知道可用设备的名称? - Mouin
能够工作,谢谢您。请问您能否提供更多关于如何选择好的“tty”设备的细节? - Mouin
2
如果启用了framebuffer,则始终将其绑定到tty/tty0。对于串行控制台,您可以检查DTS文件。在arch/arm/boot/dts/versatile-pb.dts中搜索uart,您将找到驱动程序名称pl011。搜索该文件名,您会发现drivers/tty/serial/amba-pl011.c。在该文件中搜索struct uart_driver,您会找到一个结构体,其中.dev_name =“ttyAMA”-这是您应该使用的名称(附加设备索引号)。 - matja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接