内核调试一般比应用层程序调试困难很多,主要因为内核是系统开机后执行的第一个程序,这使得用于一般应用程序的调试方法无法使用在内核上。自由软件社群开发了一些特殊方法解决这问题。 这些方法中最方便的方法莫过于 KGDB 的使用。KGDB 是个一特殊的内核辅助工具,除了在内核代码中加入了一些调试代码外也提供一个 gdbstub 用于和远程 gdb 调试程序联机用。以前,这样一个使用远程 gdb 调试内核的开发需要在一般linux内核上打 KGDB 补丁(patches)同时编译时使用特殊编译设置来完成。 可喜的是,至 linux-2.6.xx(xx多少记不清了)后的版本内核已经正式将 kgdb 加入为主流核心发布的一部份。换句话说,内核开发者几乎不需花任何额外的功夫就可使用 kgdb。 此外,kgdb 成为主流内核发行一部份也代表他的稳定性及实用性受到社群的肯定。
由于kgdb的方便易用,大大提高了linux平台下驱动开发者的效率。本文以及后面一系列文章从最基本的开始详细描述了如何搭建一个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 install libpci-dev
sudo apt-get install libsdl1.2-dev
3、编译安装qemu
cd qemu-kvm-0.11.0
./configure --prefix=./install --target-list="i386-softmmu x86_64-softmmu i386-linux-user x86_64-linux-user" --disable-debug-tcg --disable-xen --disable-kvm
这个配置 可以根据自己的需要来修改。
make
sudo make install
4、将qemu添加到环境变量
进入目录 /usr/local/bin
为 qemu-system-x86_64创建符号链接:
$ sudo ln -s qemu-system-x86_64 qem
打开/etc/profile文件在末尾添加
PATH="$PATH:/usr/local/bin"
export PATH
使环境变量生效,在终端输入:
source /etc/profile
另外打开一个终端输入qemu可见可以正常启动。
但是发现这时提示找不到kvm。
Ubuntu10.10系统有自带的kvm内核模块。
打开文件/etc/modules
在其中加入想要加载的模块名
kvm
kvm-amd
这样在再次重启的时候会自动加载模块 kvm kvm-amd
注意不要加扩展名 .ko
关于在在高版本ubuntu上编译遇到问题:
/home/xianjian/work/x86/qemu-kvm-1.2.0/qemu-timer.c:534: undefined reference to `timer_gettime'
/home/xianjian/work/x86/qemu-kvm-1.2.0/qemu-timer.c:547: undefined reference to `timer_settime'
qemu-timer.o: In function `dynticks_start_timer':
/home/xianjian/work/x86/qemu-kvm-1.2.0/qemu-timer.c:506: undefined reference to `timer_create'
qemu-timer.o: In function `dynticks_stop_timer':
/home/xianjian/work/x86/qemu-kvm-1.2.0/qemu-timer.c:520: undefined reference to `timer_delete
今天在 ubuntu14.04 上编译qemu-kvm-1.2.0 (从sourceforget上下载的 ,qemu-kvm-1.1.0版本也有同样的问题) 遇到了上述的错误(但是在ubuntu 12.04上不会出现),通过google搜索发现一篇文章可以比较好的解决这个问题:
smilejay.com/2012/06/qemu-kvm_compilation_installation/
根据一个patch文件修改 configure 文件:
qemu-kvm version: 1.2.0
compile host: ubuntu 14.04
——————————————–
+Signed-off-by: Natanael Copa
+Signed-off-by: Blue Swirl
+Signed-off-by: Ting Liu
+—
+ configure | 9 +++++++–
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+diff –git a/configure b/configure
+index 999375a..29b3e30 100755
+— a/configure
++++ b/configure
+@@ -2444,13 +2444,18 @@ fi
+ cat > $TMPC <<EOF
+ #include
+ #include
+-int main(void) { clockid_t id; return clock_gettime(id, NULL); }
++int main(void) {
++ timer_create(CLOCK_REALTIME, NULL, NULL);
++ return clock_gettime(CLOCK_REALTIME, NULL);
++}
+ EOF
+
+ if compile_prog “” “” ; then
+ :
+-elif compile_prog “” “-lrt” ; then
++# we need pthread for static linking. use previous pthread test result
++elif compile_prog “” “-lrt $pthread_lib” ; then
+ LIBS=”-lrt $LIBS”
++ libs_qga=”-lrt $libs_qga”
+ fi
+
+ if test “$darwin” != “yes” -a “$mingw32″ != “yes” -a “$solaris” != yes -a \
+–
+1.7.9.7
+
用vim 打开configure 文件找到以下地方:
##########################################
# Do we need librt
cat > $TMPC <<EOF
#include <signal.h>
#include <time.h>
int main(void) { return clock_gettime(CLOCK_REALTIME, NULL); }
EOF
if compile_prog "" "" ; then
:
elif compile_prog "" "-lrt" ; then
LIBS="-lrt $LIBS"
fi
然后按照上面的patch 打补丁修改为:
##########################################
# Do we need librt
cat > $TMPC <<EOF
#include <signal.h>
#include <time.h>
int main(void) { timer_create(CLOCK_REALTIME, NULL, NULL); return clock_gettime(CLOCK_REALTIME, NULL); }
EOF
if compile_prog "" "" ; then
:
elif compile_prog "" "-lrt $pthread_lib"; then
LIBS="-lrt $LIBS"
libs_qga="-lrt $libs_qga"
fi
重新执行 configure 配置即可。
收藏的一个比较好的链接:
http://smilejay.com/2012/06/qemu-kvm_compilation_installation/