ubuntu14使用qemu调试linux内核

    # 下载内核源代码编译内核
    cd ~/LinuxKernel/
    wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz
    xz -d linux-3.18.6.tar.xz
    tar -xvf linux-3.18.6.tar
    cd linux-3.18.6
    make i386_defconfig
    make # 一般要编译很长时间,少则20分钟多则数小时
     
    # 制作根文件系统
    cd ~/LinuxKernel/
    mkdir rootfs
    git clone https://github.com/mengning/menu.git   # 如果被墙,可以使用附件menu.zip 
    cd menu
    gcc -o init linktable.c menu.c test.c -m32 -static –lpthread
    cd ../rootfs
    cp ../menu/init ./
    find . | cpio -o -Hnewc |gzip -9 > ../rootfs.img
     
    # 启动MenuOS系统
    cd ~/LinuxKernel/
    qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

在执行 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img 时报错,没有qemu这个命令。

正确做法:qemu-system-i386 -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

原因分析:

我以为没有安装qemu,于是开始安装,按照http://jingyan.baidu.com/album/b907e627cfffc946e7891cd5.html的网址

sudo apt-get install qemu-kvm libvirt-bin virt-manager bridge-utils

lsmod | grep kvm

virsh -c qemu:///system list

但是后来发现这个网址:http://blog.csdn.net/xsckernel/article/details/8159548#comments

得知kvm是系统自带的,于是卸载了原来安装的

sudo apt-get remove qemu-kvm

sudo apt-get remove libvirt-bin

sudo apt-get remove virt-manager

sudo apt-get remove bridge-utils

但是不知道为什么 还存在kvm例如:lsmod | grep kvm

通过网址:http://zhangjun2915.blog.163.com/blog/static/3808623620103585320514/

得知 /usr/bin/qemu-system-x86_64就是qemu-kvm

于是我就在/esr/bin/目录下看到:

 

从而确定了qemu-system-x86_64是模拟64位系统,qemu-system-i386是模拟32位系统。

于是最后一行命令改为:

qemu-system-i386 -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

可以运行效果是:

 

  • 重新配置编译Linux使之携带调试信息

 在原来配置的基础上,在shell终端输入:make menuconfig

会报错,错误信息如下:

In file included from scripts/kconfig/lxdialog/checklist.c:24:

scripts/kconfig/lxdialog/dialog.h:31:20: error: curses.h: 没有那个文件或目录

In file included from scripts/kconfig/lxdialog/checklist.c:24:

参考网址:http://blog.chinaunix.net/uid-25896350-id-367612.html

解决办法:sudo apt-get install libncurses5-dev

然后重新输入:make menuconfig,效果如下:按空格选择kernel hacking—>

按空格选择 Compile -time checks and Complier options  -->

按空格选择 [*] compile the kernel with debug info,然后保存退出。

make重新编译(时间较长)

 使用gdb跟踪调试内核

   cd LinuxKernel
qemu-system-i386 -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S # 关于-s和-S选项的说明: # -S freeze CPU at startup (use ’c’ to start execution) # -s shorthand for -gdb tcp::1234 若不想使用1234端口,则可以使用-gdb tcp:xxxx来取代-s选项

另开一个shell窗口

    gdb
    (gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表
    (gdb)target remote:1234 # 建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
    (gdb)break start_kernel # 断点的设置可以在target remote之前,也可以在之后

实验效果:

posted @ 2015-04-04 15:48  pingandezhufu  阅读(2606)  评论(0编辑  收藏  举报