|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本章导读
! ]2 u4 b" o V& P5 Y! n: \& k% F在前面入门视频第十期“搭建编译环境 uboot_linux_Android”中,只介绍了输入 Make命令就可以编译出内核,并没有介绍它是如何运行的。
# m3 k% W5 w& _在向内核中添加驱动的时候要完成 3 项工作,包括:# a. F, w4 k& J- }6 u5 K" H8 p: {' L
1)在 Kconfig 中添加新代码对应项目的编译条件,这一部分在实验 3 已经介绍过;* ~# [- Q4 q: W$ a$ [
2)将驱动源码添加到对应的目录中,这一步比较好理解,在本章实验中将给大家演示一下;! x/ a9 F) h, }. s! J$ C
3)在目录 Makefile 中文件中增加针对新代码的编译条目,这一部分将在本章节介绍到。
) s, Z9 |7 [7 m: t& l, H4.1.1 工具& n# J( ?, H% d) ^
4.1.1.1 硬件工具
; M8 e) [; X# g- S; a8 d" g, k1)PC 机/ C% ]7 Z3 M; V4 ?
4.1.1.2 软件工具
" o0 n, `, B* {9 O6 y% f1)虚拟机 Vmware
) t) o J7 [3 ]" G2)Ubuntu12.04.2
6 x4 [- K {9 u4 R3)Ubuntu 系统下解压生成的 Linux 源码
7 S: f3 t8 M. J/ ?4.1.2 预备课程2 r2 n2 P+ Z9 W5 q1 Q0 m- U3 ^
入门视频“01-烧写、编译以及基础知识视频”- \! j/ X, i6 E6 y+ P# c
→“实验 10-搭建编译环境 uboot_linux_Android”或者使用手册“五 Android 开) K: l* e; S, M+ P
发环境搭建以及编译”;
7 ~9 c/ \5 | |- I7 A实验三 Menuconfig_Kconfig
1 _3 F) K/ y4 _( j: I" g4.1.3 视频资源
/ M$ j0 D: y5 ~& @6 E6 z本节配套视频为“视频 04_Makefile 编译”5 ~* Y; W7 S2 Y
4.2 学习目标7 K6 r& I$ z2 R. W8 p6 q G0 O: h
本章需要学习以下内容:
: J' ^9 P5 P! P7 Z掌握 Linux 内核编译命令
5 R; Y5 W! l; i2 O掌握编译器路径设置的方法; g: j5 o" z: | Y' @. _7 L4 _9 K
理解环境变量路径、编译器、源码 Makefile 文件中编译器路径三者之间的关系
& A5 a4 ?. [1 X0 X; x理解 Makefile 文件结构
0 `# V! s7 Z" y0 n9 b0 O掌握向 Makefile 文件中添加脚本命令的方法,能够看懂 Makefile 脚本& ]" b6 |3 \: y3 H3 m4 v5 ^ u
4.3 编译器路径的设置
7 L$ y8 \& T5 }% Y9 L在前面入门知识中,只介绍了在什么目录解压编译器,在环境变量文件中添加路径,就可以编译出内核,并没有介绍他们之间是如何对应的。1 s- a* @- ?0 D9 Y7 c
如下图所示,按照前面提供的基础教程,配置好 Ubuntu 中的编译器和库文件,输入命令“#make”,就可以编译生成内核的二进制镜像。
3 P4 Q( E# p" o4 a/ ]![]()
7 U, }/ f* y+ }7 J2 K R4 `如下图所示,使用命令“#cd”,使用命令“#vim .bashrc”打开环境变量文件“.bashrc”。- Y7 ^+ E5 h" M( S7 o
![]()
" v4 Y8 O) P1 X: [5 p如下图所示,进入最底行,可以看到,在环境变量文件中编译器路径设置为“exportPATH=$PATH:/usr/local/ARM/arm-2009q3/bin”。
9 ?* x/ s' V' s* @$ u; `* w+ n" Q & A7 ?: g6 D7 q
然后使用命令“#cd /usr/local/arm/”,进入解压编译器“arm-2009q3.tar.bz2”的文件目录。( M6 Z/ ?: c9 u
![]()
4 u0 v% H; U7 u+ p" s. Q可以明显的看到,环境变量中设置的路径和解压的路径是对应的。( X: R7 c& ^4 s$ R& l, C' ^ X5 Y! m
这里回到内核源码的目录,如下图所示。2 o0 D7 C5 v! N2 k2 s9 u* e! l7 T( `. c
- H+ o3 j3 }* d* f
如下图所示,使用命令“#vim Makefile”打开内核目录下的 Makefile 文件。$ E* {4 | }$ J( T* ?4 X }; r: o' S! j
V+ Z+ t7 l$ @" _) w% I
这里通过 vim 编辑器查找参数“CROSS_COMPILE”,如下图所示。- {! n9 C t( w9 E& s1 j0 B
0 e6 }2 d6 l) v# ?- K* ~. {1 T* S
可以查到参数“CROSS_COMPILE”,如下图所示。$ i0 X' t+ b5 V+ x% a# w
6 d/ G: d1 y! h4 F
如上图所示,可以看到这个参数是“/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-”。
7 h' z% u) j# s. b+ s& y, `再看一下参数“CROSS_COMPILE”的下一行,可以看出这里有修改过的痕迹。很容易推断出,原来三星是用的“4.5.1”版本的编译器,不过这个没关系,只要能编译通过就可以了。9 n# f4 M1 J; |$ C& O$ A9 n6 p' t
一般说来,拿到源码之后的第一步,是要先要先将源码编译通过。' u& {/ P8 T5 c% N& `
设置上图中的变量“CROSS_COMPILE”以及环境变量还有编译器实际解压路径三者对应。这三者对应之后,就能确保执行 Make 命令之后,系统能够找到这个编译器。( h* v% h2 E+ P& Y
在编译命令执行的过程中,会提示一些错误,然后根据提示的错误,挨个去排查修改,去添加库文件或者修改库文件。这个过程有长有短,考验的只是耐心,并没有太多技巧。由于已经将缺少的库文件写成脚本,这样大家在编译器执行以下脚本就能够编译通过。
% B: n$ g" A% @' ?/ @针对内核目录下的 Makefile 文件,提醒大家一下,这个文件中内容很多,除了上面编译器路径变量以外的其它部分几乎不用关注。# T ^1 w" S& G
另外还有一个地方需要了解一下,如下图所示,在该文件的第一行,可以看到内核的版本。
. n. S% q# d; n. {1 J' O' A g# X![]()
1 C l" n0 ^: e& k+ g8 ]4 P E; U4.4 Make 内核编译命令执行过程简介
8 Q9 N; @+ ]! P6 ^# k+ T' f如下图所示,编译内核需要执行 make 命令,在执行 make 命令之后,并没有介绍它是如何执行的。
. Q- t: J: L1 M6 }( {![]()
4 s5 T, y- ~! G$ h1 O- N% @" o在 make 命令执行之后,它会首先找到当前目录下的“Makefile”文件,如下图所示。( f+ y" ^, ^; T+ e Y
![]()
( ~: S! d( P O+ S* `运行 Makefile 文件之后,它会在 Makefile 文件中找到编译器的路径“/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-”如下图所示。
( r; r9 f% f# P# o; z& ]0 X0 U k0 G* g y9 R
然后系统根据环境变量找到“export PATH=$PATH:/usr/local/arm/arm-2009q3/bin”编译器的路径,如下图所示。
- Y% Y1 a# ]. v& V3 D3 G( c- f" ` 2 s# ]* H7 n }
如下图所示,使用命令“ls /usr/local/arm/arm-2009q3/bin/”可以查看到 arm2009q3解压之后有哪些具体编译器。$ n$ a# S: e( F! q
![]()
|( o& q3 {, C Y如上图,系统找到编译器之后,同时基础的库文件也是和编译器在一起的,有时候编译一个新的内核,还有可能需要修改库文件。
4 n9 ^) \/ L8 s3 N编译执行前还需要找到“.config”文件,默认是放在源码目录下的。使用命令“ls -a”就可以看到,如下图所示。
$ |+ a6 R; n/ w9 G" N% f) G$ ?![]()
! b8 w, e" v& T S从本章‘实验 03’的 3.5 小节,学习到这个“.config”是通过 menuconfig 工具生成的,里面只是一些宏定义,如下图所示,打开这个文件。
9 W- q1 M/ X* h. `0 P0 e2 m 4 R( d. L3 b0 ]( E9 M
查找宏定义”LEDS,”是编译 led 驱动的宏定义“LEDS_CTL”,如下图所示。; M2 g3 F& o3 ?: U' p, \; e
![]()
' e! ^7 }+ F8 j+ t( R+ \0 q" T现在系统找到这个宏定义“LEDS_CTL”,在编译具体中间文件的时候会用到。# O1 v2 Y) I- s! n
具体是怎么实现的,继续看下一小节的内容就可以搞清楚这个宏定义有什么用处。
" j# w" K, f6 M![]()
2 k( r1 R. }0 f. [& a8 [" G |
|