更新Linux启动过程和Openthos启动过程
This commit is contained in:
parent
c5d894a090
commit
bb8fab29da
|
@ -0,0 +1,2 @@
|
|||
[浅析 Linux 的国际化与本地化机制](https://www.ibm.com/developerworks/cn/linux/l-cn-linuxglb/index.html)
|
||||
|
|
@ -127,17 +127,36 @@ MBR
|
|||
|
||||
##### 3.3 rest_init
|
||||
|
||||
rest_init函数主要用于启动三个核心的进程:idle, kernel_init, kthreadd。
|
||||
|
||||
```
|
||||
rcu_scheduler_starting() # 启动rcu机制,与rcu_read_lock和rcu_read_unlock配套使用,用于多核同步
|
||||
kernel_thread(kernel_init, NULL, CLONE_FS); # 启动1号进程
|
||||
kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES); # 启动2号进程,它是内核的守护进程
|
||||
cpu_startup_entry(CPUHP_ONLINE); # 启动idle进程
|
||||
```
|
||||
|
||||
|
||||
|
||||
##### 3.4 kernel_init
|
||||
|
||||
##### 3.5 run_init_process
|
||||
即1号进程init进程的启动过程
|
||||
|
||||
```
|
||||
# 调用run_init_process执行/sbin/init等程序
|
||||
# run_init_process调用do_execve
|
||||
# do_execve调用do_execveat_common
|
||||
# do_execveat_common调用__do_execve_file
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### step4: init进程
|
||||
|
||||
用户空间的第一个进程
|
||||
|
||||
```
|
||||
# 1. init进程刚开始运行在内核态,它通过execv函数强行把自己转成了用户态。为此它就需要挂载文件系统并找到用户态下的那个init程序。
|
||||
# 2. init进程转到用户态后,启动了login进程、命令行进程、shell进程。
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
|
||||
- init/main.c : run_init_process
|
||||
|
||||
执行`kernel_execve`函数,转到用户态执行init进程。
|
||||
init进程分两个阶段,第一阶段在内核态,通过执行`kernel_execve`函数强行转到用户态,第二阶段在用户态继续执行。
|
||||
|
||||
#### step4: init process
|
||||
|
||||
|
@ -36,7 +36,7 @@ init是第一个进程,也叫root进程或所有进程的父进程。在此阶
|
|||
|
||||
1. 挂载目录,比如/sys, /dev, /porc。
|
||||
|
||||
2. 运行init.rc脚本。脚本语言的介绍详见system/core/init/README.md。
|
||||
2. 运行init.rc脚本,这会创建系统中的几个关键进程,包括java世界的开创者zygote进程也是在这里创建的。脚本语言的介绍详见system/core/init/README.md。
|
||||
|
||||
3. 作为守护进程。
|
||||
|
||||
|
@ -48,7 +48,7 @@ init是第一个进程,也叫root进程或所有进程的父进程。在此阶
|
|||
|
||||
##### init进程第一阶段
|
||||
|
||||
1. 依据第一个参数的跳转与环境变量设置
|
||||
1. 依据第一个参数进行跳转,并设置环境变量
|
||||
|
||||
如果第1个参数是ueventd,则执行`ueventd_main`,进行设备节点的创建和权限设定。
|
||||
|
||||
|
@ -108,6 +108,8 @@ init是第一个进程,也叫root进程或所有进程的父进程。在此阶
|
|||
|
||||
property_init用于初始化属性系统,并从指定文件读取属性。
|
||||
|
||||
> property_init调用__system_property_area_init实现其功能。
|
||||
|
||||
process_kernel_dt和process_kernel_cmdline分别处理dt(设备树)和命令行属性,设备树中参数的优先级总是高于命令行。
|
||||
|
||||
export_kernel_boot_props用于处理其它的一些属性。
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
```
|
||||
popd # 删除目录栈中的某个目录;如果不加任何参数,则删除栈顶的目录,并切换到新栈顶所指的目录。
|
||||
# -n参数只删除栈顶的目录,而不切换目录
|
||||
# +N则会删除第N个目录(从左边数起,从0开始)
|
||||
# -N则会删除第N个目录(从右边数起,从0开始)
|
||||
```
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
```
|
||||
pushd [dir] # 指定目录栈的栈顶,并切换到栈顶所指的目录;如果不加任何参数,则交换最顶端两个参数的位置。
|
||||
# -n参数只将目录加入栈中,而不切换目录
|
||||
# +N则会把第N个目录加入栈顶(从左边数起,从0开始)
|
||||
# -N则会把第N个目录加入栈顶(从右边数起,从0开始)
|
||||
# dir参数用于将dir加到栈顶并切换到dir
|
||||
```
|
||||
|
|
@ -2,3 +2,9 @@
|
|||
printf <format> [arguments] # 打印格式化数据format,arguments是format里的参数
|
||||
```
|
||||
|
||||
#### 示例
|
||||
|
||||
```
|
||||
printf "%s\n" $PWD # 打印出当前路径
|
||||
```
|
||||
|
||||
|
|
Loading…
Reference in New Issue