|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Linux 引导过程 3 f$ B/ ~; V7 m+ `
) M+ T. i5 y! F$ Y3 \ s1 o5 O a: l+ D) e' {! p
Linux 内核与 Android 系统 linux 内核有什么区别?
! I+ e1 t7 d1 `. k. _8 s6 | 什么是引导装载程序?( r' M! s! |- T2 T: M u* j% B
什么是 Zygote?
/ Q1 s' I, V4 f0 F/ X- C* j 什么是 init.rc?* M/ I, A2 I( b: w2 ^
什么是系统服务?0 |7 F5 B. p( ?: Z0 @
: `" D4 G+ M8 [# W9 S8 B: q8 w
第一节 Android 启动步骤1 J$ x3 j9 S& Q: P/ U; n8 M+ W
* ^+ C2 o# i) b6 Y
8 y- f4 [( @) D/ C$ J/ z) C' W图1! w* ?& M% ?$ @( d3 Q) @( ^
( e5 I! b. T& e- l1 a1 E! I% T+ l% x8 A5 n( x6 S, r B
第二节 引导程序 --- Boot Loader7 a0 d; p9 e) U: N D7 n
源代码目录:$(dir)\rk3128-source\u-boot3 _ Q' O" V; M2 y2 J+ e
4 g& q# x5 l) j$ N4 W( D
! t- @* l5 s' t4 |6 a1 t- O/ c2 N+ `- x* q2 \+ X2 N
第三节 内核 --- Kernel4 x- Y9 n- j) G3 S; g* h% @
Android 内核就是 Linux。内核启动时,设置硬件,挂载文件系统,执行第一个应用程序init。$ N% b" l* i: ?9 E$ a x; L4 {
' p2 @3 s2 A9 k) b
7 i8 W. T+ x% k
8 W0 T3 j0 J" e$ H9 E第四节 Init 进程
+ L/ U( D/ T }$ p/ H init 是第一个进程,可以说它是 root 进程或者所有进程的父进程。init 进程有两个责任, 一是挂载目录,比如/sys、/dev、/proc,二是运行 init.rc 脚本。对于 init.rc 文件,Android 中有特定的格式以及规则。在 Android 中,我们叫做 Android 初始化语言。
! H5 s+ H0 M7 u) H8 |4 ] init.rc 位于目录$(dir)\rk3128-source\device\rockchip\rksdk
. W6 S2 }: u9 X% i, I% f+ f Android 初始化语言由四大类型的声明组成,即 Actions(动作)、Commands(命令)、Services(服务)、以及 Options(选项)。* J4 B0 T, y% t
Action(动作):动作是以命令流程命名的,有一个触发器决定动作是否发生。
" x$ l: z. z' M8 G0 r% P+ s语法:
) D+ z5 u% t1 o9 l }5 b on <trigger>
7 ]5 q% _5 y7 n; \" L0 y3 f: e& f: D7 f: i& p6 R3 d, D0 R6 F. O- I
<command>
9 d. W7 t+ @% F/ p$ D6 O3 O2 o6 y; h7 ?1 P& J) X8 @( O( j2 J1 W
<command># \/ g/ T' [. I# Y4 D& g' H" S
! H5 N2 ~1 W3 |; K4 p# |, |
<command>/ T2 A4 ]+ {0 l: I0 n$ x
0 [& o6 s! ?+ c6 b Service 是 init 加载的和是退出重启的(可选)程序。Service 具有如下格式:
+ W3 _% ^3 ^/ U9 x8 J service <name> <pathname> [ <argument> ]*
: {7 }- _! v$ q& i1 L- Y/ I! y/ ]5 _5 M! U/ I. M+ U5 H
<option>
$ w) s) i) q+ F
7 k8 j) C) q& O3 f; Y( H' W <option>
/ n! P' Z& H) q: V- ]9 Z% A/ \+ w5 u
...& a4 u9 ~- j: O" _: n; `) U
Options(选项)
' \' ], O9 }' V 选项是对服务的描述,它们影响 init 进程如何以及何时启动服务。* c5 C9 k- s4 r, i3 I$ X7 x
来看看默认的 init.rc 文件。这里只列出了主要的事件以及服务。6 x( {4 k8 g9 s5 {$ x. w
Table
7 g' W0 F9 V/ g3 T0 I7 d7 z
% N* V" W! T0 u& V& b( J% ]
: O/ ~. h5 B; R
图2$ A* U+ ]1 L( W4 X* p
在这个阶段你可以在设备的屏幕上看到“android”logo 了。
# @& {# Y( v( M) B1 `4 F- w' @4 w7 t6 @& s
, a. M" m! }& ]7 J第五节 Zygote) z2 a; z: n0 }. A
在 Java 中,不同的虚拟机实例会为不同的应用分配不同的内存。但如果 Android 系统为每一个应用启动不同的 Dalvik 虚拟机实例,就会消耗大量的内存以及时间。因此,为了克服这个问题,Android 系统创造了”Zygote”,Zygote 让 Dalvik 虚拟机共享代码、低内存占用以及最小的启动时间成为可能。
4 g, X. V; L4 S1 l+ b6 @$ E
' l! O* b$ C2 X p" d: u
/ `2 S ^' p* \3 f! [% o第六节 系统服务或服务; p8 J% L- I" F
完成了上面几步之后,运行环境请求 Zygote 运行系统服务。系统服务同时使用 native以及 java 编写,系统服务可以认为是一个进程,系统服务包含了所有的 System Services。
5 a+ Z- x" P' W4 q Zygote 创建新的进程去启动系统服务,可以在 ZygoteInit 类的”startSystemServer”方法/ b9 Y. ]3 F2 k/ k
中找到源代码。0 E% ^2 r( d* j) w5 h' x
4 {* s% {/ p6 y' A# v9 M
5 _; G! r4 k3 G( w第七节 引导完成
" b/ ?; M- u6 w: p 一旦系统服务在内存中跑起来了, Android 就完成了引导过程。 在这个时候“ACTION_BOOT_COMPLETED”开机启动广播就会发出去。
9 _6 q$ z. \2 g" R) G p( ?! {8 E7 _
, p" d; p: J6 h( l, o
第八节 实验+ f) Y7 j2 {1 x: {+ n9 b
init.rc 中增加一条启动参数 setprop fengke.test 100
, Y& Z+ Z% D7 e. o; Y- l: ]" s" Y. c
( ?0 |3 A, G8 D2 d' ~: P: R8 F第九节 实验现象 |9 s8 W- G' J/ n
系统启动后用 getprop fengke.test 来看是否这个值已经写入/ {/ k9 @! j/ T2 {$ b8 R( T
& i* B# i: z* ?
8 l5 T' i P! @+ P$ S图3' b( M8 k" m; |& c* r+ Z
) c1 p6 S4 v& F& D) x$ O
; \. T& ^6 f7 i4 E, M
, V$ j$ ?2 i; t) x
* j: q) o/ n7 N# A
文件下载请点击:
1、Linux引导过程.pdf
(409.72 KB, 下载次数: 0)
; L- H' O: d9 P8 D) K
6 S' C8 x a8 `9 s |
|