正文
岁月流逝,记得六年前还是个游手好闲的少年,无趣时认为应当剖析一下Linux内核源码,没有别的动机,只认为这样很酷。
没有任何项目经验的话,忽然眼前出现一个浩大的工程,不仅惊讶之余,再无其他可言。Linux内核的学习曲线可能湍急了一点,假如没有点定力的话linux系统日志,是不会有哪些进步的。
当把几十MB的tar包下载到本地后,打开方法便成了困惑我的一个问题,前前后后使用过很多工具,但都有一些缺点。
Vim
各类插件,各类配置。vim假如定义为IDE的话,那还属于轻量级的IDE,通过Nerdtree+taglist+ctags+ycm这种大众一点的插件,完全可以实现句型高亮,代码跳转等IDE具备的功能,但对于SLOC小于100K数目级的工程似乎有点力不从心。相对与小型IDE来说,它更像一把短小而锋利的英国军刀。Emacs
神用的编辑器,学习曲线是盘旋型的,艰深诡谲。太难驾驭,对与我这些凡人,可能一辈子都盘旋在这个旋涡里。SourceInsight
看过很多教程使用这东东浏览Linux内核linux内核开发头文件,总是认为很别扭,Linux自己家的事,为什要置于Windows上,文件名不分辨大小写这一点就足以让人头痛了。LXR
比如:特别适宜各类版本的Linux内核代码间比较和浏览,而且你想更改一下再编译一下就没有这功能了。
进行过一下尝试后,还是认为须要一个相对重量级的IDE来浏览Linux内核代码比较省时省力,例如Eclipse,QTCreator,Netbeans.我这儿姑且使用Eclipse来搭建一个浏览Linux内核的环境,以帮助新人少走弯路。
在使用eclipse创建工程之前须要两步打算工作:1,打算好交叉编译工具配置好环境变量;2,将LinuxKernel下载解压并成功编译一次。
下边这段输出是使用
exportARCH=armCROSS_COMPILE=arm-linux-
makearm_vexpress_defconfig
makezImageV=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
下边我们开始通过Eclipse建立LinuxKernel工程,我使用的版本是Eclipsecdtneon3
打开Eclipse工程后File–>New–>Other–>C/C++–>MakefileProjectwithExistingCode之后将Kernel所在目录配置好
配置好工程目录后,右键ProjectExplorer中的工程,选择Properties步入工程属性配置窗口。
选择C/C++build,将Usedefaultbuildcommand选项去除,在Buildcommand中输入ARCH和CROSS_COMPILE的配置信息,配置如右图
配置C/C++Gernal,这一项中配置信息较多。
首先选择indexer子选项sogou pinyin linux,勾选Enableprojectspecificsettings选项并去除Indexsourcefilesnotincludedinthebuild选项。
选择PathsandSymbols子选项,须要配置Includes,Symbols,SourceLocation三个tab选项。
Includes中添加构架相关的include头文件,参考刚刚编译时的-I选项,我这儿添加
./arch/arm/include
./arch/arm/include/uapi
./arch/arm/include/generated
./arch/arm/include/generated/uapi
四个目录,工程根目录下的include目录不用添加,eclipse会手动搜索那种目录。
其中Symbols配置则参考编译输出信息中的-D参数,KERNEL是必须的,其他的要依据平台不同,KBUILD_*相关的定义可以先不用添加,用到的比较少。
其中SourceLocation配置主要是为了除去不参与编译的代码,防止多平台头文件的重复定义对indexer的干扰,选择EditFileter–>AddMultiple将./arch目录下的所有文件夹选中,不仅须要编译的平台,例如我这儿要排除arm文件夹。若果不开发驱动,建议将./drivers目录也添加步入,由于驱动上面的头文件也存在重复定义。
配置PreprocessorIncludePaths,Macrosetc.子选项。
其中Entries选项卡选中GNUC–>CDTUserSettingEntries–>Add–>PreprocessorMacrosFile–>选择./include/gernerated/autoconf.h文件–>OK
所有makemenuconfig时的编译配置信息都在这个文件里,所以须要让eclipse辨识那些信息。
其中Providers选项卡选中CDTCrossGCCBuilt-incompilerSettings选项,在Commandtogetcompilerspecs中添加-nostdinc和-isystem{crossgccinclude目录}信息,具体的目录信息可以参考内核编译时的输出信息。
Providers的配置说明:一般一个C工程须要包含的头文件分为三类:
(1).GCC编译器的头文件,一般包含编译器支持的一些特点诸如va_list这些特点;
(2).libc库的头文件linux内核开发头文件,就是标准C库的头文件,例如stdio.h就属于这一类;
(3).第三方库头文件。
Linux内核只用到了第一类头文件,并没有用到libc库和第三方库,所以使用-nostdinc选项将交叉编译工具的默认库搜索路径去除,之后再使用-isystem选项将GCC编译器的头文件路径加入即可。
完成。
等待index完成,须要几分钟的时间。
之后就可以使用Eclipse开发LinuxKernel了,Eclipse在一些小细节上还是会解析的不够好,一些小的句型错误提示可以不用太在乎。参考文档:
本文原创地址://gulass.cn/snqyshxsndln.html编辑:刘遄,审核员:暂无