更新Linux启动过程和Openthos启动过程

This commit is contained in:
shzhxh 2019-09-17 17:02:56 +08:00
parent c5d894a090
commit bb8fab29da
6 changed files with 50 additions and 6 deletions

View File

@ -0,0 +1,2 @@
[浅析 Linux 的国际化与本地化机制](https://www.ibm.com/developerworks/cn/linux/l-cn-linuxglb/index.html)

View File

@ -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进程。
```

View File

@ -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用于处理其它的一些属性。

View File

@ -0,0 +1,7 @@
```
popd # 删除目录栈中的某个目录;如果不加任何参数,则删除栈顶的目录,并切换到新栈顶所指的目录。
# -n参数只删除栈顶的目录而不切换目录
# +N则会删除第N个目录(从左边数起从0开始)
# -N则会删除第N个目录(从右边数起从0开始)
```

View File

@ -0,0 +1,8 @@
```
pushd [dir] # 指定目录栈的栈顶,并切换到栈顶所指的目录;如果不加任何参数,则交换最顶端两个参数的位置。
# -n参数只将目录加入栈中而不切换目录
# +N则会把第N个目录加入栈顶(从左边数起从0开始)
# -N则会把第N个目录加入栈顶从右边数起从0开始
# dir参数用于将dir加到栈顶并切换到dir
```

View File

@ -2,3 +2,9 @@
printf <format> [arguments] # 打印格式化数据formatarguments是format里的参数
```
#### 示例
```
printf "%s\n" $PWD # 打印出当前路径
```