1# 移植启动恢复子系统
2
3
4启动恢复子系统负责在内核启动之后到应用启动之前的系统关键进程和服务的启动过程的功能。
5
6
7## 移植指导
8
9针对轻量系统主要提供了各服务和功能的启动入口标识。在SAMGR启动时,会调用bootstrap标识的入口函数,并启动系统服务。
10
11适配完成后,调用OHOS_SystemInit()接口,即可启动系统。
12
13路径:“base/startup/bootstrap_lite/services/source/system_init.c14
15
16```
17void OHOS_SystemInit(void)
18{
19    MODULE_INIT(bsp);           //执行.zinitcall.bspX.init段中的函数
20    MODULE_INIT(device);        //执行.zinitcall.deviceX.init段中的函数
21    MODULE_INIT(core);          //执行.zinitcall.coreX.init段中的函数
22    SYS_INIT(service);          //执行.zinitcall.sys.serviceX.init段中的函数
23    SYS_INIT(feature);          //执行.zinitcall.sys.featureX.init段中的函数
24    MODULE_INIT(run);           //执行.zinitcall.runX.init段中的函数
25    SAMGR_Bootstrap();          //SAMGR服务初始化
26}
27```
28
29
30## 移植实例
31
321. 在“config.json”中添加启动子系统。
33
34   路径:“vendor/MyVendorCompany/MyProduct/config.json35
36   修改如下:
37
38
39   ```
40   {
41       "subsystem": "startup",
42       "components": [
43           { "component": "bootstrap_lite", "features":[] },
44           { "component": "syspara_lite", "features":[] }
45       ]
46   },
47   ```
48
49   在startup子系统中有部分部件(如:syspara_lite等),会依赖“$ohos_product_adapter_dir/utils”中的模块。其中“ohos_product_adapter_dir”就是在config.json文件中配置的“product_adapter_dir”,我们通常配置其为“vendor/MyVendorCompany/MyProduct/hals”。
50
511. 添加zinitcall以及run定义。
52   在厂商ld链接脚本中.text段中,添加如下代码:
53
54
55   ```
56       __zinitcall_bsp_start = .;
57       KEEP (*(.zinitcall.bsp0.init))
58       KEEP (*(.zinitcall.bsp1.init))
59       KEEP (*(.zinitcall.bsp2.init))
60       KEEP (*(.zinitcall.bsp3.init))
61       KEEP (*(.zinitcall.bsp4.init))
62       __zinitcall_bsp_end = .;
63       __zinitcall_device_start = .;
64       KEEP (*(.zinitcall.device0.init))
65       KEEP (*(.zinitcall.device1.init))
66       KEEP (*(.zinitcall.device2.init))
67       KEEP (*(.zinitcall.device3.init))
68       KEEP (*(.zinitcall.device4.init))
69       __zinitcall_device_end = .;
70       __zinitcall_core_start = .;
71       KEEP (*(.zinitcall.core0.init))
72       KEEP (*(.zinitcall.core1.init))
73       KEEP (*(.zinitcall.core2.init))
74       KEEP (*(.zinitcall.core3.init))
75       KEEP (*(.zinitcall.core4.init))
76       __zinitcall_core_end = .;
77       __zinitcall_sys_service_start = .;
78       KEEP (*(.zinitcall.sys.service0.init))
79       KEEP (*(.zinitcall.sys.service1.init))
80       KEEP (*(.zinitcall.sys.service2.init))
81       KEEP (*(.zinitcall.sys.service3.init))
82       KEEP (*(.zinitcall.sys.service4.init))
83       __zinitcall_sys_service_end = .;
84       __zinitcall_sys_feature_start = .;
85       KEEP (*(.zinitcall.sys.feature0.init))
86       KEEP (*(.zinitcall.sys.feature1.init))
87       KEEP (*(.zinitcall.sys.feature2.init))
88       KEEP (*(.zinitcall.sys.feature3.init))
89       KEEP (*(.zinitcall.sys.feature4.init))
90       __zinitcall_sys_feature_end = .;
91       __zinitcall_run_start = .;
92       KEEP (*(.zinitcall.run0.init))
93       KEEP (*(.zinitcall.run1.init))
94       KEEP (*(.zinitcall.run2.init))
95       KEEP (*(.zinitcall.run3.init))
96       KEEP (*(.zinitcall.run4.init))
97       __zinitcall_run_end = .;
98       __zinitcall_app_service_start = .;  //SAMGR执行.zinitcall.app.serviceX.init段中的函数
99       KEEP (*(.zinitcall.app.service0.init))
100       KEEP (*(.zinitcall.app.service1.init))
101       KEEP (*(.zinitcall.app.service2.init))
102       KEEP (*(.zinitcall.app.service3.init))
103       KEEP (*(.zinitcall.app.service4.init))
104       __zinitcall_app_service_end = .;
105       __zinitcall_app_feature_start = .; //SAMGR执行.zinitcall.app.featureX.init段中的函数
106       KEEP (*(.zinitcall.app.feature0.init))
107       KEEP (*(.zinitcall.app.feature1.init))
108       KEEP (*(.zinitcall.app.feature2.init))
109       KEEP (*(.zinitcall.app.feature3.init))
110       KEEP (*(.zinitcall.app.feature4.init))
111       __zinitcall_app_feature_end = .;
112       __zinitcall_test_start = .;
113       KEEP (*(.zinitcall.test0.init))
114       KEEP (*(.zinitcall.test1.init))
115       KEEP (*(.zinitcall.test2.init))
116       KEEP (*(.zinitcall.test3.init))
117       KEEP (*(.zinitcall.test4.init))
118       __zinitcall_test_end = .;
119       __zinitcall_exit_start = .;
120       KEEP (*(.zinitcall.exit0.init))
121       KEEP (*(.zinitcall.exit1.init))
122       KEEP (*(.zinitcall.exit2.init))
123       KEEP (*(.zinitcall.exit3.init))
124       KEEP (*(.zinitcall.exit4.init))
125       __zinitcall_exit_end = .;
126   ```
127
1281. 芯片SDK创建任务。
129   配置任务参数,系统启动后,启动任务,示例如下:
130
131
132   ```
133   void mainTask(void) {
134      //厂商自定义功能
135       OHOS_SystemInit();        //启动子系统初始化
136       printf("MainTask running...\n");
137   }
138
139   void main(VOID) {
140      //硬件初始化,printf输出重定向到debug串口等
141       if (LOS_KernelInit() == 0) {            //ohos内核初始化
142           task_init_param.usTaskPrio = 10;    //任务优先级
143           task_init_param.pcName = "mainTask"; //任务进程名
144           task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)mainTask; //任务入口函数
145           task_init_param.uwStackSize = 8192;          //任务栈大小
146           LOS_TaskCreate(&tid, &task_init_param);      //创建任务
147           LOS_Start();                                 //启动任务
148       }
149       else {
150           printf("[BUG] LOS_KernelInit fail\n");
151       }
152       printf("[BUG] reach to unexpected code\n");
153       while (1);
154   }
155   ```
156