почему моя программа не запускается qemu, потому что она предназначена для эмуляции только Linux — в Linux

#c #embedded #embedded-linux #qemu

#c #встроенный #встроенный-linux #qemu

Вопрос:

Я пытаюсь запустить свой двоичный файл для виртуальной платы ARM versatilepb в Qemu. Я использовал команду для ее запуска следующим образом

   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 != '') { /* 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 .
 

Или у меня есть какой-либо другой вариант? может ли это и для отладки программ?

Комментарии:

1. Мне нужен гипервизор на базе Linux, который я могу использовать для запуска моей программы в моей системе

Ответ №1:

Выводимые там предупреждения не связаны с тем фактом, что ваш двоичный файл не выдает никаких результатов. Они из библиотеки ALSA вашей хост-системы, и они происходят потому, что:

  • на плате versatilepb есть аудиоустройство
  • похоже, на вашем хосте не настроена допустимая конфигурация ALSA
  • QEMU по умолчанию пытается использовать ALSA для вывода звука

Вы можете либо:

  • игнорируйте предупреждения
  • настройте ALSA на своем хост-компьютере
  • скажите QEMU использовать другой аудиообэкэнд, установив переменную среды QEMU_AUDIO_DRV (например, вы можете установить для нее значение «нет», чтобы сказать «выбросить аудиовыход от гостя»)

Отсутствие вывода из вашего гостевого двоичного файла, вероятно, является ошибкой или неправильной конфигурацией либо в самой гостевой программе, Либо в том, как вы ее создаете (где вы ее связываете и т. Д.), Либо в том, как вы говорите QEMU загрузить ее. Для отладки лучше всего использовать встроенный gdb-stub QEMU и подключить к нему gdb с поддержкой Arm. Затем вы можете выполнять одношаговые действия по одной инструкции за раз.

Еще один момент, на который следует обратить внимание: опция QEMU «-kernel» означает (если вы не передаете ей файл ELF) «это ядро Linux, пожалуйста, запустите его так, как требуется для запуска ядер Linux». Из вашего предоставления обработчика сброса следует, что вы хотите «загрузить этот файл в компьютер и запустить процессор из сброса, поскольку аппаратное обеспечение обычно сбрасывается». Для этого вы должны использовать универсальное загрузочное устройство.

Комментарии:

1. 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") и как мне это сделать. нужно ли указывать в каком-либо файле

2. также, пожалуйста, дайте мне знать, как игнорировать ignore the warnings