add OS/opensbi.md, update OS/Android/启动过程.md
This commit is contained in:
parent
b1246eeda5
commit
7c9fd09af2
|
@ -158,11 +158,23 @@ init是第一个进程,也叫root进程或所有进程的父进程。在此阶
|
|||
|
||||
bootmode是个全局静态变量,用来标示启动模式,android的启动模式分为正常开机流程和关机充电流程。
|
||||
|
||||
init_parse_config_file用于解析rc配置文件。
|
||||
3. 触发所有的事件并不断监听新的事件
|
||||
|
||||
action_for_each_trigger遍历从rc文件得到的action_list链表,将满足触发器的动作添加到action_queue中。一个action结构体包含4个链表,一个是所有动作的链表,一个是执行队列中动作的链表,一个是触发器对应的动作的链表,一个是命令的链表。
|
||||
之前的工作是建立各种各样的事件,并没有去触发。只有在本while循环里才真正的触发所有的事件,并用epoll不断监听新的事件。
|
||||
|
||||
在事件循环里接收SIGCHLD信号,进而通过handle_signal执行wait_for_process函数,完成进程资源回收或进程重启工作。
|
||||
如要执行关机命令,则通过`HandlePowerctlMessage()`来执行之。
|
||||
|
||||
当没有属性设置且没有Server开始运行时,才通过`am.ExecuteOneCommand()`从current_executing_actions\_列表里执行一个command,由于外部是一个无限循环,所以current_executing_actions\_列表里的每个command都会执行一遍。这样的条件设定是为了保证属性设置和Server启动的完整性。
|
||||
|
||||
当没有属性设置且没有Server开始运行时:
|
||||
|
||||
- 如系统不是正在关机,执行`restart_processes()`来判断当前Server是否需要重启,如需重启则执行重启操作。
|
||||
- 如有进程需要重启,设置`epoll_timeout_ms`的值
|
||||
- 如有其它command需要执行,则将`epoll_timeout_ms`设置为0以立即唤醒。
|
||||
|
||||
`epoll_wait`用于监听事件的产生,参数`epoll_fd`是由前面的`epoll_create1()`创建的epoll的文件描述符,参数`ev`用于保存事件信息,参数`epoll_timeout_ms`是等待时间
|
||||
|
||||
如未监听到事件,则向log系统添加一条监听失败的信息;如监听到事件,则直接执行`ev.data.ptr()`(即epoll_ctl注册时的回调函数)。
|
||||
|
||||
#### step5: Zygote
|
||||
|
||||
|
@ -186,7 +198,7 @@ Zygote启动系统服务,即ZygoteInit类里的startSystemServer方法。
|
|||
|
||||
由五类语句构成:Actions, Commands, Services, Options and Imports。
|
||||
|
||||
从整体来看,一个rc文件是由若干个段组成的。一个段有如下两种结构:
|
||||
从整体来看,一个rc文件是由若干个段组成的。一个段只能是Actions或Server其中之一:
|
||||
|
||||
- Actions,其中Commands和trigger是对Actions的补充。
|
||||
- Servers,其中Options是对Servers的补充。
|
||||
|
@ -209,6 +221,8 @@ on <trigger> [&& <trigger>]*
|
|||
<command>
|
||||
```
|
||||
|
||||
以on开头,后面的trigger是判断条件(详见[Triggers](#triggers)),command是具体要执行的操作。
|
||||
|
||||
##### Services
|
||||
|
||||
Services是程序,它由init进程启动,并且可以退出后重启(可选)。
|
||||
|
@ -221,6 +235,8 @@ service <name> <pathname> [<argument> ]*
|
|||
<option>
|
||||
```
|
||||
|
||||
name是程序名,pathname是程序所在的路径,argument是程序的参数,option是服务配置(详见[Options](#options))。
|
||||
|
||||
##### Options
|
||||
|
||||
Options是Services的修改器,它们影响init进程如何运行service以及何时运行service。
|
||||
|
@ -236,7 +252,7 @@ Options是Services的修改器,它们影响init进程如何运行service以及
|
|||
- capabilities,在执行服务的时候设置capabilities.
|
||||
- seclabel,在执行服务前改变为seclabel。
|
||||
- oneshot,当服务退出后不要重启它。
|
||||
- class,为服务指定类名。
|
||||
- class,为服务指定所属的类。在同一个类里的服务可以同时打开或关闭。如不使用此选项明确指定服务所属的类,则默认在default类里。我
|
||||
- animation,将会包含所有启动和关闭animation所必须的服务。
|
||||
- onrestart当服务重启的时候执行一条命令。
|
||||
- writepid,当子进程forks的时候将其pid写到给定文件中。
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
#### OpenSBI库
|
||||
|
||||
OpenSBI提供了两种静态链接库:
|
||||
|
||||
1. libsbi.a - 平台无关,实现了SBI规范的接口,由于不包含平台相关的部分,所以必须实现与平台相关的钩子且链接到本库里。
|
||||
2. libplatsbi.a - 即包括了libsbi.a,也包括了平台相关的钩子。
|
||||
|
||||
#### 平台支持
|
||||
|
||||
平台支持是通过数据结构`sbi_platform`来实现的。
|
Loading…
Reference in New Issue