kernel-small-start-user.md 1.7 KB
Newer Older
D
duangavin123 已提交
1
# 用户态启动
D
duangavin123 已提交
2 3


D
duangavin123 已提交
4
## 用户态根进程启动
D
duangavin123 已提交
5 6 7

根进程是系统第一个用户态进程,进程ID为1,它是所有用户态进程的祖先。

D
duangavin123 已提交
8 9 10
  **图1** 进程树示意图

  ![zh-cn_image_0000001178108019](figures/zh-cn_image_0000001178108019.png)
D
duangavin123 已提交
11

D
duangavin123 已提交
12

D
duangavin123 已提交
13
### 根进程的启动过程
D
duangavin123 已提交
14 15 16

使用链接脚本将如下init启动代码放置到系统镜像指定位置。

D
duangavin123 已提交
17

18
```c
D
duangavin123 已提交
19 20 21 22 23 24 25 26 27 28 29
#define LITE_USER_SEC_ENTRY   __attribute__((section(".user.entry")))
LITE_USER_SEC_ENTRY VOID OsUserInit(VOID *args)
{
#ifdef LOSCFG_KERNEL_DYNLOAD
    sys_call3(__NR_execve, (UINTPTR)g_initPath, 0, 0);
#endif
    while (true) {
    }
}
```

30 31
> 上述启动代码在 kernel/liteos_a/kernel/user/src/los_user_init.c 中,g_initPath 根据启动设置的不同,其值为 /dev/shm/init 或 /bin/init。

D
duangavin123 已提交
32 33
系统启动阶段,OsUserInitProcess启动init进程。具体过程如下:

D
duangavin123 已提交
34
1. 由内核OsLoadUserInit加载上述代码。
D
duangavin123 已提交
35

D
duangavin123 已提交
36
2. 创建新的进程空间,启动/bin/init进程。
D
duangavin123 已提交
37 38


D
duangavin123 已提交
39
### 根进程的职责
D
duangavin123 已提交
40

D
duangavin123 已提交
41 42
- 启动关键系统程序或服务,如交互进程shell。
  > ![icon-note.gif](public_sys-resources/icon-note.gif) **说明:**
D
duangavin123 已提交
43
  > 在OpenHarmony 中**init**进程通过读取/etc/init.cfg,根据配置执行指定命令,或启动指定进程(详见:[init启动引导](../subsystems/subsys-boot-init-cfg.md))。
D
duangavin123 已提交
44

D
duangavin123 已提交
45
- 监控回收孤儿进程,清理子进程中的僵尸进程。
D
duangavin123 已提交
46 47


D
duangavin123 已提交
48
## 用户态程序运行
D
duangavin123 已提交
49 50 51

用户态程序启动有如下常见方式:

D
duangavin123 已提交
52
- shell命令启动进程。
53

D
duangavin123 已提交
54 55 56 57 58
  ```
  OHOS $ exec helloworld
  OHOS $ ./helloworld
  OHOS $ /bin/helloworld
  ```
D
duangavin123 已提交
59

D
duangavin123 已提交
60 61
- 通过POSIX接口启动新进程。
  Fork方法创建一个新的进程,exec类接口执行一个全新的进程。