跳转到目录 点这里
复制 manjaro 的 initramfs
cp -a /boot/amd-ucode.img /kernel-debug/qemu.img/old cp -a /boot/initramfs-5.8-x86_64.img /kernel-debug/qemu.img/old cp -a /boot/initramfs-5.8-x86_64-fallback.img /kernel-debug/qemu.img/old
替换成自己编译的内核启动 OK
#因为自己的内核里面己经编译了 ide 的块设备驱动,所以直接用原来的 initramfs (里面的驱动用不了,没关系) #为了识别为 ide 硬盘要指定 -drive 参数 if=ide #uuid 是 gdb.qcow2 分区之后建立文件系统时生成的 qemu -kernel /kernel-debug/linux-5.9.8/arch/x86_64/boot/bzImage -append "root=UUID=6cc81cd1-d453-43a7-8b72-78b0b5650427 rw quiet apparmor=1 security=apparmor udev.log_priority=3" -initrd /kernel-debug/qemu.img/old/initramfs-5.8-x86_64.img -net nic,macaddr=52:54:00:12:34:22,model=e1000 -net tap,ifname=tap0,script=/etc/qemu-ifup-nat,downscript=/etc/qemu-ifdown-nat -net nic,macaddr=52:54:00:12:34:23,model=pcnet -m 5120 -boot c -drive file=/gdb/gdb.qcow2,if=ide,media=disk,snapshot="off",format=qcow2
下一步,在Qemu 打开的系统中写个用户程序来调试。
Makefile
basePath=. cc=gcc testOBJ = test.o #************************************ all target ************************************************************************* all: cl init test exec cl2 #************************************ serlver target ***************************************************************** test:$(testOBJ) $(cc) $(testOBJ) -o $@ $(testOBJ): %.o: %.c $(cc) -g -c $< -o $@ #************************************ other Target ************************************************************************* init: echo hello exec: echo 'exec test' ./test cl: rm -rf ./*.o rm -rf ./test cl2: rm -rf ./*.o
示例代码: test.c
#include <stdio.h> #define LENGTH 100 int main(int argc, char* argv[]) { FILE *fd; char str[LENGTH]; fd = fopen("hello.txt", "w+"); /* 创建并打开文件 */ if (fd) { fputs("Hello, Software Weekly", fd); /* 写入Hello, software weekly字符串 */ fclose(fd); } fd = fopen("hello.txt", "r"); fgets(str, LENGTH, fd); /* 读取文件内容 */ printf("%s ", str); fclose(fd); return 0; }
关闭qemu ,加上调试参数重新启动 OK
qemu -gdb tcp::8888 -S -kernel /kernel-debug/linux-5.9.8/arch/x86_64/boot/bzImage -append "root=UUID=6cc81cd1-d453-43a7-8b72-78b0b5650427 rw quiet apparmor=1 security=apparmor udev.log_priority=3" -initrd /kernel-debug/qemu.img/old/initramfs-5.8-x86_64.img -net nic,macaddr=52:54:00:12:34:22,model=e1000 -net tap,ifname=tap0,script=/etc/qemu-ifup-nat,downscript=/etc/qemu-ifdown-nat -net nic,macaddr=52:54:00:12:34:23,model=pcnet -m 5120 -boot c -drive file=/gdb/gdb.qcow2,if=ide,media=disk,snapshot="off",format=qcow2
.gdbinit 中加入 do_sys_open 断点来调试打开文件这个系统调用
b start_kernel
b do_sys_open
启动 eclipse 进行调试,eclipse配置前面说过 点这里跳转
先放行断点,再切到 qemu里面的系统进行用户空间程序调试
再用gdb调试,一直next 直到打开文件那行
然后再选中 VMware Manjaro中 eclipse 中的do_sys_open断点,再回到 qemu 里面,进行 next
自己也可以把原来的包解出来,把自己的驱动打进去。
写个脚本: re_Packge.sh
#-------------解压---------------- mkdir -p /kernel-debug/qemu.img/new/amd-ucode cd /kernel-debug/qemu.img/new/amd-ucode cpio -ivmd < /kernel-debug/qemu.img/old/amd-ucode.img #-------------解压---------------- mkdir -p /kernel-debug/qemu.img/new/cpio cp -a /kernel-debug/qemu.img/old/initramfs-5.8-x86_64.img /kernel-debug/qemu.img/new/cpio/initramfs-5.8-x86_64.gz mkdir -p /kernel-debug/qemu.img/new/initramfs-5.8-x86_64 gunzip /kernel-debug/qemu.img/new/cpio/initramfs-5.8-x86_64.gz cd /kernel-debug/qemu.img/new/initramfs-5.8-x86_64 cpio -ivmd < /kernel-debug/qemu.img/new/cpio/initramfs-5.8-x86_64 #-------------解压---------------- mkdir -p /kernel-debug/qemu.img/new/cpio cp -a /kernel-debug/qemu.img/old/initramfs-5.8-x86_64-fallback.img /kernel-debug/qemu.img/new/cpio/initramfs-5.8-x86_64-fallback.gz mkdir -p /kernel-debug/qemu.img/new/initramfs-5.8-x86_64-fallback gunzip /kernel-debug/qemu.img/new/cpio/initramfs-5.8-x86_64-fallback.gz cd /kernel-debug/qemu.img/new/initramfs-5.8-x86_64-fallback cpio -ivmd < /kernel-debug/qemu.img/new/cpio/initramfs-5.8-x86_64-fallback #-------------压缩---------------- mkdir -p /kernel-debug/qemu.img/new/out find /kernel-debug/qemu.img/new/amd-ucode -print | cpio -cov > /kernel-debug/qemu.img/new/amd-ucode.img mv /kernel-debug/qemu.img/new/amd-ucode.img /kernel-debug/qemu.img/new/out/amd-ucode.img #-------------压缩---------------- mkdir -p /kernel-debug/qemu.img/new/out find /kernel-debug/qemu.img/new/initramfs-5.8-x86_64-fallback -print | cpio -cov > /kernel-debug/qemu.img/new/initramfs-5.8-x86_64-fallback.img gzip /kernel-debug/qemu.img/new/initramfs-5.8-x86_64-fallback.img mv /kernel-debug/qemu.img/new/initramfs-5.8-x86_64-fallback.img.gz /kernel-debug/qemu.img/new/out/initramfs-5.8-x86_64-fallback.img #-------------压缩---------------- find /kernel-debug/qemu.img/new/initramfs-5.8-x86_64 -print | cpio -cov > /kernel-debug/qemu.img/new/initramfs-5.8-x86_64.img gzip /kernel-debug/qemu.img/new/initramfs-5.8-x86_64.img mv /kernel-debug/qemu.img/new/initramfs-5.8-x86_64.img.gz /kernel-debug/qemu.img/new/out/initramfs-5.8-x86_64.img #----------------------------- cd /kernel-debug/qemu.img/new/out
换成新打的包试一下: (暂时没有成功,可能是前面打包命令有问题)
qemu -kernel /kernel-debug/linux-5.9.8/arch/x86_64/boot/bzImage -append "root=UUID=6cc81cd1-d453-43a7-8b72-78b0b5650427 rw quiet apparmor=1 security=apparmor udev.log_priority=3" -initrd /kernel-debug/qemu.img/new/out/initramfs-5.8-x86_64.img -net nic,macaddr=52:54:00:12:34:22,model=e1000 -net tap,ifname=tap0,script=/etc/qemu-ifup-nat,downscript=/etc/qemu-ifdown-nat -net nic,macaddr=52:54:00:12:34:23,model=pcnet -m 5120 -boot c -drive file=/gdb/gdb.qcow2,if=ide,media=disk,snapshot="off",format=qcow2
——