找回密码
 注册
关于网站域名变更的通知
查看: 132|回复: 0
打印 上一主题 下一主题

【嵌入式开发教程1】疯壳·平板电脑-Linux 引导过程

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-7-27 14:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-8 17:35 , Processed in 0.156250 second(s), 28 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表