1. OpenHarmony标准系统内核启动流程解析
作为一名长期从事嵌入式系统开发的工程师,今天我想和大家深入探讨OpenHarmony标准系统在RK3568开发板上的内核启动全流程。这个启动过程涉及从Linux内核初始化到OpenHarmony用户态服务的完整链路,是理解整个系统运作机制的关键。
1.1 内核启动入口:start_kernel()
所有Linux系内核的启动都始于start_kernel()函数,这个位于init/main.c的函数是内核初始化的总控中心。在OpenHarmony的适配中,这个函数经过了一些定制化修改:
c复制asmlinkage __visible void __init __no_sanitize_address start_kernel(void)
{
//...各种子系统初始化...
arch_call_rest_init(); //系统初始化和服务启动
}
这里的关键在于arch_call_rest_init()的调用,它最终会触发rest_init()函数。这个设计采用了弱符号(weak symbol)机制,允许不同架构进行定制化实现,体现了Linux内核良好的扩展性设计。
经验提示:在实际调试时,可以在start_kernel()开始处添加early_printk()输出,这对早期启动问题的定位非常有帮助。
1.2 关键进程创建:rest_init()
rest_init()是内核初始化阶段的"临门一脚",它完成了三个重要使命:
c复制noinline void __ref rest_init(void)
{
// 1. 创建kernel_init进程(PID=1)
pid = kernel_thread(kernel_init, NULL, CLONE_FS);
// 2. 创建kthreadd进程(PID=2)
pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
// 3. 启动空闲任务
cpu_startup_entry(CPUHP_ONLINE);
}
这里有几个关键点需要注意:
1
