1. 编译 linux
下载内核
sudo mkdir -p /usr/src/work
sudo chmod 777 /usr/src/work -R
cd /usr/src/work
配置内核选项
$ sudo make defconfig
//你可以选择你需要的版本,生成.config
$ sudo make menuconfig
//配置内核
确保如下的选项是打开的:
CONFIG_EXPERIMENTAL = y
CONFIG_KGDB = y
CONFIG_KGDB_SERIAL_COnSOLE= y (使用串口进行通信)
建议关闭的选项:
CONFIG_DEBUG_RODATA = n
该选项是将内核的一些内存区域空间设置为只读,这样可能导致kgdb的
设置软断点功能失效。所以推荐将该选项关闭。
建议打开的选项:
CONFIG_KGDB_LOW_LEVEL_TRAP =
y
使能该选项可以kgdb不依赖notifier_call_chain()机制来获取断点异常,
这样就可以对notifier_call_chain()机制实现相关的函数进行单步调试。
CONFIG_DEBUG_INFO = y
该选项可以使得编译的内核包含一些调试信息,使得调试更容易。
CONFIG_FRAME_POINTER = y
该选项将使得内核使用帧指针寄存器来维护堆栈,从而就可以正确地执行堆栈回溯,即函数调用栈信息。
arm体系的配置中没有找到这个选项.
CONFIG_MAGIC_SYSRQ = y
(如果你选择了KGDB_SERIAL_CONSOLE,这个选项将自动被选上)
激活"魔术 SysRq"键.
该选项对kgdboc调试非常有用,kgdb向其注册了‘g’魔术键来激活kgdb 。
当你想手动激活kgdb时,你可以触发SysRq的g键,
如:
$ echo "g"
> /proc/sysrq-trigger
注意:打开make menuconfig后,按
'/'并将选项(如:CONFIG_KGDB)复制到搜索框,然后回车就可找到
关于该选项的有关信息。
GCOV-based kernel profiling
在general 下
保存配置退出.
编译内核
# sudo make
( 如果你是双核可以 加上 -j2 速度更快 )
error: ld: final link failed: No space left on
device
内核在编译时编出来的临时文件,占用的是源码所在的分区而不是/tmp/分区
将源码复制到其他分区,编译
编译完成后,复制bzImage和vmlinux到工作目录下备用
$ sudo cp arch/x86/boot/bzImage
/usr/src/work
$ sudo cp vmlinux /usr/src/work
2. 制作自己的文件系统
下载busybox
去busybox站点(http://www.busybox.net/downloads/)下载一个busybox源码包,并解压。
# wget
http://www.busybox.net/downloads/XXX
# tar -jxvf
busybox-1.17.2.tar.bz2
编译busybos
# sudo cd busybox-1.17.2
# sudo 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
注:[ ] 表示不选择
保存配置文件后开始编译和安装
# sudo make
我的编译错误:cannot find -lcrypt
解决:yum
install glibc-static //fedora
make
后显示
LINK busybox_unstripped
Trying
libraries: crypt m
Library crypt is not needed, excluding it
Library m is needed, can't exclude it
(yet)//可以不必理会,我不知到为什么
# sudo make install
制作文件系统
使用如下命令来创建一个虚拟文件系统磁盘文件,在当前目录下创建一个名为busybox.img,大小为100M的文件,并
将其格式化为ext3的文件系统
# cd /usr/src/work
# sudo dd if=/dev/zero
of=./busybox.img bs=1M count=100
解释: dd:
Copy a file, converting and formatting according to the
operands.
if=FILE read from FILE instead of
stdin
of=FILE write to FILE instead of
stdout
bs=BYTES read and write BYTES bytes at a
time
# sudo mkfs.ext3
busybox.img
解释:mkfs -
build a Linux file system
将这个虚拟磁盘文件到本地系统中,这样我们可以像访问本地文件一样访问它,
并将生成好的busybox的文件拷贝到这个文件里。
# sudo mkdir /mnt/disk
# sudo mount -o loop
/usr/src/work/busybox.img /mnt/disk
解释: Loopback设备 是linux中的一个可以用来像其他媒体设备一样的虚拟设备。
媒体设备的例子像硬盘分区,例如/dev/had1,/dev/had2,dev/sda1,或者像/dev/fd0软
盘分区一样的整个磁盘。这些设备全部都可以用来储存文件以及目录。它们可以被格式
化成需要的文件格式(ext2fs, msdos,
ntfs等)然后被mount。
Loopback文件系统就是把一个文件和另外的一个文件系统联系起来,就像一个完整像系
统一样。它可以被格式化和mount成以上所提到过块设备.(原文:http://www.dzshebei.com
/bbs/33424.html)
# sudo cp -rf
/usr/src/work/busybox-1.17.2/_install/* /mnt/disk
创建必须的文件系统目录
# cd /mnt/disk/
# sudo mkdir dev sys proc etc
lib mnt
使用busybox默认的设置文件
# sudo cp
-a /usr/src/work/busybox-1.17.2/examples/bootfloppy/etc/*
/mnt/disk/etc
# sudo vim
/mnt/disk/etc/init.d/rcS
将下面内容拷贝到rcS里:
#! /bin/sh
/bin/mount -a
/bin/mount -t sysfs sysfs /sys
/bin/mount -t tmpfs tmpfs /dev
#动态添加虚拟机环境中的设备
/sbin/mdev -s
解释:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
做完上面对工作后,我们就可以卸载虚拟磁盘文件了
# cd
/usr/src/work
# sudo
umount /mnt/disk
3. 安装qemu
有关
qemu的介绍:http://www.askarali.org/qemu_howto.html
http://wiki.qemu.org/Main_Page
Ubuntu/Debian:
$ sudo apt-get install
qemu
Fedora:
# yum install qemu/
4. 使用qemu运行自己编译的内核
$ sudo qemu -kernel /usr/src/work/bzImage
-append "root=/dev/sda" -boot c -hda /usr/src/work/busybox.img -k
en-us
解释:-boot a”的意思是从软盘启s动。你还可以用“-boot
c”来表示从硬盘启动
note:
根据你硬盘的种类选择使用 "root=/dev/hda"
或者 "root=/dev/sda".
这样就能正常启动.
如果顺利的话,自己编译的内核+文件系统就会在那qemu黑乎乎的窗口里展现出来,
我的提示:
This kernel requires an x86-64 CPU, but only
detected an i686 CPU. Unable to boot -please
use a kernel appropritate for your
CPU.
[参考:https://bugzilla.redhat.com/show_bug.cgi?id=494286
http://www.oschina.net/bbs/thread/7740
]
# qemu -cpu ?
x86
qemu32
x86
486
x86
pentium
x86 pentium2
x86 pentium3
error 1 :
Could not open '/dev/kqemu' - QEMU acceleration
layer not activated: No such file or directory
Warning : unable to open an initial console
解决:
$ sudo apt-get install kqemu-source
kqemu-common
5. 开始调试
$ sudo qemu -kernel /usr/src/work/bzImage
-append "root=/dev/hda kgdboc=ttyS0,115200 kgdbwait" -boot c -hda
/usr/src/work/busybox.img -k en-us -serial tcp::4321,server
打开另外一个终端
$ gdb /usr/src/work/vmlinux
如果正确则显示如下:
(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)