My Linux Kernel Development Workflow
'Install' the required dependencies
$ nix develop
or if youre not using flakes...
$ nix-shell linux.nix
Build the kernel
$ make x86_64_defconfig
$ make defconfig kvm_guest.config
$ scripts/config --set-val DEBUG_INFO y --set-val DEBUG y --set-val GDB_SCRIPTS y --set-val DEBUG_DRIVER y
$ make
Create root filesystem
$ qemu-img create qemu-image.img 1g
$ mkfs.ext2 qemu-image.img
$ mkdir mnt
# mount -o loop qemu-image.img mnt
# debootstrap --arch amd64 jessie mnt
# chroot mnt /bin/sh
## passdw (set password)
## exit
Run the VM with the built kernel
$ qemu-system-x86_64 -kernel arch/x86/boot/bzImage -drive file=qemu-image.img,index=0,media=disk,format=raw -append "root=/dev/sda nokaslr console=ttyS0 earlyprintk=serial" -enable-kvm -nographic
Debugging
- Add
-s -S
to the qemu parameters gdb -ex "add-auto-load-safe-path $(pwd)" -ex "file vmlinux" -ex 'target remote 127.0.0.1:1234' -ex 'hbreak start_kernel'
- Debug!