Raspberry pi Buildroot和Qemu

Raspberry pi Buildroot和Qemu,raspberry-pi,arm,kernel,qemu,buildroot,Raspberry Pi,Arm,Kernel,Qemu,Buildroot,我正在使用buildroot编译一个具有4.19-rt内核的简约linux。它应该在raspberry pi 3b(arm处理器)上运行。此外,我想在x86_64 linux计算机上运行它,并发现qemu是一个仿真解决方案 构建linux和内核并在raspi上运行是可行的。它引导,我可以登录并使用它 为了测试qemu,我遵循以下说明[1]。最近的raspbian 4.19内核启动良好,因此qemu似乎安装正确 带来1。二,。一起失败。当我尝试模拟任何自建linux时,qemu只显示一个黑屏,一个

我正在使用buildroot编译一个具有4.19-rt内核的简约linux。它应该在raspberry pi 3b(arm处理器)上运行。此外,我想在x86_64 linux计算机上运行它,并发现qemu是一个仿真解决方案

  • 构建linux和内核并在raspi上运行是可行的。它引导,我可以登录并使用它

  • 为了测试qemu,我遵循以下说明[1]。最近的raspbian 4.19内核启动良好,因此qemu似乎安装正确

  • 带来1。二,。一起失败。当我尝试模拟任何自建linux时,qemu只显示一个黑屏,一个CPU使用率为100% 我使用的sdcard.img与在真实硬件上工作的sdcard.img相同。我还尝试用普通的4.19内核重新编译整个系统(没有实时性)。我试图构建一个多功能系统(使qemu\u arm\u多功能\u defconfig&&make)。这些都不管用

    用于启动仿真的命令:

    sudo qemu-system-arm -kernel zImage -drive format=raw,file=sdcard.img -cpu arm1176 -m 256 -M versatilepb -no-reboot -append "root=/dev/mmcblk0p2 panic=1 rootfstype=ext4 rw" -serial stdio
    
    我的主要问题是,绝对没有有用的输出。该命令输出以下命令

    ALSA lib pulse.c:242:(pulse_connect) PulseAudio: Unable to connect: Connection refused
    
    sdl: SDL_OpenAudio failed
    sdl: Reason: ALSA: Couldn't open audio device: Connection refused
    ALSA lib pulse.c:242:(pulse_connect) PulseAudio: Unable to connect: Connection refused
    
    sdl: SDL_OpenAudio failed
    sdl: Reason: ALSA: Couldn't open audio device: Connection refused
    audio: Failed to create voice `lm4549.out'
    
    并打开一个图形输出窗口(不显示任何内容)。在模拟raspbian时也会出现此消息,因此这似乎不是原因

    当我使用预构建raspbian但不使用-dtb参数运行qemu时,会收到类似“错误:无效的dtb和无法识别/不支持的机器ID”的消息。我的自建代码至少应该是这样的。但因为没有输出,我甚至不知道谷歌有什么用

    是否有人知道我做错了什么,或者我是如何让qemu向我提供关于哪里出了问题的有用信息的



    [1]

    问题是,如果内核是为某个Arm硬件编译的,那么它只会在该硬件上启动。否则它通常会失败,通常是在能够输出任何有用的东西之前崩溃

    特别是,QEMU的“versatilepb”机器与覆盆子Pi完全不同。任何使用该机器类型的工作指令集实际上都在运行一个内核,该内核是为与versatilepb板和raspi用户空间/文件系统一起工作而构建的。您试图在一台不是raspi的机器上构建一个只支持raspi的内核,这是行不通的

    如果编译时支持两种板卡类型(两种板卡类型的所有设备驱动程序等),则可以构建一个在多个Arm硬件上工作的内核。如果您想沿着这条路走下去,我建议您查看运行内核的内核配置与您的内核配置之间的差异,并添加看似合理的缺失内容,直到您找到实际需要的内容

    您尝试直接从sdcard.img在QEMU上引导将不起作用,因为QEMU的versatilepb板型号不支持直接从sdcard引导(这需要我们在来宾系统中运行某种BIOS/固件映像,而我们没有)。对于versatilepb,您需要直接向QEMU提供内核,可能是initrd,当然还需要为versatilepb提供正确的dtb


    你可以试着看看QEMU的“raspi2”和“raspi3”板模型,它们确实模拟了Raspberry Pis的硬件。然而,缺点是这些模型缺少一些功能,并且开发得不是很积极,因此通常较新的内核不会在它们上启动,而且由于没有USB控制器模型,因此无法联网。(这就是为什么大多数博客帖子等都建议使用“versatilepb”——用户空间通常并不真正关心它运行在什么硬件上,因此除非您尝试进行内核开发,否则您可以运行versatilepb内核并利用QEMU模型所具有的联网等功能。)高级Linux声音体系结构(ALSA)尝试打开音频接口设备。您必须在qemu中提供音频设备。因为内核是用ALSA音频驱动程序编译的,并且您已经在Buildroot中编译了sdl库

    ALSA lib pulse.c:242:(pulse_connect) PulseAudio: Unable to connect: Connection refused
    
    sdl: SDL_OpenAudio failed
    sdl: Reason: ALSA: Couldn't open audio device: Connection refused
    ALSA lib pulse.c:242:(pulse_connect) PulseAudio: Unable to connect: Connection refused
    
    sdl: SDL_OpenAudio failed
    sdl: Reason: ALSA: Couldn't open audio device: Connection refused
    audio: Failed to create voice `lm4549.out'