Задать вопрос
Ответы пользователя по тегу QEMU
  • Почему приходит прерывание 0x20 в QEMU сразу после запуска ядра?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Может это нормальное поведение или проблема не с контроллером?

    INT 0x20 это IRQ0 в твоей конфигурации, как я понимаю. IRQ0 на PC обычно таймер дёргает. Если прерывание не нужно -- не разрешай его в PIC. Если нужно настроить по-другому -- настраивай канал 0 таймера через порты 0x40 и 0x43.
    Ответ написан
    Комментировать
  • Проблема с обработкой клавиатурных прерываний в QEMU?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Правильно ли я вообще понимаю как устроенны клавиатурные прерывания?

    Пишут такое:
    In the default configuration, break codes are the make scan codes with the high bit set; make codes 60h,61h,70h, etc. are not available because the corresponding break codes conflict with prefix codes (code 2Ah is available because the self-test result code AAh is only sent on keyboard initialization). An alternate keyboard configuration can be enabled on AT and later systems with enhanced keyboards, in which break codes are the same as make codes, but prefixed with an F0h scan code.

    т.е. понимаешь правильно, но это 1) настройка для альтернативной конфигурации и 2) бывают многобайтовые скан-коды (см. например).
    Ответ написан
    1 комментарий
  • Почему ОС запускается на QEMU, а на Virtual Box нет?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Почему ОС не запускается на Virtual box, а на QEMU запускаеться?

    Потому что QEMU TCG не очень точно эмулирует x86. Если в командную строку qemu добавить -enable-kvm, то оно тоже не будет работать.

    А вот если добавить ret в реализацию GDT::load_gdt() и не вызывать load_tss() то оно начинает в qemu-kvm работать:
    diff --git a/src/GDT/GDT_impl.s b/src/GDT/GDT_impl.s
    index 4f69835abd9d..5476837f3d0a 100644
    --- a/src/GDT/GDT_impl.s
    +++ b/src/GDT/GDT_impl.s
    @@ -2,6 +2,7 @@
     .extern _ZN8SimpleOS3GDT7gdt_ptrE
     _ZN8SimpleOS3GDT8load_gdtEv:
            lgdt _ZN8SimpleOS3GDT7gdt_ptrE
    +       ret
     
     .global _ZN8SimpleOS3GDT8load_tssEv
     _ZN8SimpleOS3GDT8load_tssEv:

    Подозреваю, что и в virtual box оно заработает.
    Проблема в загрузке TSS, короче. Мне не знакомы дебри TSS, но для поверхностного взгляда кажется странным то, что все сегментные селекторы в твоём TSS имеют RPL=3, а селектор стека -- RPL=0.
    Если ты хочешь разбираться с тем, что происходит, то разумно было бы поменять порядок инициализации, сначала загрузить IDT, чтобы иметь возможность обрабатывать исключения, а потом загружать TSS и смотреть, что за исключение эта операция выкидывает.
    С другой стороны, непонятно зачем в текущей версии этой ОС нужен TSS. Подозреваю, что никакая функциональность не будет потеряна, если его не загружать.
    Ответ написан
    Комментировать
  • Как в виртуальных процессорах устроена виртуальная память?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    зачем там реализуют разные модули, типа кеша, вроде в каком-то даже увидел конвеер исполнения команд, предсказатели переходов. И прочие. К примеру кеш, тлб, зачем он там нужен. если все как бы просиходит внутри машины?

    Фронт-енды QEMU реализуют большую часть наблюдаемого поведения моделируемого ими процессора. Одно большое исключение -- это процессорный кеш: QEMU не моделирует поведение процессорного кеша. TLB во многих архитектурах доступен для прямого чтения/записи через команды процессора, нельзя сказать что он "внутри машины".

    Зачем адрес куда-то в кеш записывать, если этот кеш 3 уровня, или регистр лежит с точки зрения внешней среды, там же где и ram и доступ должен быть одинаковым.

    Покажи пример, обсудим конкретику?

    Ассоциативная память. Если там внутри делается таблица адресов, виртуальных адресов. То к примеру для адресного пространства 4гб, будет 2^32 это будет в 32 раза дольше.

    Это какие-то очень странные допущения и прикидки, а то, что они не учитывают такие параметры как размер TLB и его ассоциативность, показывает их безосновательность.

    Короче, в итоге для поиска адреса в супер жесткой виртуальной машине, будет до 32 операции сравнений по словарю, потом суммарно где же в кешах каждого уровня, куча прочих проверок .... .

    Нифига. В QEMU есть два уровня TLB -- один, моделируемый процессорным фронт-ендом, второй -- собственный TLB QEMU softmmu независимый от эмулируемого процессора, поиск по которому встроен в генерируемый JIT (который в QEMU называется TCG) код. Собственный TLB QEMU прямого отображения, т.е. поиск в этом TLB -- это всегда проверка одного элемента массива и загрузка одного отображения в случае успеха. Например вот так генерируется код для этого на хосте x86. В случае неудачи происходит вызов функции поиска в архитектурно-зависимом TLB. Вот так этот вызов генерируется, а вот пример его реализации во фронт-енде. Поскольку этот TLB моделирует конкретную архитектуру его ассоциативность может варьироваться в широких пределах, или он может вообще отсутствовать. В случае промаха или отсутствия TLB поиск может либо продолжаться дальше в таблицах страниц, например так, либо фронт-енд генерирует исключение доступа к памяти, например так.

    В итоге операций при поиске трансляции для виртуального адреса может быть гораздо больше чем 32, которые ты предположил, в случае промахов, но цена промахов амортизируется тем, что чем более они дороги, тем более они редки. Но, конечно, задача намеренно обращающаяся к никогда не повторяющимся страницам памяти будет иметь очень низкую производительность при выполнении в QEMU softmmu.
    Ответ написан
    2 комментария
  • Как перенаправить сеть между виртуалкой и хостом без iptables и прочих?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Запускать qemu с сетевым адаптером подключенным к tap, а tap-интерфейс объединить в бридж с нужным хостовым адаптером. Типа того: https://www.linux-kvm.org/page/Networking#Public_Bridge
    Ответ написан
    Комментировать
  • Как распаковать все файлы из qcow2?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    qcow2 -- это формат представления блочного устройства, на нём нет файлов, на нём может быть файловая система или разделы с файловыми системами. Можно превратить qcow2 в обычный raw образ командой qemu-img: qemu-img dd -O raw if=file.qcow2 of=file.raw.
    Получившийся сырой образ можно анализировать стандартными средствами. Если там одна файловая система, можно её просто примонтировать через loop: mkdir fs ; sudo mount file.raw fs. Если там таблица разделов, можно каким-нибудь kpartx создать устройства для каждого из разделов и примонтировать нужные:
    $ mkdir fs ; sudo kpartx -av file.raw 
    add map loop0p1 (254:4): 0 65536 linear 7:0 2048
    add map loop0p2 (254:5): 0 2029568 linear 7:0 67584
    $ sudo mount /dev/mapper/loop0p2 fs

    Естественно, если на разделах какой-нибудь LVM или LUKS прийдётся делать дополнительные телодвижения чтобы добраться до файлов.
    Ответ написан
    Комментировать
  • Можно ли эмулировать Raspberry Pi 4 в Qemu?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    (чтобы не тратить время).
    Нужно для сборки приложения для RPi4 без железа. Кросскомпиляцию не осилил.

    С целью "чтобы не тратить время" лучше осилить кросс-компиляцию. Потому что производительность эмулируемого на x86 arm-устройства так себе.
    Ответ написан
    Комментировать
  • Qemu как правильно запускать vm?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как запустить vm в молчаливом режиме, без открытия ее консоли?

    -nographic -serial none -monitor none
    есть для mipsel какие либо акселераторы, типа kvm?

    Есть, но надо понимать, что kvm требует, чтобы гостевая архитектура совпадала с хостовой, т.е. qemu для этого нужно запускать на mips-хосте.
    Ответ написан
    2 комментария
  • Как добавить поддержку vdi в qemu-img?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как добавить поддержку vdi в qemu-img?

    Взять qemu достаточно новый, с поддержкой vdi (она там уже > 10 лет, эта часть не должна вызвать проблем). Сконфигурировать его с ключом --enable-vdi. Построить. Типа того:

    $ wget https://download.qemu.org/qemu-5.2.0.tar.xz
    $ tar -xf qemu-5.2.0.tar.xz
    $ mkdir build
    $ cd build
    $ ../qemu-5.2.0/configure --prefix=`pwd`/root --enable-vdi --enable-tools --disable-user --disable-system
    $ make && make install
    $ root/bin/qemu-img --help | grep vdi
    Supported formats: blkdebug blklogwrites blkverify bochs cloop compress copy-on-read dmg file ftp ftps host_cdrom host_device http https luks nbd null-aio null-co nvme parallels qcow qcow2 qed quorum raw replication throttle vdi vhdx vmdk vpc vvfat
    Ответ написан
    5 комментариев
  • Как установить ARM Android на QEMU?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    установить ARM андроид на QEMU ... как установить такой андроид на на эмулятор QEMU ... и потом дополнить плагинами KQEMU и KVM?

    Никак. KQEMU уже лет 10 как сдох, KVM ускоряет только виртуальные машины с той же архитектурой, что и у хоста, т.е. x86(_64) на x86_64, для ARM + KVM нужен ARM-хост.
    Ответ написан
  • Error loading uncompressed kernel without PVH ELF Note ( osdev ) !?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    пытаюсь понять, почему qemu не хочет запускать ядро....


    Потому что это не заголовок multiboot, MAGIC тут взят из старой версии формата, а структура -- из версии 2:

    MAGIC equ 0x1BADB002
    ...
    grubBoot:
      dd MAGIC
      dd FLAGS
    ;	dd 0
      dd (end_grubBoot - grubBoot)
      dd -(MAGIC + FLAGS + (end_grubBoot - grubBoot))
    ;	dd -(MAGIC + 0 + (end_grubBoot - grubBoot))
      
    ;	dw 0
    ;	dw FLAGS
    ;	dd 8
    end_grubBoot:


    QEMU отлично понимает заголовок старого формата:

    MAGIC equ 0x1BADB002
    
      dd MAGIC
      dd FLAGS
      dd -(MAGIC + FLAGS)


    И с этим изменением твой код прекрасно загружается и выполняется:

    trace
    ...
    
    Trace 0: 0x7f2a71e084c0 [00000000/000caa1a/0xb0]
    ----------------
    IN:
    0x00102060:  9b                       wait
    0x00102061:  db e3                    fninit
    0x00102063:  bc 44 23 10 00           movl     $0x102344, %esp
    0x00102068:  53                       pushl    %ebx
    0x00102069:  50                       pushl    %eax
    0x0010206a:  e8 68 00 00 00           calll    0x1020d7
    
    Trace 0: 0x7f2a71e08800 [00000000/00102060/0xb0]
    ----------------
    IN:
    0x001020d7:  55                       pushl    %ebp
    0x001020d8:  89 e5                    movl     %esp, %ebp
    0x001020da:  68 00 10 10 00           pushl    $0x101000
    0x001020df:  e8 8d ff ff ff           calll    0x102071
    
    Linking TBs 0x7f2a71e08800 [00102060] index 0 -> 0x7f2a71e08a40 [001020d7]
    Trace 0: 0x7f2a71e08a40 [00000000/001020d7/0xb0]
    ----------------
    IN:
    0x00102071:  55                       pushl    %ebp
    0x00102072:  89 e5                    movl     %esp, %ebp
    0x00102074:  53                       pushl    %ebx
    0x00102075:  83 ec 10                 subl     $0x10, %esp
    0x00102078:  c7 45 f4 00 80 0b 00     movl     $0xb8000, -0xc(%ebp)
    0x0010207f:  c7 45 f8 00 00 00 00     movl     $0, -8(%ebp)
    0x00102086:  eb 35                    jmp      0x1020bd
    
    Linking TBs 0x7f2a71e08a40 [001020d7] index 0 -> 0x7f2a71e08c80 [00102071]
    Trace 0: 0x7f2a71e08c80 [00000000/00102071/0xb0]
    ----------------
    IN:
    0x001020bd:  8b 55 f8                 movl     -8(%ebp), %edx
    0x001020c0:  8b 45 08                 movl     8(%ebp), %eax
    0x001020c3:  01 d0                    addl     %edx, %eax
    0x001020c5:  0f b6 00                 movzbl   (%eax), %eax
    0x001020c8:  0f be c0                 movsbl   %al, %eax
    0x001020cb:  3b 45 f8                 cmpl     -8(%ebp), %eax
    0x001020ce:  7f b8                    jg       0x102088
    
    Linking TBs 0x7f2a71e08c80 [00102071] index 0 -> 0x7f2a71e08f00 [001020bd]
    Trace 0: 0x7f2a71e08f00 [00000000/001020bd/0xb0]
    ----------------
    IN:
    0x00102088:  8b 45 f8                 movl     -8(%ebp), %eax
    0x0010208b:  8d 14 00                 leal     (%eax, %eax), %edx
    0x0010208e:  8b 45 f4                 movl     -0xc(%ebp), %eax
    0x00102091:  01 d0                    addl     %edx, %eax
    0x00102093:  8b 55 f8                 movl     -8(%ebp), %edx
    0x00102096:  8d 0c 12                 leal     (%edx, %edx), %ecx
    0x00102099:  8b 55 f4                 movl     -0xc(%ebp), %edx
    0x0010209c:  01 ca                    addl     %ecx, %edx
    0x0010209e:  0f b7 12                 movzwl   (%edx), %edx
    0x001020a1:  89 d3                    movl     %edx, %ebx
    0x001020a3:  b3 00                    movb     $0, %bl
    0x001020a5:  8b 4d f8                 movl     -8(%ebp), %ecx
    0x001020a8:  8b 55 08                 movl     8(%ebp), %edx
    0x001020ab:  01 ca                    addl     %ecx, %edx
    0x001020ad:  0f b6 12                 movzbl   (%edx), %edx
    0x001020b0:  66 0f be d2              movsbw   %dl, %dx
    0x001020b4:  09 da                    orl      %ebx, %edx
    0x001020b6:  66 89 10                 movw     %dx, (%eax)
    0x001020b9:  83 45 f8 01              addl     $1, -8(%ebp)
    0x001020bd:  8b 55 f8                 movl     -8(%ebp), %edx
    0x001020c0:  8b 45 08                 movl     8(%ebp), %eax
    0x001020c3:  01 d0                    addl     %edx, %eax
    0x001020c5:  0f b6 00                 movzbl   (%eax), %eax
    0x001020c8:  0f be c0                 movsbl   %al, %eax
    0x001020cb:  3b 45 f8                 cmpl     -8(%ebp), %eax
    0x001020ce:  7f b8                    jg       0x102088
    
    Linking TBs 0x7f2a71e08f00 [001020bd] index 1 -> 0x7f2a71e091c0 [00102088]
    Trace 0: 0x7f2a71e091c0 [00000000/00102088/0xb0]
    Linking TBs 0x7f2a71e091c0 [00102088] index 1 -> 0x7f2a71e091c0 [00102088]
    Trace 0: 0x7f2a71e091c0 [00000000/00102088/0xb0]
    ----------------
    IN:
    0x001020d0:  90                       nop
    0x001020d1:  83 c4 10                 addl     $0x10, %esp
    0x001020d4:  5b                       popl     %ebx
    0x001020d5:  5d                       popl     %ebp
    0x001020d6:  c3                       retl
    
    Linking TBs 0x7f2a71e091c0 [00102088] index 0 -> 0x7f2a71e098c0 [001020d0]
    Trace 0: 0x7f2a71e098c0 [00000000/001020d0/0xb0]
    ----------------
    IN:
    0x001020e4:  83 c4 04                 addl     $4, %esp
    0x001020e7:  eb fe                    jmp      0x1020e7
    
    Trace 0: 0x7f2a71e09b00 [00000000/001020e4/0xb0]
    ----------------
    IN:
    0x001020e7:  eb fe                    jmp      0x1020e7
    
    Linking TBs 0x7f2a71e09b00 [001020e4] index 0 -> 0x7f2a71e09c40 [001020e7]
    Trace 0: 0x7f2a71e09c40 [00000000/001020e7/0xb0]
    Linking TBs 0x7f2a71e09c40 [001020e7] index 0 -> 0x7f2a71e09c40 [001020e7]
    
    ...


    Ещё непонятно, зачем такие игры с форматом kernel, можно было же напрямую:
    LDEMU=-melf_i386
    kernel: $(CSOURCES) $(NASMSOURCES) $(LDFILE)
            $(CC) $(CEMU) -std=c$(CSTD) -c $(CSOURCES) -ffreestanding -nostdlib -nostdinc -fno-pic
            $(ASM) $(NASMSOURCES)
            $(LD) $(LDEMU) --nmagic -T$(LDFILE) -o kernel *.o
    Ответ написан
  • Почему "The max CPUs supported by machine 'versatilepb' is 1"?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Машина versatilepb -- это же антиквариат. Какой-нибудь vexpress-a15 хотя бы нужен для многоядерности.
    Ответ написан
  • Как послать набор символов в qemu, если там нет ОС?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Можно научить интерпретатор читать из последовательного порта, присоединить последовательный порт QEMU к stdio опцией -serial и писать туда например так:
    echo '++++++' | qemu-system-... -nographic -monitor none -serial stdio
    Ответ написан
    Комментировать
  • Как настроить сеть в qemu?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Пробовал еще так: -net tap,vlan=0,ifname=tap0,script=no,downscript=no, назнал адреса хосту и гостевой, но не работает, хост даже не пингуется!

    Регулярно пользуюсь этим способом, всё работает. Если стоит networkmanager надо следить за тем, чтобы он не потушил tap-интерфейс если qemu от него отключается.
    Ответ написан
    Комментировать
  • Как в KVM или QEMU запустить не сжатое ядро системы?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    для иследовательских целей хотелось бы запустить не сжатое ядро системы, кто может что подсказать

    А почему вы думаете, что это вообще возможно? vmlinux должен быть рассчитан на прямую загрузку и это действительно поддерживается для некоторых конфигураций некоторых архитектур. Но не для всех.
    И, да -- что вы ожидаете от загрузки несжатого ядра, чего вам не даст загрузка сжатого?
    Ответ написан
    6 комментариев
  • Как qemu angstrom на beaglebone?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    но при вызове ... я увидел только адреса в памяти на консоли

    Показывай, что увидел.

    Как это сделать правильно

    В общем всё правильно сделал. Мог бы сократить себе работу, если нужен только linux, подсунув QEMU uImage в параметре -kernel, а командную строку ядра, переданную из u-Boot -- в параметре -append
    Ответ написан
  • Эмулируют ли QEMU/KVM и VmWare AHCI(SATA) контроллеры?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    За VmWare не скажу, QEMU умеет. Синтаксис командной строки, правда, вырвиглазный.
    См. например lists.gnu.org/archive/html/qemu-devel/2011-11/msg03537.html
    Ответ написан
    Комментировать