利用Eclipse搭建Linux内核开发环境

原文地址:http://blog.csdn.net/aggresss/article/details/76577681

利用Eclipse搭建Linux内核开发环境

正文

  时光流逝,记得十年前还是个游手好闲的少年,无聊时觉得应该分析一下Linux内核源码,没有别的动机,只觉得这样很酷。 
  没有任何项目经验的话,突然眼前出现一个浩大的工程,除了惊叹之余,再无其他可言。Linux内核的学习曲线可能陡峭了一点,如果没有点定力的话,是不会有什么进步的。 
  当把几十MB的tar包下载到本地后,打开方式便成了困扰我的一个问题,前前后后使用过好多工具,但都有一些缺点。

  1. Vim 
    各种插件,各种配置。vim如果定义为IDE的话,那还属于轻量级的IDE,通过Nerdtree+taglist+ctags+ycm这些大众一点的插件,完全可以实现语法高亮,代码跳转等IDE具备的功能,但对于SLOC大于100K数量级的工程貌似有点力不从心。相对与大型IDE来说,它更像一把短小而锋利的瑞士军刀。
  2. Emacs 
    神用的编辑器,学习曲线是盘旋型的,高深莫测。太难驾驭,对与我这种凡人,可能一辈子都盘旋在这个漩涡里。
  3. Source Insight 
    看过好多教程使用这东东浏览Linux内核,总是觉得很别扭,Linux自己家的事,为什要放在Windows上,文件名不区分大小写这一点就足以让人头疼了。
  4. LXR 
    例如: http://elixir.free-electrons.com/linux/latest/source 非常适合各种版本的Linux内核代码间比较和浏览,但是你想修改一下再编译一下就没有这功能了。

  进行过一下尝试后,还是觉得需要一个相对重量级的IDE来浏览Linux内核代码比较省时省力,比如Eclipse,QTCreator,Netbeans. 我这里暂且使用Eclipse来搭建一个浏览Linux内核的环境,以帮助新人少走弯路。

在使用eclipse创建工程之前需要两步准备工作:1,准备好交叉编译工具配置好环境变量;2,将Linux Kernel下载解压并成功编译一次。 
下面这段输出是使用命令 
export ARCH=arm CROSS_COMPILE=arm-linux- 
make arm_vexpress_defconfig 
make zImage V=1 
输出的 ./init/main.c 文件的编译参数,这段参数将作为我们接下来配置Eclipse的重要参考。

arm-linux-gcc -Wp,-MD,init/.main.o.d  
-nostdinc 
-isystem /opt/arm-buildroot-linux-uclibcgnu/usr/lib/gcc/arm-buildroot-linux-uclibcgnueabihf/5.4.0/include 
-I/mnt/sda5/workplace/linux-3.10.107/arch/arm/include 
-Iarch/arm/include/generated  
-Iinclude -I/mnt/sda5/workplace/linux-3.10.107/arch/arm/include/uapi 
-Iarch/arm/include/generated/uapi -I/mnt/sda5/workplace/linux-3.10.107/include/uapi 
-Iinclude/generated/uapi -include /mnt/sda5/workplace/linux-3.10.107/include/linux/kconfig.h 
-D__KERNEL__ -mlittle-endian -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs 
-fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security 
-fno-delete-null-pointer-checks -std=gnu89 -O2 -fno-dwarf2-cfi-asm -fno-ipa-sra 
-mabi=aapcs-linux -mno-thumb-interwork -funwind-tables -marm 
-D__LINUX_ARM_ARCH__=7 -march=armv7-a -msoft-float -Uarm -Wframe-larger-than=1024 
-fno-stack-protector -Wno-unused-but-set-variable -fomit-frame-pointer 
-fno-var-tracking-assignments -g -Wdeclaration-after-statement -Wno-pointer-sign 
-fno-strict-overflow -fconserve-stack 
-DCC_HAVE_ASM_GOTO    -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(main)"  
-D"KBUILD_MODNAME=KBUILD_STR(main)" -c -o init/main.o init/main.c
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

下面我们开始通过Eclipse构建Linux Kernel 工程,我使用的版本是Eclipse cdt neon 3 
Eclipse 版本信息

  1. 打开Eclipse工程后 File–>New–>Other–>C/C++–>Makefile Project with Existing Code 然后将Kernel所在目录配置好 
    配置工程目录

  2. 配置好工程目录后,右键Project Explorer 中的工程,选择 Properties 进入工程属性配置窗口。

  3. 选择C/C++ build ,将 Use default build command选项去掉,在Build command中输入 ARCH 和 CROSS_COMPILE 的配置信息,配置如下图 
  4. 配置 C/C++ Gernal ,这一项中配置信息较多。 
    首先选择 indexer 子选项,勾选 Enable project specific settings 选项 并 去掉 Index source files not included in the build 选项。 
    indexer配置项
    选择 Paths and Symbols 子选项,需要配置 Includes,Symbols,Source Location 三个tab选项。 
    Includes中添加架构相关的include头文件,参考刚才编译时的 -I 选项 ,我这里添加 
    ./arch/arm/include 
    ./arch/arm/include/uapi 
    ./arch/arm/include/generated 
    ./arch/arm/include/generated/uapi 
    四个目录,工程根目录下的include目录不用添加,eclipse会自动搜索那个目录。 
    includes配置
    其中 Symbols 配置则参考编译输出信息中的 -D 参数 ,KERNEL 是必须的, 其他的要根据平台不同,KBUILD_* 相关的定义可以先不用添加,用到的比较少。 
    symbols配置
    其中 Source Location 配置主要是为了去掉不参与编译的代码,避免多平台头文件的重复定义对indexer的干扰,选择 Edit Fileter–>Add Multiple 将 ./arch目录下的所有文件夹选中,除了需要编译的平台,比如我这里要排除arm文件夹。如果不开发驱动,建议将./drivers目录也添加进入,因为驱动里面的头文件也存在重复定义。 
    source location配置

  5. 配置 Preprocessor Include Paths, Macros etc. 子选项。 
    其中 Entries 选项卡 选中 GNU C –> CDT User Setting Entries –> Add –> Preprocessor Macros File –> 选择 ./include/gernerated/autoconf.h 文件 –> OK 
    所有make menuconfig 时的编译配置信息都在这个文件里,所以需要让eclipse识别这些信息。 
    Entries配置
    其中 Providers 选项卡 选中 CDT Cross GCC Built-in compiler Settings 选项,在 Command to get compiler specs 中添加 -nostdinc 和 -isystem {cross gcc include 目录} 信息,具体的目录信息可以参考内核编译时的输出信息。 
    providers配置
    Providers的配置说明: 通常一个C工程需要包含的头文件分为三类: 
     (1). GCC编译器的头文件,通常包含编译器支持的一些特性比如 va_list 这种特性; 
     (2). libc库的头文件,就是标准C库的头文件,比如stdio.h就属于这一类; 
     (3). 第三方库头文件。 
    Linux内核只用到了第一类头文件,并没有用到libc库和第三方库,所以使用 -nostdinc 选项将交叉编译工具的默认库搜索路径去掉,然后再使用 -isystem 选项将 GCC编译器的头文件路径加入即可。

  6. 完成。 
     
    等待index完成,需要几分钟的时间。 
     
    然后就可以使用Eclipse开发Linux Kernel了,Eclipse在一些小细节上还是会解析的不够好,一些小的语法错误提示可以不用太在意。

参考文档:

  1. https://wiki.eclipse.org/HowTo_use_the_CDT_to_navigate_Linux_kernel_source
  2. http://events.linuxfoundation.org/sites/events/files/slides/ELCE_2016_Exploring_Linux_Kernel_Source_Code_with_E
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值