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

本文介绍了一种使用Eclipse+QEMU进行Linux内核2.6.32.61版本编译的方法,包括环境搭建、内核源码准备、编译配置等过程,并针对编译过程中遇到的特定问题提供了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

      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图标的制作代码:     

     
#!/usr/bin/env xdg-open
   [Desktop Entry]
   Encoding=UTF-8
   Name=Eclipse
   Exec=/usr/app/eclipse/eclipse
   Icon=/usr/app/eclipse/icon.xpm
   Terminal=false
   StartupNotify=true
   Type=Application
   Categories=Application;Development;

二、编译内核

    这里主要是因为我们阅读内核代码的主要方式是设置断点,对代码进行调试。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

 进入如下的配置界面:      

       这里首先介绍一下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.最终结果如下图所示:

      然后单击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. 最终结果如下图所示:

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


         这个时候你就可以编译内核了。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窗口查看具体问题。          

### 如何使用Eclipse调试Linux内核 #### 安装必要的工具和配置环境 为了能够顺利地通过Eclipse调试Linux内核,需要先准备好相应的开发环境。这通常意味着安装并设置好交叉编译器、QEMU模拟器以及其他辅助工具。 对于基于ARM架构的目标平台来说,可以采用如下方式准备: - **安装交叉编译链**:确保拥有适合目标硬件的GCC版本,例如`arm-linux-gnueabihf-gcc`。 - **获取源码树**:下载官方发布的稳定版或其他特定分支的Linux内核源代码,并按照需求打补丁或修改。 - **构建内核映像**:利用Makefile完成编译过程,生成可用于加载到虚拟机中的zImage文件[^4]。 #### 设置Eclipse项目结构 创建个新的C/C++工程,在导入现有资源时指定之前提到过的内核源目录作为工作空间的部分。接着调整项目的属性以适应实际状况下的编译选项与路径变量等参数设定。 #### 配置GDBServer连接至远程设备/QEMU实例 启动QEMU仿真器运行所选CPU型号(如vexpress-a9),并通过附加命令行开关暴露其监听端口给外部访问者。此时应当注意到开启单步执行模式(`-S`)以及启用gdbstub服务(`-s`)的重要性[^5]。 ```bash qemu-system-arm \ -nographic \ -M vexpress-a9 \ -m 1024M \ -kernel path/to/arch/arm/boot/zImage \ -append "rdinit=/linuxrc console=ttyAMA0 loglevel=8" \ -dtb path/to/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \ -S -s ``` #### 创建Debug Configuration 回到Eclipse IDE内部定义新的调试方案,选择Remote GDB Hardware Debugging类别之后输入主机名/IP地址连同对应的TCP端口号(默认情况下为1234)。另外还需指明本地符号表位置以便于断点管理和反汇编视图等功能正常使用。 最后点击Apply & Debug按钮即可触发整个流程直至到达预设的第条指令处暂停等待进步指示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值