`
mmdev
  • 浏览: 12890094 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

linux内核调试环境搭建-

 
阅读更多

kvm系统的前端是qemu-kvm,工作在用户空间,给用户提供一套方便的kvm虚拟化工具集合。下面来介绍一下qemu-kvm-0.11.0的编译过程。

1、下载

wget http://sourceforge.net/projects/kvm/files/qemu-kvm/0.11.0/qemu-kvm-0.11.0.tar.gz/download

mv download qemu-kvm-0.11.0.tar.gz

tar -xzvf qemu-kvm-0.11.0.tar.gz

2、安装其他库

sudo apt-get installlibpci-dev

sudo apt-get iinstalllibsdl1.2-dev

下载zlib-1.2.3.tar.gz

解压tar zxvf zlib-1.2.3.tar.gz

进入目录配置安装:

./configure

make

sudo make install

安装。

3、编译安装qemu

cd qemu-kvm-0.11.0

./configure

make

sudo make install

4、将qemu添加到环境变量

进入目录/usr/local/bin

为qemu-system-x86_64创建符号链接:

$ sudo ln -s qemu-system-x86_64qem

打开/etc/profile文件在末尾添加

PATH="$PATH:/usr/local/bin"

exportPATH

使环境变量生效,在终端输入:

source /etc/profile

另外打开一个终端输入qemu可见可以正常启动。

但是发现这时提示找不到kvm。

Ubuntu10.10系统有自带的kvm内核模块。

打开文件/etc/modules

在其中加入想要加载的模块名

kvm

kvm-amd

注意不要加扩展名.ko



下载linux内核:

$cd ~/work/

$wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.35.9.tar.bz2

解压

$tar -jxvf linux-2.6.35.9.tar.bz2

拷贝现有系统的内核配置选项

$ cp /boot/config-2.6.35-22-generic .config

确保如下选项被选中:

在这里建议关闭一个选项:DEBUG_RODATACONFIG_DEBUG_RODATA = n该选项是将内核的一些内存区域空间设置为只读,这样可能导致kgdb的设置软断点功能失效。所以推荐将该选项关闭。

Location:

-> Kernel hacking ->Write protect kernel read-only data structures

KGDB_SERIAL_CONSOLE打开该选项:使用串口进行通信

位置:> Kernel hacking

-> KGDB: kernel debugger

-> KGDB: use kgdb over the serial console

KGDB_LOW_LEVEL_TRAP使能该选项可以kgdb不依赖notifier_call_chain()机制来获取断点异常,这样就可以对notifier_call_chain()机制实现相关的函数进行单步调试。

依赖: KGDB [=y] && (X86 [=y] || MIPS [=MIPS])

位置:-> Kernel hacking

-> KGDB: kernel debugger (KGDB [=y])

->KGDB: Allow debugging with traps in notifiers

DEBUG_INFO该选项可以使得编译的内核包含一些调试信息,使得调试更容易。

位置:

-> Kernel hacking

->compile the kernel with debuginfo

FRAME_POINTER使能该选项将使得内核使用帧指针寄存器来维护堆栈,从而就可以正确地执行堆栈回溯,即函数调用栈信息。

位置:

-> Kernel hacking

->Compile the kernel with frame pointers

MAGIC_SYSRQ(如果你选择了KGDB_SERIAL_CONSOLE,这个选项将自动被选上)激活"魔术SysRq"键.该选项对kgdboc调试非常有用,kgdb向其注册了‘g’魔术键来激活kgdb。

位置:

-> Kernel hacking

->magic SysRq key

当你想手动激活kgdb时,你可以触发SysRq的g键,如:

$ echo "g" > /proc/sysrq-trigger

修改编译优化等级:

打开根目录下Makefile文件修改内核Makefile优化选项将KBUILD_CFLAGS += -O2,修改为:KBUILD_CFLAGS += -O。

编译内核:

make && make modules

编译完成后,复制bzImage和vmlinux到工作目录下备用

cp arch/x86/boot/bzImage.

cp vmlinux.

编译busybox:

cd~/work/busy/

下载busybox-1.20.1.tar.bz2,

解压缩:

tar -jxvfbusybox-1.20.1.tar.bz2

进入busybox目录:

$ cd busybox-1.20.1/

编译busybox

make menuconfig

Busybox Settings--->

Build Options --->

[ * ] Build BusyBox as a static binary (no shared libs)

Installation Options --->

[ * ] Don't use /usr

Miscellaneous Utilities--->

[ ] flashcp

[ ] flash_lock

[ ] flash_unlock

[ ] flash_eraseall

注:[ ]表示不选择

保存配置文件后开始编译和安装

make

make install

此时在当前目录下生成了一个_install目录,里面就是busybox的执行文件

制作文件系统

使用如下命令来创建一个虚拟文件系统磁盘文件,

在当前目录下创建一个名为busybox.img,大小为300M的文件,并将其格式化为ext3的文件系统

dd if=/dev/zero of=./busybox.img bs=1Mcount=300

mkfs.ext3 busybox.img

将这个虚拟磁盘文件到本地系统中,这样我们可以像访问本地文件一样访问它,并将生成好的busybox的文件拷贝到这个文件里。

sudo mkdir /mnt/disk

sudo mount -o loop busybox.img /mnt/disk

sudo cp -rf /dir/to/busybox-1.17.0/_install/* /mnt/disk

创建必须的文件系统目录

cd /mnt/disk/

sudo mkdir dev sys proc etc lib mnt

使用busybox默认的设置文件

sudo cp -a/dir/to/busybox-1.17.0/examples/bootfloppy/etc/* /mnt/disk/etc

sudo vi /mnt/disk/etc/init.d/rcS

将下面内容拷贝到rcS里:

  1. #!/bin/sh
  2. MAC=08:90:90:59:62:21
  3. IP=192.168.100.2
  4. Mask=255.255.255.0
  5. Gateway=192.168.100.1
  6. /sbin/ifconfiglo127.0.0.1
  7. ifconfigeth0down
  8. ifconfigeth0hwether$MAC
  9. ifconfigeth0$IPnetmask$Maskup
  10. routeadddefaultgw$Gateway
  11. /bin/mount-a
  12. /bin/mount-tsysfssysfs/sys
  13. /bin/mount-ttmpfstmpfs/dev
  14. /sbin/mdev-s
  15. mount-oremount,rw,noatime-n/dev/root/


做完上面对工作后,我们就可以卸载虚拟磁盘文件了。

sudo umount /mnt/disk

使用qemu运行自己编译的内核

qemu -m 512 -kernel bzImage -append “root=/dev/sda” -boot c -hda busybox.img -k en-us

运行如下图所示:

qemu与主机之间可以ping通:

在主机放入一脚本nettap.sh

$cd ~

$touchnettap.sh

$gedit nettap.sh

脚本中放入如下内容:

  1. tunctl-ugudujian-ttap0
  2. ifconfigtap0192.168.100.1up
  1. echo1>/proc/sys/net/ipv4/ip_forward
  2. iptables-tnat-APOSTROUTING-oeth0-jMASQUERADE
  3. iptables-IFORWARD1-itap0-jACCEPT
  4. iptables-IFORWARD1-otap0-mstate--stateRELATED,ESTABLISHED-jACCEPT

开机后用root权限执行这个脚本。

用如下脚本启动虚拟机:

qemu -m 512 -kernel bzImage -append "root=/dev/sda" -boot c -hda busybox.img-initrd initrd.img-2.6.35.9-k en-us -net nic -net tap,ifname=tap0,script=no

在虚拟机中ping主机可见可以ping的通:

qemu与主机共享文件(通过tftp方式):

首先在ubuntu10.10中搭建tftp服务:

http://blog.csdn.net/gudujianjsk/article/details/7655701

只是在busybox中使用tftp客户端命令有些不一样。见后面介绍。

使用gdb + kgdb调试内核

使能kgdb可以在内核启动时增加使能参数,这里我们采取在内核启动时增加启动参数(kgdboc=ttyS0,115200 kgdbwait)的方式:

qemu -m 512-kernelbzImage -append "root=/dev/sda kgdboc=ttyS0,115200

kgdbwait" -boot c –hda busybox.img -k en-us -serial tcp::4321,server

这时,运行qemu的终端将提示等待远程连接到本地端口4321

QEMU waiting for connection on: tcp:0.0.0.0:4321,server

这时使用另外一个控制台执行:

gdb vmlinux

(gdb) target remote localhost:4321

然后qemu就可以继续正常运行下去,最后停止内核,并显示如下信息:

kgdb: Waiting for connection from remote gdb…

这时gdb这边就可以看到如下的提示:

(gdb) target remote localhost:4321

Remote debugging using localhost:4321

kgdb_breakpoint () at kernel/debug/debug_core.c:983

983 wmb(); /* Sync point after breakpoint */

(gdb)

开始你的内核之旅吧~~~

如果gdb提示如下信息:

warning: Invalid remote reply:

可以使用Ctrl+C来终止当前gdb的操作,再次使用下面命令重新连接一次kgdb即可:

(gdb) target remote localhost:4321

$cd ~/work/

$wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.35.9.tar.bz2

解压

$tar -jxvf linux-2.6.35.9.tar.bz2

拷贝现有系统的内核配置选项

$ cp /boot/config-2.6.35-22-generic .config

确保如下选项被选中:

在这里建议关闭一个选项:DEBUG_RODATACONFIG_DEBUG_RODATA = n该选项是将内核的一些内存区域空间设置为只读,这样可能导致kgdb的设置软断点功能失效。所以推荐将该选项关闭。

Location:

-> Kernel hacking ->Write protect kernel read-only data structures

KGDB_SERIAL_CONSOLE打开该选项:使用串口进行通信

位置:> Kernel hacking

-> KGDB: kernel debugger

-> KGDB: use kgdb over the serial console

KGDB_LOW_LEVEL_TRAP使能该选项可以kgdb不依赖notifier_call_chain()机制来获取断点异常,这样就可以对notifier_call_chain()机制实现相关的函数进行单步调试。

依赖: KGDB [=y] && (X86 [=y] || MIPS [=MIPS])

位置:-> Kernel hacking

-> KGDB: kernel debugger (KGDB [=y])

->KGDB: Allow debugging with traps in notifiers

DEBUG_INFO该选项可以使得编译的内核包含一些调试信息,使得调试更容易。

位置:

-> Kernel hacking

->compile the kernel with debuginfo

FRAME_POINTER使能该选项将使得内核使用帧指针寄存器来维护堆栈,从而就可以正确地执行堆栈回溯,即函数调用栈信息。

位置:

-> Kernel hacking

->Compile the kernel with frame pointers

MAGIC_SYSRQ(如果你选择了KGDB_SERIAL_CONSOLE,这个选项将自动被选上)激活"魔术SysRq"键.该选项对kgdboc调试非常有用,kgdb向其注册了‘g’魔术键来激活kgdb。

位置:

-> Kernel hacking

->magic SysRq key

当你想手动激活kgdb时,你可以触发SysRq的g键,如:

$ echo "g" > /proc/sysrq-trigger

修改编译优化等级:

打开根目录下Makefile文件修改内核Makefile优化选项将KBUILD_CFLAGS += -O2,修改为:KBUILD_CFLAGS += -O。

编译内核:

make && make modules

编译完成后,复制bzImage和vmlinux到工作目录下备用

cp arch/x86/boot/bzImage.

cp vmlinux.

编译busybox:

cd~/work/busy/

下载busybox-1.20.1.tar.bz2,

解压缩:

tar -jxvfbusybox-1.20.1.tar.bz2

进入busybox目录:

$ cd busybox-1.20.1/

编译busybox

make menuconfig

Busybox Settings--->

Build Options --->

[ * ] Build BusyBox as a static binary (no shared libs)

Installation Options --->

[ * ] Don't use /usr

Miscellaneous Utilities--->

[ ] flashcp

[ ] flash_lock

[ ] flash_unlock

[ ] flash_eraseall

注:[ ]表示不选择

保存配置文件后开始编译和安装

make

make install

此时在当前目录下生成了一个_install目录,里面就是busybox的执行文件

制作文件系统

使用如下命令来创建一个虚拟文件系统磁盘文件,

在当前目录下创建一个名为busybox.img,大小为300M的文件,并将其格式化为ext3的文件系统

dd if=/dev/zero of=./busybox.img bs=1Mcount=300

mkfs.ext3 busybox.img

将这个虚拟磁盘文件到本地系统中,这样我们可以像访问本地文件一样访问它,并将生成好的busybox的文件拷贝到这个文件里。

sudo mkdir /mnt/disk

sudo mount -o loop busybox.img /mnt/disk

sudo cp -rf /dir/to/busybox-1.17.0/_install/* /mnt/disk

创建必须的文件系统目录

cd /mnt/disk/

sudo mkdir dev sys proc etc lib mnt

使用busybox默认的设置文件

sudo cp -a/dir/to/busybox-1.17.0/examples/bootfloppy/etc/* /mnt/disk/etc

sudo vi /mnt/disk/etc/init.d/rcS

将下面内容拷贝到rcS里:

  1. #!/bin/sh
  2. MAC=08:90:90:59:62:21
  3. IP=192.168.100.2
  4. Mask=255.255.255.0
  5. Gateway=192.168.100.1
  6. /sbin/ifconfiglo127.0.0.1
  7. ifconfigeth0down
  8. ifconfigeth0hwether$MAC
  9. ifconfigeth0$IPnetmask$Maskup
  10. routeadddefaultgw$Gateway
  11. /bin/mount-a
  12. /bin/mount-tsysfssysfs/sys
  13. /bin/mount-ttmpfstmpfs/dev
  14. /sbin/mdev-s
  15. mount-oremount,rw,noatime-n/dev/root/


做完上面对工作后,我们就可以卸载虚拟磁盘文件了。

sudo umount /mnt/disk

使用qemu运行自己编译的内核

qemu -m 512 -kernel bzImage -append “root=/dev/sda” -boot c -hda busybox.img -k en-us

运行如下图所示:

qemu与主机之间可以ping通:

在主机放入一脚本nettap.sh

$cd ~

$touchnettap.sh

$gedit nettap.sh

脚本中放入如下内容:

  1. tunctl-ugudujian-ttap0
  2. ifconfigtap0192.168.100.1up
  1. echo1>/proc/sys/net/ipv4/ip_forward
  2. iptables-tnat-APOSTROUTING-oeth0-jMASQUERADE
  3. iptables-IFORWARD1-itap0-jACCEPT
  4. iptables-IFORWARD1-otap0-mstate--stateRELATED,ESTABLISHED-jACCEPT

开机后用root权限执行这个脚本。

用如下脚本启动虚拟机:

qemu -m 512 -kernel bzImage -append "root=/dev/sda" -boot c -hda busybox.img-initrd initrd.img-2.6.35.9-k en-us -net nic -net tap,ifname=tap0,script=no

在虚拟机中ping主机可见可以ping的通:

qemu与主机共享文件(通过tftp方式):

首先在ubuntu10.10中搭建tftp服务:

http://blog.csdn.net/gudujianjsk/article/details/7655701

只是在busybox中使用tftp客户端命令有些不一样。见后面介绍。

使用gdb + kgdb调试内核

使能kgdb可以在内核启动时增加使能参数,这里我们采取在内核启动时增加启动参数(kgdboc=ttyS0,115200 kgdbwait)的方式:

qemu -m 512-kernelbzImage -append "root=/dev/sda kgdboc=ttyS0,115200

kgdbwait" -boot c –hda busybox.img -k en-us -serial tcp::4321,server

这时,运行qemu的终端将提示等待远程连接到本地端口4321

QEMU waiting for connection on: tcp:0.0.0.0:4321,server

这时使用另外一个控制台执行:

gdb vmlinux

(gdb) target remote localhost:4321

然后qemu就可以继续正常运行下去,最后停止内核,并显示如下信息:

kgdb: Waiting for connection from remote gdb…

这时gdb这边就可以看到如下的提示:

(gdb) target remote localhost:4321

Remote debugging using localhost:4321

kgdb_breakpoint () at kernel/debug/debug_core.c:983

983 wmb(); /* Sync point after breakpoint */

(gdb)

开始你的内核之旅吧~~~

如果gdb提示如下信息:

warning: Invalid remote reply:

可以使用Ctrl+C来终止当前gdb的操作,再次使用下面命令重新连接一次kgdb即可:

(gdb) target remote localhost:4321

分享到:
评论

相关推荐

    在VMware中搭建Linux系统内核的调试环境

    在VMware中搭建Linux系统内核的调试环境

    qemu调试arm linux 内核环境搭建.doc

    arm, x86 两个平台的qemu 模拟器的安装,gdb 的安装,内核的编译的核调试 ,包括根文件系统的制作,实测的启动参数

    linux内核调试方法总结

    十 使用SkyEye构建Linux内核调试环境 1 SkyEye的安装和μcLinux内核编译 2 使用SkyEye调试 3 使用SkyEye调试内核的特点和不足 十一 KDB 1 入门 2 初始化并设置环境变量 3 激活 KDB 4 KDB 命令 5 技巧和诀窍 6 结束语...

    基于A33的GDB+KGDB内核调试环境搭建.pdf

    基于A33的GDB+KGDB内核调试环境搭建,此种是以串口方法进行搭建kgdb调试环境的,如果通过网络的话,需要使用到其他的模块

    Linux内核调试环境的搭建(使用qemu)

    这里说明下,本人调试的内核版本是2.6.11.12,为什么去调试这么“古老”的版本?原因不多说了,你手头也许正拿着ULK3,而它针对的内核版本正是2.6.11,有比这更好的理由吗?而且这个版本不算旧,已不算新,我认为还...

    一个可以用gdb调试linux内核的环境

    自己搭建的一个可以用gdb调试linux内核的环境,解压后看README,其中有详细的搭建过程。 简单来说就是在一台linux主机上用bochs虚拟机调试内核。 用到的工具: 一台linux主机 bochs源码,压缩包中已有 busybox源码,...

    嵌入式Linux视频教程全套2011新版-国嵌嵌入式培训下载地址

    -国嵌体验入门班-1-5(软硬件环境搭建).avi -第2天(开发板快乐体验) -国嵌体验入门班-2-1(开发板系统安装).avi -国嵌体验入门班-2-1(开发板系统安装-Jlink方式).avi -国嵌体验入门班-2-1(开发板系统安装-...

    mini2440国嵌视频教程+课件+工具+软件+镜像+教程源码下载地址

    -国嵌体验入门班-1-5(软硬件环境搭建).avi -第2天(开发板快乐体验) -国嵌体验入门班-2-1(开发板系统安装).avi -国嵌体验入门班-2-1(开发板系统安装-Jlink方式).avi -国嵌体验入门班-2-1(开发板系统安装-...

    使用kgdb调试linux内核及内核模块

    使用kgdb调试linux内核及内核模块

    Davinci调试环境的搭建

    Davinci调试环境的搭建,详细介绍了davinci调试环境搭建过程,包括uboot,ramdisk,交叉编译环境,linux内核编译等

    Debugging kernel and modules via GDB.pdf

    在 Linux 内核开发过程中不...但是很多情况下,我们对问题产生的原因毫无头绪,也就不可能在茫茫的代码中添加printk,这时候我们就依赖于GDB构建Linux内核调试环境。本文以 Linux 4.1.15为例,介绍调试环境的搭建过程。

    基于linux-ARM的QT环境搭建.docx

    Linux内核镜像的烧写;交叉编译;搭建QT开发环境;开发板与PC机Linux系统的NFS挂载连接;再就是QT程序在线测试等。 上述中交叉编译之前的所有操作本文不涉及,读者如有不明之处请另找资料,本文意在构建一个QT开发...

    嵌入式系统的调试

    1. 远程调试环境的搭建原理 2. 使用GDB 3. Linux内核调试 4. 实验 实验一:利用GDB进行本地调试 实验二:利用GDB进行远程调试 实验三:arm-linux内核调试

    linux0.11内核源码分析

    linux0.11内核源码分析,其中包括两部分,一部分是源码,另一部分是源码的详述,文档中也有环境搭建的介绍,便于运行和调试;适用于想了解linux内核的初学者,和了解linux的运行机理,阅读代码,会更直接!

    linux网络编程-宋敬彬-part3

    1.5.1 Linux内核的主要模块 7 1.5.2 Linux的文件结构 9 1.6 GNU通用公共许可证 10 1.6.1 GPL许可证的历史 10 1.6.2 GPL的自由理念 10 1.6.3 GPL的基本条款 11 1.6.4 关于GPL许可证的争议 12 1.7 Linux...

    linux网络编程-宋敬彬-part2

    1.5.1 Linux内核的主要模块 7 1.5.2 Linux的文件结构 9 1.6 GNU通用公共许可证 10 1.6.1 GPL许可证的历史 10 1.6.2 GPL的自由理念 10 1.6.3 GPL的基本条款 11 1.6.4 关于GPL许可证的争议 12 1.7 Linux...

    嵌入式Linux应用程序开发详解(完整版)

    接着系统地讲解了嵌入式Linux的环境搭建,以及嵌入式Linux的I/O与文件系统的开发、进程控制开发、进程间通信开发、网络应用开发、基于中断的开发、设备驱动程序的开发以及嵌入式图形界面的开发等,并且还安排了丰富...

    Sate4412开发板用户手册(linux android 编译开发环境搭建)V1.4.1.pdf

    Linux内核 Linux3.0.15 系统引导程序 U-boot 2010.12 串口调试工具 DNW/ SecureCRT 交叉编译工具 Arm-2009q3(gcc 4.4.1) 文件系统格式 RAMDISK, Ext4 GUI Google Android 4.0.4 ICS 软件功能支持 支持3D图形显像...

    新版Android开发教程.rar

    � Android 更像一款桌面环境为 Java 的 Linux 操作系统。有助于 Google 实现其 " 随时随地为每个人提供信 息 " 的企业战略。 HTC HTC HTC HTC Dream/G1 Dream/G1 Dream/G1 Dream/G1 具体配置 硬件 3.17 英寸 HVGA ...

Global site tag (gtag.js) - Google Analytics