Linux 内核阅读工具eclipse+qemu(一)

        俗话说万事起步难,今天又深深体会到这句话。作为刚刚开始学习内核的小朋友,我为其感到无比的兴奋与好奇。废话不多说,我们马上开始。在搭建环境之前,先做个小调研。现在主要的阅读工具有下面几种:

      1、source insight(window平台下面的源码阅读工具,好像为了使用到linux kernel上奇招百出)

      2、vim+ctags+cscope(全命令行的源码定位工具,让我想起了作为运维那段日子)

      3、eclipse+qemu(对eclipse印象还不错)

      4、qemu+gdb(跟2差不多)

     基于上述原因,我最后选择了eclipse+qemu的方法。

一、eclipse环境

     首先,先搭一个eclispe的环境吧。这里主要分为两步JDK的安装和Eclipse的安装。

     JDK安装:http://blog.csdn.net/licongcong_0224/article/details/12756959

     Eclipse下载地址:http://eclipse.org/downloads/?osType=linux

     Eclipse的安装也就是三步走:./configure && make && make install

      这里记录一下Eclipse图标的制作代码:     

     

二、编译内核

    这里主要是因为我们阅读内核代码的主要方式是设置断点,对代码进行调试。Eclipse+eqmu中eqmu是一个虚拟机,eclipse则是调试工具。所以正如我们从大学C语言课程中了解的一样,调试之前当然就是编译啦。这里我们通过eclipse进行内核的编译,首先我们先准备好我们的内核及编译的定义。

    第一步:下载内核并设置编译内容

           内核下载地址:https://www.kernel.org/

           我们这里使用的是2.6.32.61的内核版本,下载下来之后我们对其进行解压。解压相关的问题可以从下面得到解决:

           http://blog.csdn.net/grublinux/article/details/25797309

           解压完成之后,我们这里为了方便以后的说明。列出基本的目录结构:

           内核存放目录:/home/sleipnir/LinuxCore/linux-2.6.32.61/

           内核编译目标目录:/home/sleipnir/LinuxCore/linux-2.6.32-object/

 接下来,我们进入linux-2.6.32.61执行如下命令:

 make O=/home/sleipnir/LinuxCore/linux-2.6.32-object menuconfig

 进入如下的配置界面:      

Linux 内核阅读工具eclipse+qemu(一)_第1张图片

       这里首先介绍一下menuconfig,它主要是通过上面的界面让我们进行linux内核的预定义,因为linux的特色之一就是模块化。所以这里食提供给我们进行模块加载选选项的定义,里面具体的含义限于篇幅,从下面链接进行详细介绍:

http://blog.csdn.net/grublinux/article/details/25808889

注意:menuconfig需要安装ncurses,然后还有一些bug。比如shell框太小也会显示不能。。。。。

执行完成之后,menuconfig将在目标目录中生成Makefile文件。

注意:如果再次编译的时候需要执行 make O=/home/sleipnir/LinuxCore/linux-2.6.32-object mrproper将目标文件中的.o和.config文件删除。

    第二步:Eclipse编译配置

      首先是CDT插件的安装,因为Eclipse原本是只支持java的。所以我们需要下载一个cdt安装包,解压后把里面的plugins文件夹和features文件夹拷贝到eclipse的安装文件夹中。这样我们重新打开eclipse的时候,就会发现可以创建C/C++项目。

CDT下载:http://www.eclipse.org/cdt/downloads.php

cp –r plugins/* /usr/local/eclipse/plugins/
cp –r features/* /usr/local/eclipse/features/

注意: /usr/local/eclipse/为eclipse安装的路径,当前路径为cdt解压文件夹内。zip的解压命令为unzip,具体见上文中的链接

       然后我们进行一点优化的设置:      

        1、Window->Preferences->General->Workspace 中将Build Automatically选项去掉。

        2、Window->Preferences->C/C++ -> Indexer中,将默认的Fast c/c++ indexer改为No indexer。

       最后我们进行C项目的创建:

       从菜单中选择File -> New -> Project… -> C/C++ -> C Project 然后单击Next按钮。这时出现一个对话框,在Project Name 一栏填入一个工程名,比如 linux-kernel. 然后将 Use default location 选项给勾掉。在Location一栏填入刚才解压的内核源码的路径。Project type选择Makefile project -> Empty project。Toolchains 选择 Linux GCC.最终结果如下图所示:

Linux 内核阅读工具eclipse+qemu(一)_第2张图片

      然后单击Next按钮,出现下一个对话框。这时候因为工程的默认配置还不完全符合我们的要求。所以我们单击 Advanced Settings 按钮会打开一个工程配置对话框。我们选择左侧的 C/C++ Build 选项,在相应的右侧页面里我们将Builder Settings 选项页下的 Use default build command 勾选掉,然后指定一个新的Build command 为 make O=/home/sleipnir/LinxuCore/linux-2.6.32-object.然后单击Build location中的File system按钮更改obj文件的输出目录为/home/sleipnir/LinxuCore/linux-2.6.32-object. 最终结果如下图所示:

Linux 内核阅读工具eclipse+qemu(一)_第3张图片

       然后单击Behaviour选项页,将build(Incremental Build)中的all更改为一个空格,将下面的clean更改为mrproper(这是默认清除内核obj文件的命令目标)。弄好后如下图所示:

Linux 内核阅读工具eclipse+qemu(一)_第4张图片

         这个时候你就可以编译内核了。Ctrl + B 开始编译内核。

三、内核源代码的修改

        哈哈,如果当你阅读到上面的时候,以为可以轻松地编译成功。然后去喝上一口茶,那你就大错特错。因为我们使用的源码版本是2.6.32.61,这个版本的源代码直接编译会产生错误:

        /usr/include/asm/ptrace.h:5: included file 'linux/linkage.h' is not exported

        make[2]: ***[/usr/src/linux-2.6.32.61/usr/include/asm/.check] error 123
        make[1]:***[headers_check] error 2

        make:***[vmlinux] error 2

          所以上述配置完成后我们要进行源代码的修改,快把我的小心脏都吓破了。不要问我为什么,因为我也是刚学的小朋友。希望在以后学得更加深入之后能解决。具体修改步骤如下:
     

       首先定位源代码目录中的arch/x86/include/asm/ptrace.h文件vi一下,修改几个地方

       1、注释掉#include<linux/linkage.h>

       2、定位到146行注释掉如下代码:      

              extern asmregparm long syscall_trace_enter(struct pt_regs *);

              extern asmregparm void syscall_trace_leave(struct pt_regs *);

       3、继续在146行后面添加如下代码:

             extern long syscall_trace_enter(struct pt_regs *);

             extern void syscall_trace_leave(struct pt_regs *); 

       然后进入目录make mrproper一下,再利用eclipse重新编译。


注意:eclipse的编译问题不一定是由于内核代码造成的,比如源代码的访问权限问题也会造成编译不成功。可以通过编译的console窗口查看具体问题。          

你可能感兴趣的:(源码,虚拟机,内核)