linux内核调试环境搭建-1 Ubuntu10 .10下编译安装qemu

      内核调试一般比应用层程序调试困难很多,主要因为内核是系统开机后执行的第一个程序,这使得用于一般应用程序的调试方法无法使用在内核上。自由软件社群开发了一些特殊方法解决这问题。 这些方法中最方便的方法莫过于 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/



你可能感兴趣的:(linux内核,KGDB,qemu-kvm)