Сборка root и Qemu - PullRequest
       121

Сборка root и Qemu

0 голосов
/ 09 января 2020

Я использую сборку root для компиляции minimalisti c linux с ядром 4.19-rt. Предполагается, что он работает на Raspberry Pi 3B (процессор руки). Кроме того, я хочу запустить его на компьютере x86_64 linux и в качестве решения для эмуляции нашел qemu.

  1. Сборка linux и ядра и запуск его на raspi работает. Он загружается, я могу войти и использовать его.

  2. Для проверки QEMU я следовал этой инструкции [1]. Недавний raspbian с ядром 4.19 загружается нормально, поэтому, похоже, qemu установлен правильно.

sudo qemu-system-arm -kernel ./qemu-rpi-kernel/kernel-qemu-4.19.50-buster -hda 2019-09-26-raspbian-buster-lite.img -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -dtb qemu-rpi-kernel/versatile-pb.dtb
Объединение 1. и 2. не удается. Когда я пытаюсь эмулировать любую самостоятельную сборку linux, qemu показывает только черный экран и один процессор использует 100%.

Я использовал тот же sdcard.img, который работает на реальном оборудовании. Я также пытался перекомпилировать всю систему с нормальным ядром 4.19 (без реального времени). И я попытался построить универсальную систему (make qemu_arm_versatile_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, поэтому оно не является причиной.

Когда я запускаю qemu с предварительно собранным raspbian, но без аргумента -dtb, я получаю сообщение типа «Ошибка: недопустимый dtb и нераспознанный / неподдерживаемый идентификатор машины ". Я бы, по крайней мере, ожидал что-то подобное с моим собственным кодом сборки. Но из-за отсутствия выходных данных у меня нет идей, что даже искать в Google.

Может быть, у кого-то есть идея, что я делаю неправильно или как я получаю qemu, чтобы предоставить мне любую полезную информацию о том, что произошло? не так?

Заранее спасибо


[1] https://blog.agchapman.com/using-qemu-to-emulate-a-raspberry-pi/

1 Ответ

0 голосов
/ 10 января 2020

Проблема в том, что ядро ​​будет загружаться только на части оборудования Arm, если оно скомпилировано для этого оборудования. В противном случае обычно происходит сбой, обычно из-за сбоя до того, как он может вывести что-либо полезное.

В частности, машина QEMU 'versatilepb' полностью отличается от Raspberry Pi. Любой рабочий набор инструкций, которые используют этот тип машины, действительно работает на ядре, построенном для работы с платой versatilepb и пользовательским пространством / файловой системой raspi поверх этого. Вы пытаетесь собрать ядро, которое поддерживает только raspi на машине, которая не является raspi, и это не сработает.

Возможно построить ядро, которое работает более чем на одном часть оборудования Arm, если вы компилируете поддержку двух типов плат (все драйверы устройств для обоих, и т. д. c). Если вы хотите go пойти по этому пути, я бы посоветовал взглянуть на различия между конфигурацией ядра для работающего и вашего ядра и добавить недостоверно выглядящие недостающие элементы, пока не выясните, что на самом деле требуется.

Ваша попытка загрузки на QEMU напрямую из sdcard.img не будет работать, потому что модель универсальной платы QEMU не поддерживает прямую загрузку с sdcard (для этого потребуется запустить какой-нибудь образ BIOS / прошивки в гостевой системе, что мы и не делаем нет). Для versatilepb вам необходимо напрямую указать ядру QEMU, возможно initrd, и определенно правильный dtb для versatilepb.

Вместо этого вы можете попробовать посмотреть на модели плат QEMU "raspi2" и "raspi3", которые действительно сделать модель оборудования Raspberry Pis. Недостатки, однако, заключаются в том, что в этих моделях отсутствуют некоторые функции и они не очень активно разрабатываются, поэтому часто более новые ядра не загружаются на них, а также, поскольку нет модели контроллера USB, нет возможности подключиться к сети. (Вот почему большинство постов в блоге и др. c предлагают использовать 'versatilepb' - пользовательское пространство часто не заботится о том, на каком именно оборудовании оно работает, поэтому, если вы не пытаетесь заниматься разработкой ядра, вы можете просто запустить versatilepb ядро и воспользоваться возможностями, такими как сетевое взаимодействие, которое есть в модели QEMU.)

...