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