Bergantung pada distribusi yang ingin Anda gunakan, ada berbagai cara untuk membuat image sistem file, mis. artikel ini memandu Anda melalui cara yang melelahkan menuju "Linux dari Awal" sistem.
Secara umum , Anda keduanya buat gambar QEMU menggunakan qemu-img
, ambil beberapa media instalasi distribusi dan gunakan QEMU dengan media instalasi untuk menyiapkan image (halaman ini menjelaskan proses untuk Debian GNU/Linux) atau gunakan gambar yang disiapkan oleh orang lain.
Bagian dari QEMU Wikibook ini berisi semua informasi yang Anda butuhkan.
Sunting: Seperti yang disarankan oleh jawaban Gilles untuk pertanyaan tertaut, Anda tidak memerlukan sistem file root lengkap untuk pengujian, Anda cukup menggunakan initrd
gambar (misalnya, initrd Arch Linux seperti di sini)
Prosedur langkah demi langkah QEMU + GDB diuji pada host Ubuntu 16.10
Untuk memulai dari awal dengan cepat, saya telah membuat contoh QEMU + Buildroot otomatis minimal di:https://github.com/cirosantilli/linux-kernel-module-cheat Langkah-langkah utama dibahas di bawah.
Pertama dapatkan filesystem root rootfs.cpio.gz
. Jika Anda membutuhkannya, pertimbangkan:
- minimal
init
-only executable image:Distro Linux khusus yang hanya menjalankan satu program, tidak ada yang lain | Unix &Linux Stack Exchange - Sistem interaktif Busybox:Apakah implementasi Linux sekecil mungkin? | Unix &Linux Stack Exchange
Kemudian pada kernel Linux:
git checkout v4.9
make mrproper
make x86_64_defconfig
cat <<EOF >.config-fragment
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_KERNEL=y
CONFIG_GDB_SCRIPTS=y
EOF
./scripts/kconfig/merge_config.sh .config .config-fragment
make -j"$(nproc)"
qemu-system-x86_64 -kernel arch/x86/boot/bzImage \
-initrd rootfs.cpio.gz -S -s
Di terminal lain, misalkan Anda ingin memulai debug dari start_kernel
:
gdb \
-ex "add-auto-load-safe-path $(pwd)" \
-ex "file vmlinux" \
-ex 'set arch i386:x86-64:intel' \
-ex 'target remote localhost:1234' \
-ex 'break start_kernel' \
-ex 'continue' \
-ex 'disconnect' \
-ex 'set arch i386:x86-64' \
-ex 'target remote localhost:1234'
dan kita selesai!!
Untuk modul kernel, lihat:Bagaimana cara men-debug modul kernel Linux dengan QEMU? | Stack Overflow
Untuk Ubuntu 14.04, GDB 7.7.1, hbreak
dibutuhkan, break
breakpoint perangkat lunak diabaikan. Tidak demikian lagi di 16.10. Lihat juga:https://bugs.launchpad.net/ubuntu/+source/qemu-kvm/+bug/901944
disconnect
yang berantakan dan apa yang terjadi setelahnya untuk mengatasi kesalahan:
Remote 'g' packet reply is too long: 000000000000000017d11000008ef4810120008000000000fdfb8b07000000000d352828000000004040010000000000903fe081ffffffff883fe081ffffffff00000000000e0000ffffffffffe0ffffffffffff07ffffffffffffffff9fffff17d11000008ef4810000000000800000fffffffff8ffffffffff0000ffffffff2ddbf481ffffffff4600000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801f0000
Utas terkait:
- https://sourceware.org/bugzilla/show_bug.cgi?id=13984 mungkin bug GDB
- gdb - Balasan paket 'g' jarak jauh terlalu panjang | Stack Overflow
- http://wiki.osdev.org/QEMU_and_GDB_in_long_mode osdev.org seperti biasa merupakan sumber yang luar biasa untuk masalah ini
- https://lists.nongnu.org/archive/html/qemu-discuss/2014-10/msg00069.html
Lihat juga:
- https://github.com/torvalds/linux/blob/v4.9/Documentation/dev-tools/gdb-kernel-debugging. "dokumentasi" kernel Linux resmi pertama
- Bagaimana cara men-debug kernel Linux dengan GDB dan QEMU? | Stack Overflow
Batasan yang diketahui:
- kernel Linux tidak mendukung (dan bahkan tidak dapat dikompilasi tanpa tambalan) dengan
-O0
:Bagaimana cara mengoptimalkan kernel Linux dan mengompilasinya dengan -O0? | Stack Overflow - GDB 7.11 akan menghabiskan memori Anda pada beberapa jenis penyelesaian tab, bahkan setelah
max-completions
fix:Interupsi penyelesaian tab untuk binari besar | Stack Overflow Kemungkinan beberapa kotak sudut yang tidak tercakup dalam tambalan itu. Jadi sebuahulimit -Sv 500000
adalah tindakan bijak sebelum debugging. Meledakkan secara khusus ketika tab saya menyelesaikanfile<tab>
untukfilename
argumen darisys_execve
seperti pada:Bisakah panggilan sistem sys_execve() di kernel Linux menerima jalur absolut atau relatif? | Stack Overflow