A simple x86 firmware that can boot Linux. Most of QEMU's 500-700 ms startup time is spent: * in the dynamic linker. This can be reduced by 150 ms simply by compiling a stripped down QEMU: ./configure --disable-libssh2 --disable-tcmalloc --disable-glusterfs \ --disable-seccomp --disable-{bzip2,snappy,lzo} --disable-usb-redir \ --disable-libusb --disable-smartcard-nss --disable-libnfs \ --disable-libiscsi --disable-rbd --disable-spice --disable-attr \ --disable-cap-ng --disable-linux-aio --disable-uuid --disable-brlapi \ --disable-vnc-{jpeg,tls,sasl,png,ws} --disable-rdma --disable-bluez \ --disable-fdt --disable-curl --disable-curses --disable-sdl \ --disable-gtk --disable-tpm --disable-vte --disable-vnc \ --disable-xen --disable-opengl --target-list=x86_64-softmmu * in the BIOS. qboot saves another 150 ms. * in fw_cfg. qboot can use the new DMA interface to fw_cfg from QEMU 2.7+. Alternatively, kernel and initrd can be put in a CoreBoot cbfs image stored in flash. However, flash has a limit of 8 MB. In either case 350 ms are saved, bringing the startup time down to 60 ms. Compile qboot ============= Clone the source: $ git clone https://github.com/bonzini/qboot.git Compile the qboot firmware (you may need to install the relevant build time dependancies): $ make The result will be a 64K file named bios.bin. Usage ===== fw_cfg based example: $ qemu-kvm -bios bios.bin \ -kernel /boot/vmlinuz-4.0.3-300.fc22.x86_64 \ -serial mon:stdio -append 'console=ttyS0,115200,8n1' cbfs-based example (pflash isn't the definitive interface though): $ dd if=/dev/zero of=boot.bin bs=4096 count=1 $ cbfstool cbfs.rom create -s 8128k -B boot.bin -m x86 -o 0x1000 $ cbfstool cbfs.rom add -f /boot/vmlinuz-4.0.3-300.fc22.x86_64 -n vmlinuz -t raw $ echo 'console=ttyS0,115200,8n1' > cmdline $ cbfstool cbfs.rom add -f cmdline -n cmdline -t raw $ qemu-kvm -drive if=pflash,file=bios.bin,readonly=on \ -drive if=pflash,file=cbfs.rom,readonly=on \ -serial mon:stdio TODO ==== * SMBIOS tables * Add the possibility to configure out PIC and PCI bridge initialization * Possibly drop cbfs support, superseded by fw_cfg DMA