|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Linux 引导过程 8 y) J# n: X0 _- G( M) @
+ u5 o6 u8 `% i7 Z
4 y6 h( Q6 J2 K9 Q$ n* x Linux 内核与 Android 系统 linux 内核有什么区别?
Y$ a$ z& n2 W: I( a 什么是引导装载程序?
/ k$ ^9 a/ d1 X2 S4 N) E 什么是 Zygote?
. u$ U+ ?. _6 A$ `9 u* c. N. P 什么是 init.rc?" f2 y F6 k0 e7 N* l* `: s1 `* r
什么是系统服务?
# l2 |. v: m2 M8 t, U+ O |# H. J+ W. T4 X- J$ S
第一节 Android 启动步骤
& b$ g& ~# K* p9 C& ^. w3 |( K
% @4 p7 b( h, ] [0 o9 m
5 N4 e. D7 U' m3 J* g图1" S9 }# ^* y! o# ~+ b* _
7 ^1 d$ l' v! l2 m5 ]2 r! D% @2 C0 @5 @$ F, {
第二节 引导程序 --- Boot Loader) t% I" @/ e) s5 \$ y
源代码目录:$(dir)\rk3128-source\u-boot
: g' @6 r1 X d; W' \$ S
; ?# d! ?& ^9 ?6 t0 K% T' c
4 e z6 V4 {$ w0 H! c) d8 |- g8 F6 i0 L7 o- I
第三节 内核 --- Kernel
8 [& V( z1 R2 y+ Z& i% Q# ~ Android 内核就是 Linux。内核启动时,设置硬件,挂载文件系统,执行第一个应用程序init。$ V6 N, M" v& r! ^2 l$ J. r ]
5 _. x. z. }' [% r5 j1 m
/ A' E% h& [, y; K1 U1 _( a4 }3 t& G; {( \
第四节 Init 进程
D6 V( q, h9 r, v init 是第一个进程,可以说它是 root 进程或者所有进程的父进程。init 进程有两个责任, 一是挂载目录,比如/sys、/dev、/proc,二是运行 init.rc 脚本。对于 init.rc 文件,Android 中有特定的格式以及规则。在 Android 中,我们叫做 Android 初始化语言。
5 I P! t2 i4 L( E* N6 M init.rc 位于目录$(dir)\rk3128-source\device\rockchip\rksdk
7 M$ [( q1 |+ h. \ Android 初始化语言由四大类型的声明组成,即 Actions(动作)、Commands(命令)、Services(服务)、以及 Options(选项)。
# P9 G8 B' C) }$ c: g. b; I Action(动作):动作是以命令流程命名的,有一个触发器决定动作是否发生。) E ]4 a- I4 L$ i0 [- @# s
语法:
. u* _) L- Q7 D* e on <trigger>
- ]6 q3 b" K" F
1 P$ n9 Q; ?' N- G; k <command>
* @ a/ Y3 v" u4 E* X; M0 `7 I2 k2 R
<command>8 R9 _0 D a' M& x4 i4 w
: Z" w/ i! H, S4 p. J8 _ <command>" p# R, Z" A8 X# Z X6 e" O
8 G% f \# X2 R* t5 ` Service 是 init 加载的和是退出重启的(可选)程序。Service 具有如下格式:
2 r+ z' L: l/ Q service <name> <pathname> [ <argument> ]*
* ?. D) Z- {% }2 v% Z V
3 U9 t5 {" m* i1 m+ V! N <option>! I5 B3 C3 b# H5 b& x
: i$ J7 b d n" R$ B O( Y <option>
6 N! {+ C+ ~3 C, F* Z2 Y4 w
- d- G$ m- K, Y3 N2 ^ ...
& u. [, `, i: X7 c Options(选项); ?0 c H6 [9 n5 R" k: P
选项是对服务的描述,它们影响 init 进程如何以及何时启动服务。( r" x4 v$ Z3 H' a$ x' D" S
来看看默认的 init.rc 文件。这里只列出了主要的事件以及服务。
[( N4 P. V8 J( Q: j, [Table
; h/ O$ V4 @) Y) b
. u4 \+ i4 f$ o, j
. K0 H) K2 e9 Z, v r6 j! p" f
图2& W, [. I( {% W
在这个阶段你可以在设备的屏幕上看到“android”logo 了。& S; s# {8 x' b7 y- V; X# a
4 o- i0 X) ^ ?: Q( _& `
' A6 H) {9 n- }% [) ?/ T0 K' i; X第五节 Zygote
- ^5 h! M. _2 N1 V' x2 p |! N 在 Java 中,不同的虚拟机实例会为不同的应用分配不同的内存。但如果 Android 系统为每一个应用启动不同的 Dalvik 虚拟机实例,就会消耗大量的内存以及时间。因此,为了克服这个问题,Android 系统创造了”Zygote”,Zygote 让 Dalvik 虚拟机共享代码、低内存占用以及最小的启动时间成为可能。
# \; H+ |7 i! [6 e9 @9 c2 y a' ~+ J. g, ^
- r& i1 `6 M3 m8 p7 c2 c, N
第六节 系统服务或服务! ?% r. |$ d7 s7 r- b0 C
完成了上面几步之后,运行环境请求 Zygote 运行系统服务。系统服务同时使用 native以及 java 编写,系统服务可以认为是一个进程,系统服务包含了所有的 System Services。- H5 r) G2 ]- u" Z/ Z
Zygote 创建新的进程去启动系统服务,可以在 ZygoteInit 类的”startSystemServer”方法$ S+ g2 n4 X k1 N
中找到源代码。
5 ~4 p+ P, \# U9 j6 J# ?) i
& `/ ]3 S! `5 S1 M5 v0 l2 _6 F
第七节 引导完成
- j0 ^3 A2 c0 M- _. F; U# C1 J 一旦系统服务在内存中跑起来了, Android 就完成了引导过程。 在这个时候“ACTION_BOOT_COMPLETED”开机启动广播就会发出去。) R. Z% Q6 P- l- h
6 M5 u7 ^1 U2 L/ h9 R1 ^
/ Z/ k/ t) S3 c% V+ F1 H
第八节 实验
& T9 w' Y; A2 m- v init.rc 中增加一条启动参数 setprop fengke.test 100
6 z' G: W+ i9 ]6 ]0 ]) H3 o
6 m3 c0 Z2 p( }" {4 T/ e2 K
: i# V# T# }. K7 A6 r第九节 实验现象& i3 S" H" P, `3 x0 t; ^
系统启动后用 getprop fengke.test 来看是否这个值已经写入; w9 T5 A6 C9 p9 P
" l K. W/ \1 d( g2 i
- O6 C+ Q6 ^0 G$ G9 X% q) J9 n图38 s/ ]8 p D" O6 y L, l! D
/ x! Y5 Z! {# V6 }9 @, S
, u: `: p8 E3 Q' ]7 F2 r; k% l. @
; B1 D& g) z4 m+ u$ F9 y; }& a6 [
- K _5 I( w+ p: J0 G' A. B* x- c文件下载请点击:
1、Linux引导过程.pdf
(409.72 KB, 下载次数: 0)
6 y: L# \2 A1 f, p, ^/ E, _- L
9 x3 c8 I) r N |
|