From bb8fab29da9e5ae85adf548206c7edaf2684c125 Mon Sep 17 00:00:00 2001 From: shzhxh Date: Tue, 17 Sep 2019 17:02:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0Linux=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E8=BF=87=E7=A8=8B=E5=92=8COpenthos=E5=90=AF=E5=8A=A8=E8=BF=87?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../国际化与本地化机制.md | 2 ++ OS/Linux/启动过程.md | 25 ++++++++++++++++--- OS/Openthos/启动过程.md | 8 +++--- Software/builtin命令/popd.md | 7 ++++++ Software/builtin命令/pushd.md | 8 ++++++ Software/文本转换/printf.md | 6 +++++ 6 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 OS/Linux/专题分析/国际化与本地化机制.md create mode 100644 Software/builtin命令/popd.md create mode 100644 Software/builtin命令/pushd.md diff --git a/OS/Linux/专题分析/国际化与本地化机制.md b/OS/Linux/专题分析/国际化与本地化机制.md new file mode 100644 index 0000000..1c1f2f2 --- /dev/null +++ b/OS/Linux/专题分析/国际化与本地化机制.md @@ -0,0 +1,2 @@ +[浅析 Linux 的国际化与本地化机制](https://www.ibm.com/developerworks/cn/linux/l-cn-linuxglb/index.html) + diff --git a/OS/Linux/启动过程.md b/OS/Linux/启动过程.md index 576b786..8fcb098 100644 --- a/OS/Linux/启动过程.md +++ b/OS/Linux/启动过程.md @@ -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进程。 +``` + + + diff --git a/OS/Openthos/启动过程.md b/OS/Openthos/启动过程.md index 62a5449..fb41c57 100644 --- a/OS/Openthos/启动过程.md +++ b/OS/Openthos/启动过程.md @@ -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用于处理其它的一些属性。 diff --git a/Software/builtin命令/popd.md b/Software/builtin命令/popd.md new file mode 100644 index 0000000..d4eeb1e --- /dev/null +++ b/Software/builtin命令/popd.md @@ -0,0 +1,7 @@ +``` +popd # 删除目录栈中的某个目录;如果不加任何参数,则删除栈顶的目录,并切换到新栈顶所指的目录。 + # -n参数只删除栈顶的目录,而不切换目录 + # +N则会删除第N个目录(从左边数起,从0开始) + # -N则会删除第N个目录(从右边数起,从0开始) +``` + diff --git a/Software/builtin命令/pushd.md b/Software/builtin命令/pushd.md new file mode 100644 index 0000000..2536c4f --- /dev/null +++ b/Software/builtin命令/pushd.md @@ -0,0 +1,8 @@ +``` +pushd [dir] # 指定目录栈的栈顶,并切换到栈顶所指的目录;如果不加任何参数,则交换最顶端两个参数的位置。 + # -n参数只将目录加入栈中,而不切换目录 + # +N则会把第N个目录加入栈顶(从左边数起,从0开始) + # -N则会把第N个目录加入栈顶(从右边数起,从0开始) + # dir参数用于将dir加到栈顶并切换到dir +``` + diff --git a/Software/文本转换/printf.md b/Software/文本转换/printf.md index a76dcd6..3641706 100644 --- a/Software/文本转换/printf.md +++ b/Software/文本转换/printf.md @@ -2,3 +2,9 @@ printf [arguments] # 打印格式化数据format,arguments是format里的参数 ``` +#### 示例 + +``` +printf "%s\n" $PWD # 打印出当前路径 +``` +