为啥我的程序不是由 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 上的主要内容,如果未能解决你的问题,请参考以下文章