|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Linux 引导过程 ) O3 v: Q" b/ j1 W
5 U" S! L4 ~! f
0 }% g& e, _! {8 _7 m- u
Linux 内核与 Android 系统 linux 内核有什么区别?
- O0 @6 m9 ?/ x3 ] 什么是引导装载程序?! v* b$ P& D+ @" S4 S, y* W$ e+ r9 y
什么是 Zygote? 7 k2 K# V. H: Y* |+ W# a5 e b
什么是 init.rc?
# n+ ^1 W# L# F6 z; `+ u3 d: g 什么是系统服务?- {2 ?: \, M3 y6 T' ~
G' g) J, C. Z/ J% d第一节 Android 启动步骤
|+ `! |7 p4 f! @; D& A& r8 P' g6 `9 h4 J, D8 n
0 i4 r! O8 G3 h7 H6 u
图12 r8 ^* C+ L# t' D" o2 e
. n" [! X( X4 C* t& Z5 T1 n
8 {- t, I. `0 ~( Y% q. p( v2 ?% N第二节 引导程序 --- Boot Loader& z0 p4 \2 C+ {! _& a& P4 m
源代码目录:$(dir)\rk3128-source\u-boot
m" Z) Q4 y; y7 X+ R0 w
, C* ~, |2 u5 x
, C/ _: F/ z/ P/ [8 d+ i
6 p, ?. W# N4 \) |. B$ S, V0 \1 o第三节 内核 --- Kernel) e. R. x, `& M; [0 C
Android 内核就是 Linux。内核启动时,设置硬件,挂载文件系统,执行第一个应用程序init。( X* v, X( {" r+ k( \3 F
2 `/ q Q' \. z
, p4 ~/ K6 {: d( P
% e' \9 D. \& e4 ^8 a0 s1 f第四节 Init 进程
0 _: e0 ]( D/ y$ s/ o; s- o$ J0 X init 是第一个进程,可以说它是 root 进程或者所有进程的父进程。init 进程有两个责任, 一是挂载目录,比如/sys、/dev、/proc,二是运行 init.rc 脚本。对于 init.rc 文件,Android 中有特定的格式以及规则。在 Android 中,我们叫做 Android 初始化语言。" u4 Q0 k) U4 Y) j
init.rc 位于目录$(dir)\rk3128-source\device\rockchip\rksdk* k y( p' n9 w8 u3 f. Q6 ]
Android 初始化语言由四大类型的声明组成,即 Actions(动作)、Commands(命令)、Services(服务)、以及 Options(选项)。
8 u& @8 h8 u8 r1 {( y Action(动作):动作是以命令流程命名的,有一个触发器决定动作是否发生。. c- n' f$ A# |; T
语法:7 \& C, |) [/ j$ ~! z, l u- s' R
on <trigger>$ z! @" J4 B) N# h
6 G/ s0 s* x7 d2 {9 E3 e$ _ <command>
/ P2 Y J/ O [9 H
: y2 R2 `( N, g$ C5 Z5 q# r9 K <command>
- P. m% ^: N: _1 { v% R: D, B3 K; L4 t
<command>
5 m4 n( Q9 z2 q2 Q0 F) E2 A' c% x2 y
Service 是 init 加载的和是退出重启的(可选)程序。Service 具有如下格式:4 E# N1 P# }, |
service <name> <pathname> [ <argument> ]*
8 J- ?, C# i! I4 t7 N8 s+ { F) s" o5 [$ J% n4 ]; n+ R
<option>7 @% L! I t& _ y& m' [2 B; W
0 L- w* o3 b7 G# e2 u
<option>
; x& i; L: l% m3 ?* l
! Q* j6 ]- q; P% m8 Y ...6 Y/ A% X. Y" _$ K# I. ~2 O' h( c
Options(选项)
2 i8 U* C$ l* V 选项是对服务的描述,它们影响 init 进程如何以及何时启动服务。5 ~& e3 ]& r( q: c$ Y
来看看默认的 init.rc 文件。这里只列出了主要的事件以及服务。" T3 R% x; K* c5 U. ~
Table
) C- J6 ], q) \. D& y( d+ i" n, S8 e5 a+ I
6 V& R5 Z+ P- u7 v1 Q5 h/ ]图23 b* G. C/ T5 Z5 {
在这个阶段你可以在设备的屏幕上看到“android”logo 了。
; G- B/ ` L3 ]" Q9 S# X; g' J8 }6 Z8 ]
# I! M" \ [3 V% \. h H( T
第五节 Zygote
2 ]% x8 G5 k' l0 S: u8 t p 在 Java 中,不同的虚拟机实例会为不同的应用分配不同的内存。但如果 Android 系统为每一个应用启动不同的 Dalvik 虚拟机实例,就会消耗大量的内存以及时间。因此,为了克服这个问题,Android 系统创造了”Zygote”,Zygote 让 Dalvik 虚拟机共享代码、低内存占用以及最小的启动时间成为可能。9 H. f! {& A* G3 \3 [" |
1 v/ L/ A- `- F! S9 c4 A
9 j' k; g) a) O, s0 k. I1 W第六节 系统服务或服务. a/ Q: B) L0 c
完成了上面几步之后,运行环境请求 Zygote 运行系统服务。系统服务同时使用 native以及 java 编写,系统服务可以认为是一个进程,系统服务包含了所有的 System Services。2 b; Q- {! e* j+ ]+ m; G% h$ r
Zygote 创建新的进程去启动系统服务,可以在 ZygoteInit 类的”startSystemServer”方法 f) [! Z$ c' g1 e& G, ~0 T: N
中找到源代码。$ W* Q! |5 }6 E" e
7 W* \$ E/ W5 L
( z g+ j2 I, L! E3 V6 C0 z0 d4 x第七节 引导完成4 O* X; [/ [4 f. Z% l) {
一旦系统服务在内存中跑起来了, Android 就完成了引导过程。 在这个时候“ACTION_BOOT_COMPLETED”开机启动广播就会发出去。
$ t- F1 z) @- _( a a- y+ V# F
5 Z( z; m: H- V4 V% }' B: V
. J4 k5 R. z: i2 t第八节 实验
2 D5 W2 G6 u! \8 H: W _ init.rc 中增加一条启动参数 setprop fengke.test 1004 P; A* K/ r6 \$ G; {! w
, } G" g( _4 Y+ y y1 ]5 e9 @
* V6 T: E8 \, R3 g7 b第九节 实验现象" m0 O$ f$ _5 ^# O7 k0 L6 C# G) D+ Q4 K
系统启动后用 getprop fengke.test 来看是否这个值已经写入! r5 R5 }) w( K0 j: ?% s3 w% A
! I, u& l q! M! k) w$ d; L
- I3 z @/ e, w" s+ i
图36 ^% R( J' m+ a- h; ]9 o. n
5 {7 O3 G, F; O" \0 a" q/ L {
6 p, f7 A( X. \9 x6 X
8 Y: d/ e7 E8 r+ y+ k$ T+ r0 \
+ x/ D; v; |- d+ y9 ~
文件下载请点击:
1、Linux引导过程.pdf
(409.72 KB, 下载次数: 0)
: J- F4 P# C2 U) Z" u& Z2 Z. c: T+ j* ~& f2 T
|
|