LINUX.ORG.RU

Посоветуйте литературу по программированию qemu

 , ,


0

5

Хочется почитать что-то вроде «Linux Device Drivers», но только для qemu. Хочу эмулировать свою кастомную плату с произвольной периферией, поэтому ищу «обзорную» информацию с объяснением общих принципов написания кода для qemu.

★★★

а что, поиск и вопрос ИИ ничего не дал? мне дал это https://sebastienbourdelin.com/2021/06/16/writing-a-custom-device-for-qemu/

Ресурсы Для изучения QEMU и разработки драйверов для устройств, эмулируемых в QEMU, доступны: Документация QEMU — на сайте qemu.org есть раздел с описанием драйверов для устройств, эмулируемых в QEMU.

Репозиторий d0u9/Linux-Device-Driver — демонстрирует примеры драйверов для устройств, эмулируемых в QEMU, и руководство по их запуску в эмуляторе.

jura12 ★★
()
Последнее исправление: jura12 (всего исправлений: 1)
Ответ на: комментарий от i-rinat

Наверное имеется в виду для конечного пользователя. При разработке он каждый раз не пересобирается весь, а только изменённые файлы.

u5er ★★★
() автор топика

Тебе скорее всего уже не надо, но для тех кто будет поиском тут искать.

Берёшь какой-нибудь предельно простой девайс, напримимер https://gitlab.com/qemu-project/qemu/-/blob/master/hw/misc/empty_slot.c , копируешь и дорабатываешь напильником. Если не нужно взаимодействие с внешним миром - достаточно имплементировать read и write, которые эмулируют чтение и запись в устройство. Если эмулируешь новую видеокарту или последовательный порт - всё немного сложнее, но посмотрев на исходники похожих - будет понятно, что делать.

alt-x ★★★★★
()
Ответ на: комментарий от alt-x

Так я так и делал, но мне это не нравится. Хочется иметь хотя бы обзорную документацию по всем API, которые уже есть. Допустим, тот же доступ к памяти гостя. Я уверен, что это делается очень просто, но я не смог найти изящного решения, поэтому пришлось нагородить костылей.

К тому же, нет гарантий, что в предельно простом девайсе, который я возьму для примера, всё сделано правильно, а не запилен свой велосипед.

Так что вопрос на счёт книги всё же актуальный. Даже не смотря на то, что задачу свою я решил.

u5er ★★★
() автор топика
Последнее исправление: u5er (всего исправлений: 1)
Ответ на: комментарий от Saakx

Писал я это для сановской SBus, но потенциально оно может использоваться в качестве заглушки на любой шине, которая кидает прерываение, если пакет не доставлен. Т.е. родная прошивка сканирует слот, и если он пустой, QEMU кидает прерывание, потому что шины там эмулируются самым минималистичным образом. Чтобы прошивка не дурела от неожиданного прерывания, надо, чтобы она нашла пустоту, а не прерывание.

alt-x ★★★★★
()
Ответ на: комментарий от u5er

Доступ к памяти гостя - случайно

xp адрес

В мониторе qemu не подойдёт?

Книгу я бы и сам почитал. У Stefan’a кое что есть на разные темы, часто даже со слайдами: https://blog.vmsplice.net/search/label/qemu

alt-x ★★★★★
()
Ответ на: комментарий от alt-x

В мониторе qemu не подойдёт?

Нужен прямой доступ из сишного кода, который эмулирует подсистему. Например, мне гость пишет в регистры DMA адрес данных, которые он хочет передать по шине SPI и мне нужно как-то «разыменовать» такой «указатель».

u5er ★★★
() автор топика
Ответ на: комментарий от u5er

DMA там немного геморройно делается, это да. Не знаю, есть ли решения получше, в SPARC это делается через

address_space_ldl_be(&address_space_memory,

be - это потому что там оно BigEndian, бывает конечно ещё и le. Вообще, в Memory API были улучшения, может быть уже есть вариант чтобы сразу массив передать, а не одно слово.

alt-x ★★★★★
()
Ответ на: комментарий от alt-x

И, разумеется, в гугле по запросу «address_space_ldl_be qemu» нет ссылки на официальную документацию по нему :)

Вообще, в Memory API были улучшения, может быть уже есть вариант чтобы сразу массив передать, а не одно слово.

Я вот про то же. Правильный вариант по-любому есть, только информации о нём нет.

u5er ★★★
() автор топика
Ответ на: комментарий от alt-x

Очень похоже на cpu_physical_memory_read() и cpu_physical_memory_write(), но у них есть один недостаток - лишнее копирование. То есть, я сначала копирую данные в свой буфер, а потом уже делаю с ними что-то.

u5er ★★★
() автор топика
Ответ на: комментарий от u5er

cpu_ это частный случай address_space_, скорее всего. А зачем копировать? Если данные где-то нужны в другом буфере - можно его сразу и отдать. А если не нужны, тогда наверное через read/write_callback/ memory_listener_register это проще выразить.

alt-x ★★★★★
()
Ответ на: комментарий от alt-x

А зачем копировать?

Вот и я про то же. Эти функции используются для чтения и записи, а мне же нужен доступ по указателю. С этим мне помог memory_region_get_ram_ptr().

u5er ★★★
() автор топика