|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Linux 引导过程
3 j- i$ Y( G+ m
3 d1 b8 C' s- y* {. L4 D2 W* f) X% ?
( f* P6 c+ S! G9 ~ Linux 内核与 Android 系统 linux 内核有什么区别? + _4 u- u' h1 Q, n. H! J; D
什么是引导装载程序?
9 P2 {/ D* B( I2 f% I 什么是 Zygote?
: I5 Z: l# ~0 }" j) C 什么是 init.rc?
4 p* A7 ]5 {# o' t 什么是系统服务?9 O, I' M) G9 U c' L9 C$ U, g
9 M: ]& u3 R. o2 ]8 E N
第一节 Android 启动步骤
! t& A7 m! V7 T3 Y. Q% r: `
/ Q7 o# q. A! }% k' x8 _
: B6 e, E' f( ^6 `, z图1
6 @3 f. T" q7 A8 f, S' g) u
Z9 y' B! i! T4 c {5 G4 x5 b- t" Y% Y5 C" Y3 Q
第二节 引导程序 --- Boot Loader$ H3 O/ Q1 j% _1 T- u6 k1 c+ s: \5 u
源代码目录:$(dir)\rk3128-source\u-boot9 g/ ]* E0 V: e2 R, d& ]
& f; q T! g3 x$ \
' Q( _; ~* o; j, B9 a$ g9 ?6 v. e4 c A( b" S. J6 q( g) k
第三节 内核 --- Kernel
e8 M# [" Z1 U' W2 r4 X Android 内核就是 Linux。内核启动时,设置硬件,挂载文件系统,执行第一个应用程序init。0 u( b! @0 p; {( c
3 p& u. l$ {. c2 i8 @) z4 H
. P$ y: s! G6 ^# b" o w, X) [% U( `
第四节 Init 进程
+ E; _ x& s. B init 是第一个进程,可以说它是 root 进程或者所有进程的父进程。init 进程有两个责任, 一是挂载目录,比如/sys、/dev、/proc,二是运行 init.rc 脚本。对于 init.rc 文件,Android 中有特定的格式以及规则。在 Android 中,我们叫做 Android 初始化语言。) C& `$ [% s0 x/ M* y/ X# F
init.rc 位于目录$(dir)\rk3128-source\device\rockchip\rksdk9 X+ g9 \) m/ o/ @3 b
Android 初始化语言由四大类型的声明组成,即 Actions(动作)、Commands(命令)、Services(服务)、以及 Options(选项)。
3 Q( N5 {, r0 z( H$ g Action(动作):动作是以命令流程命名的,有一个触发器决定动作是否发生。7 T4 {3 I8 V7 Y" _- \" v3 P* Y. D+ r
语法:
5 x. l- }1 r- {9 i$ a on <trigger>) a' N) {$ A4 R A; Z
9 F, z# \/ N3 |& R8 l <command>* Z' S* F' E4 k: ?7 P+ J
1 m. X( s& l8 p/ U! \8 ` <command>. X) F# ^; t* I# U# l4 O" j
' Z3 P* `+ U% `6 @
<command>
; _% e, h: S0 O, `3 L" L- J4 L, g5 X
Service 是 init 加载的和是退出重启的(可选)程序。Service 具有如下格式:
( i# H0 p0 O8 ]! C service <name> <pathname> [ <argument> ]*
m$ O) N6 P0 y6 q. _! b; L
8 F, p0 G. O q* x' x% k <option>
$ b6 }: A i5 T' |) R
0 V2 S+ z" X5 L) h$ s) \: { <option># g X2 q, R( G% `* O
F/ a- ?( s) X4 Y ...
8 j/ {" G0 F" J& V; O. P6 E4 K* @ Options(选项)! Z7 O( O0 v3 ~* `
选项是对服务的描述,它们影响 init 进程如何以及何时启动服务。% O/ _: ^& w" }9 t: C
来看看默认的 init.rc 文件。这里只列出了主要的事件以及服务。
# Y+ M7 I5 A+ i/ d7 t6 ZTable# V. W( m/ i, L8 [6 z
# m4 Q7 A* E% }' I% y
& Z/ t% V# Q0 Z# K图2
! H7 U4 w2 R9 N8 ]% t; E 在这个阶段你可以在设备的屏幕上看到“android”logo 了。6 H8 E; {" s/ y, g6 D4 ?8 S
0 W C j, C- |) P: |9 {! }6 y8 r
w/ [7 f* |* x @ w. e
第五节 Zygote
0 K# H/ G2 B H9 x 在 Java 中,不同的虚拟机实例会为不同的应用分配不同的内存。但如果 Android 系统为每一个应用启动不同的 Dalvik 虚拟机实例,就会消耗大量的内存以及时间。因此,为了克服这个问题,Android 系统创造了”Zygote”,Zygote 让 Dalvik 虚拟机共享代码、低内存占用以及最小的启动时间成为可能。
1 s+ ]1 K5 { X1 z2 I
9 N/ D6 H% f1 O% P% V& @7 w* q- F
7 \. S2 ]9 L4 L: p/ W7 b. ]" l5 R第六节 系统服务或服务% K" F$ w% w7 \ G7 L) U9 g
完成了上面几步之后,运行环境请求 Zygote 运行系统服务。系统服务同时使用 native以及 java 编写,系统服务可以认为是一个进程,系统服务包含了所有的 System Services。
5 c @# A8 y- X Zygote 创建新的进程去启动系统服务,可以在 ZygoteInit 类的”startSystemServer”方法
8 a* ]4 H8 H: S8 `, X& `中找到源代码。2 i- _' `+ V, i# ?% g# O! g
: Z9 y8 p4 R2 y' C9 j' v5 n
$ p% T! N0 C+ _9 r: a- q8 a第七节 引导完成8 B. N1 `& ]* b2 ]) b: Z
一旦系统服务在内存中跑起来了, Android 就完成了引导过程。 在这个时候“ACTION_BOOT_COMPLETED”开机启动广播就会发出去。' j: z, J1 ~3 c- ^
, T; ]- p1 ?, n7 \
- q1 R* G/ v7 l. A% H. W2 V1 p第八节 实验
; @# O9 p; S) _6 [5 ?9 U init.rc 中增加一条启动参数 setprop fengke.test 1009 [( O5 U8 p/ c; l2 m' v
j! |8 F# {* t
( L- @9 [( O F7 v
第九节 实验现象/ u- M6 {6 B* h
系统启动后用 getprop fengke.test 来看是否这个值已经写入1 L F$ Q" `: F) z8 M" c$ r
; D, E4 t+ {5 z0 p2 r6 ]) G
* T, N% W$ l. {$ Z
图32 X) w) r9 b* h( C' F6 r+ A; c( `: h
9 p0 e! t& C Z, x+ s" t
$ W' W2 W8 g8 l! y; K5 Y% ~, L
, e7 C9 Q5 n$ t$ X$ I$ g
I3 \6 S6 r6 ?- h, {, m文件下载请点击:
1、Linux引导过程.pdf
(409.72 KB, 下载次数: 0)
4 h+ U& \- |8 }4 Y* G/ i$ d3 m
& n. s# ?% C. W9 I |
|