为啥我的程序不是由 qemu 运行的,是因为它仅用于模拟 Linux——在 Linux 上

Posted

技术标签:

【中文标题】为啥我的程序不是由 qemu 运行的,是因为它仅用于模拟 Linux——在 Linux 上【英文标题】:why my program is not ran by qemu is it because its for emulating only Linux -- On Linux为什么我的程序不是由 qemu 运行的,是因为它仅用于模拟 Linux——在 Linux 上 【发布时间】:2022-01-15 15:41:55 【问题描述】:

我正在尝试在 Qemu 中为 ARM 通用 pb 板的虚拟板运行我的二进制文件。我用命令这样运行它

  qemu-system-arm -M versatilepb -m 128M -nographic -kernel test.bin

test.bin is my program. a really a simple program that writes to tty. but it gives me error that 

ALSA lib confmisc.c:767:(parse_card) cannot find card '0'
ALSA lib conf.c:4745:(_snd_config_evaluate) function snd_func_card_driver returned error: No such file or directory
ALSA lib confmisc.c:392:(snd_func_concat) error evaluating strings
ALSA lib conf.c:4745:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory
ALSA lib confmisc.c:1246:(snd_func_refer) error evaluating name
ALSA lib conf.c:4745:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5233:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM default
alsa: Could not initialize DAC
alsa: Failed to open `default':
alsa: Reason: No such file or directory
ALSA lib confmisc.c:767:(parse_card) cannot find card '0'
ALSA lib conf.c:4745:(_snd_config_evaluate) function snd_func_card_driver returned error: No such file or directory
ALSA lib confmisc.c:392:(snd_func_concat) error evaluating strings
ALSA lib conf.c:4745:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory
ALSA lib confmisc.c:1246:(snd_func_refer) error evaluating name
ALSA lib conf.c:4745:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5233:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2660:(snd_pcm_open_noupdate) Unknown PCM default
alsa: Could not initialize DAC
alsa: Failed to open `default':
alsa: Reason: No such file or directory
audio: Failed to create voice `lm4549.out'

上面的输出只是告诉我的程序中没有找到一些驱动程序。但那是 linux 的,假设 Qemu 是为了模拟 linux,但我的程序不是 linux,它几乎不是一个程序。只是简单地写信给 tty。那么有什么办法可以强制我的程序在 Qemu 上成功运行,即使 Qemu 的唯一目的是运行基于 linux 的系统和板。我能幸运地在 Qemu 中运行它吗

这是一个简单的 C 文件

volatile unsigned int * const UART0DR = (unsigned int *)0x101f1000;

void print_uart0(const char *s) 
 while(*s != '\0')  /* Loop until end of string */
 *UART0DR = (unsigned int)(*s); /* Transmit char */
 s++; /* Next char */
 


void c_entry() 
 print_uart0("Hello world!\n");

ld 脚本

ENTRY(_Reset)
SECTIONS

 . = 0x10000;
 .startup . :  startup.o(.text) 
 .text :  *(.text) 
 .data :  *(.data) 
 .bss :  *(.bss COMMON) 
 . = ALIGN(8);
 . = . + 0x1000; /* 4kB of stack memory */
 stack_top = .;

和 asm 文件被简单地称为引导内核

.section INTERRUPT_VECTOR, "x"
.global _Reset
_Reset:
  B Reset_Handler /* Reset */
  B . /* Undefined */
  B . /* SWI */
  B . /* Prefetch Abort */
  B . /* Data Abort */
  B . /* reserved */
  B . /* IRQ */
  B . /* FIQ */
 
Reset_Handler:
  LDR sp, =stack_top
  BL c_entry
  B .

或者我还有其他选择吗?可以这样和调试程序吗?

【问题讨论】:

我需要基于 Linux 的虚拟机管理程序,我可以使用它在我的系统上运行我的程序 【参考方案1】:

那里的警告输出与您的二进制文件不产生输出这一事实无关。它们来自您的主机系统的 ALSA 库,它们发生的原因是:

多功能 pb 板具有音频设备 您的主机上似乎没有设置有效的 ALSA 配置 QEMU 默认尝试使用 ALSA 进行声音输出

您可以:

忽略警告 在您的主机上配置 ALSA 通过设置 QEMU_AUDIO_DRV 环境变量告诉 QEMU 使用不同的音频后端(例如,您可以将其设置为“none”以表示“丢弃来自访客的音频输出”)

客户二进制文件缺少输出可能是客户程序本身的错误或配置错误,无论是在您构建它的方式(链接它的位置等),还是在您告诉 QEMU 的方式加载它。最好的调试方法是使用 QEMU 的内置 gdbstub,并将 Arm-aware gdb 连接到它。然后,您可以一次单步执行一条指令。

还有一点需要注意:QEMU的“-kernel”选项意思是(如果你不给它传一个ELF文件)“这是一个Linux内核,请按照Linux内核想要启动的方式启动它”。从您提供的重置处理程序中可以看出,您想要的是“将此文件加载到机器中,并在硬件通常会重置时从重置状态启动 CPU”。为此,您应该使用 generic loader 设备。

【讨论】:

tell QEMU to use a different audio backend by setting the QEMU_AUDIO_DRV environment variable (eg you can set it to "none" to say "throw away audio output from the guest") 我该怎么做。我需要在任何文件中指定吗 也请告诉我如何忽略ignore the warnings

以上是关于为啥我的程序不是由 qemu 运行的,是因为它仅用于模拟 Linux——在 Linux 上的主要内容,如果未能解决你的问题,请参考以下文章

如何使用QEMU运行Newlib应用程序?

请告诉我如何在 QEMU 上运行我的 UEFI 应用程序

C程序为啥会崩溃?

我的脚本不会在任务调度程序下运行。为啥?

使用 nasm 和 qemu 运行引导加载程序的问题

为啥我的应用在 iPhone 12 mini 上显示的尺寸不正确?