kernel
启动流程启动概况汇编建环境 → start_kernel → rest_init 拆线程 →initcall 探驱动→ mount root → exec init。详细流程阶段一汇编入口 head.Suboot跳进内核后执行的第一段内核代码。内核真实入口primary_entry头部_head最先调用primary_entry。primary_entry ├─ preserve_boot_args //先确定启动参数。比如x0fdt物理地址dtb地址 ├─ init_kernel_el // 进入合适的 Exception Level权限等级内核是el1 ├─ set_cpu_boot_mode_flag ├─ __create_page_tables // 建立初始页表identity kernel map ├─ __cpu_setup // [proc.S] 为开 MMU 做准备 └─ __primary_switch ├─ __enable_mmu //开MMU给cpu虚拟地址使用 └─ __primary_switched 搭建c环境 ├─ 设栈、VBAR、FDT 物理地址交给 C 全局变量挂fdt ├─ 清 BSS ├─ early_fdt_map(x21) └─ b start_kernel // 进入 C阶段二start_kernel 主函数内核的第一个c函数把裸硬件页表变成了可调度的操作系统。执行顺序asmlinkage __visible void __init start_kernel(void) { local_irq_disable(); boot_cpu_init(); pr_notice(%s, linux_banner); // 打印功能串口首次进linux内核 setup_arch(command_line); // 解析 FDTmemblock初始化等 setup_command_line(command_line); // 保存到 saved_command_line parse_early_param(); build_all_zonelists(NULL); page_alloc_init(); mm_init(); sched_init(); init_IRQ(); time_init(); local_irq_enable(); // 首次真正打开中断 console_init(); // printk 控制台可用 ... /* vfs / proc / cgroup 等大量子系统 */ arch_call_rest_init(); // rest_init()本函数实质结束 }其中setup_arch比较复杂应该是解析板级信息后续再拓展吧。主要完成以下功能读 FDT含/chosen/bootargs— 拿到串口、root 等命令行认内存 — 知道 DDR 有多大、哪些能用展开设备树 — 以后驱动才能按节点找硬件摸清 CPU/电源 — 几个核、怎么通过 PSCI/ATF 管它们。rest_init 与 kernel_initrest_init — 启动模型的「分水岭」noinline void __ref rest_init(void) { pid kernel_thread(kernel_init, NULL, CLONE_FS); // → pid 1 候选 pid kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES); complete(kthreadd_done); schedule_preempt_disabled(); cpu_startup_entry(CPUHP_ONLINE); // 当前线程 → idle永不回到 start_kernel }start_kernel结束同时创建kernel_init,kthreadd线程start_kernel变空闲kernel_init挂文件系统等。后续真正的继续启动再kernel_init完成kernel_init → kernel_init_freeablestatic int __ref kernel_init(void *unused) { kernel_init_freeable(); // 含 SMP、initcalls、挂 rootfs free_initmem(); // 释放 __init 段 system_state SYSTEM_RUNNING; /* 下面尝试 exec 用户态 init */ ... }static void __init kernel_init_freeable(void) { wait_for_completion(kthreadd_done); smp_init(); sched_init_smp(); do_basic_setup(); // ★ 驱动initcall console_on_rootfs(); ... if (init_eaccess(ramdisk_execute_command) ! 0) { ramdisk_execute_command NULL; prepare_namespace(); // ★ 挂rootfs } }do_basic_setup()基础环境没问题了开始在这一步装驱动跑各种子系统的初始化大致流程如下static void __init do_basic_setup(void) { cpuset_init_smp(); driver_init(); //驱动模型bus/class就绪 init_irq_proc(); do_ctors(); usermodehelper_enable(); do_initcalls(); //启用板子上的设备emmc显示摄像头等 }do_initcalls按固定顺序把内核编译时登记好的一大串「开机初始化函数」挨个执行一遍。static void __init do_initcalls(void) { for (level 0; level ...; level) do_initcall_level(level, command_line); } static void __init do_initcall_level(int level, char *command_line) { parse_args(...); // 本级别相关的内核参数 for (fn initcall_levels[level]; fn initcall_levels[level1]; fn) do_one_initcall(...); // ★ 逐个调用 xxx_init() }拓展怎么和DTS接上的首先level级别分类early → pure(0) → core(1) → postcore(2) → arch(3→ subsys(4) → fs(5) → device(6) → late(7)。分两步在do_initcalls接上启动早期setup_arch .dtb ──unflatten──► device_node 树 只是数据没人去操作硬件 do_initcalls ① arch 级 遍历 nodestatus!disabled ──populate──► platform_device 挂到 platform 总线 还在「等人认领」没 probe- do_initcalls ② device 级 foo_init → platform_driver_register 总线比对 compatible 命中 → foo_driver.probe(dev) 这时才 ioremap / 申请中断 / 注册 /dev/...① 负责「造出设备对象」② 负责「谁来操作这类硬件」。顺序靠 initcall 级别保证populate 在 arch多数驱动在 device。compatible就是匹配钥匙一边在 DTScompatible rockchip,rk3568-dw-mshc; status okay;一边在驱动static const struct of_device_id foo_of_match[] { { .compatible rockchip,rk3568-dw-mshc }, { /* sentinel */ } }; static struct platform_driver foo_driver { .probe foo_probe, .driver { .of_match_table foo_of_match, }, };阶段三挂载 rootfsprepare_namespacevoid __init prepare_namespace(void) { if (root_delay) ssleep(root_delay); wait_for_device_probe(); // 等 eMMC 等设备 probe if (saved_root_name[0]) { ROOT_DEV name_to_dev_t(saved_root_name); // 解析 root ... } if (initrd_load()) goto out; if ((ROOT_DEV 0) root_wait) { // rootwait while (... name_to_dev_t(saved_root_name) 0) msleep(5); } mount_root(); out: devtmpfs_mount(); init_mount(., /, NULL, MS_MOVE, NULL); init_chroot(.); }root 参数__setup(root, root_dev_setup); // → saved_root_namemount_rootvoid __init mount_root(void) { create_dev(/dev/root, ROOT_DEV); mount_block_root(/dev/root, root_mountflags); // 通常 ext4 }常见挂载失败VFS: Cannot open root deviceUUID 错、分区名错Waiting for root device缺rootwait或 eMMC 驱动未起Kernel panic - not syncing: VFS镜像坏 /rootfstype不匹配。阶段四启动 init 进程启动顺序概况static int __ref kernel_init(void *unused) { kernel_init_freeable(); free_initmem(); system_state SYSTEM_RUNNING; if (ramdisk_execute_command) run_init_process(ramdisk_execute_command); if (execute_command) // init 内核参数 run_init_process(execute_command); if (CONFIG_DEFAULT_INIT[0]) run_init_process(CONFIG_DEFAULT_INIT); try_to_run_init_process(/sbin/init); // ★ Buildroot 默认 try_to_run_init_process(/etc/init); try_to_run_init_process(/bin/init); try_to_run_init_process(/bin/sh); panic(No working init found...); }run_init_processstatic int run_init_process(const char *init_filename) { pr_info(Run %s as init process\n, init_filename); return kernel_execve(init_filename, argv_init, envp_init); }串口可以看到Run /sbin/init as init process。此后进入buildroot。

相关新闻

ISO9001认证全流程详解|从0到拿证避坑指南,企业必看

ISO9001认证全流程详解|从0到拿证避坑指南,企业必看

ISO9001认证全流程详解|从0到拿证避坑指南,企业必看不管是制造业、服务业,还是软件科技公司,ISO9001质量管理体系认证都是企业的“刚需资质”。客户验厂、招投标准入、供应商入库、企业评优,几乎所有商业合作场景&…

2026/7/22 20:20:28 阅读更多 →
佳能TS6120TS6180TS9180G1810G2810TS8080打印机清零软件,服务请求废墨收集器已满解决方法。支持代码5B00,5B02,5B04,1700,1702,P07,E08,亲测。

佳能TS6120TS6180TS9180G1810G2810TS8080打印机清零软件,服务请求废墨收集器已满解决方法。支持代码5B00,5B02,5B04,1700,1702,P07,E08,亲测。

蓝奏云:点这里下载 密码:00 百度云:点这里下载 备用:pan.baidu.com/s/1gls2G4rqWWP-Mw-z6tVjnQ?pwd0000 常见型号如下: G1000、G1100、G1200、G1400、G1500、G1800、G1900、G1010、G1110、G1120、G1410、G1420、G1411、G151…

2026/7/22 20:20:28 阅读更多 →
AI直播成本骤降70%?广州裕富科技智播系统与四大智能体深度评测

AI直播成本骤降70%?广州裕富科技智播系统与四大智能体深度评测

一、行业痛点:传统直播的人力成本与效率困局 在品牌行业发展企业纷纷转型线上直播带货的今天,一条隐形的成本枷锁正牢牢套住众多中小型企业发展公司的脖子——高昂的人工支出与有限的可直播时长。以一个日均直播12小时的品牌方为例,雇佣两名主…

2026/7/22 20:20:28 阅读更多 →

最新新闻

AWS DevOps Essentials项目清理与资源优化指南

AWS DevOps Essentials项目清理与资源优化指南

AWS DevOps Essentials项目清理与资源优化指南 【免费下载链接】aws-devops-essential In few hours, quickly learn how to effectively leverage various AWS services to improve developer productivity and reduce the overall time to market for new product capabiliti…

2026/7/22 21:02:43 阅读更多 →
10分钟上手evosax:从安装到运行第一个进化算法的完整教程

10分钟上手evosax:从安装到运行第一个进化算法的完整教程

10分钟上手evosax:从安装到运行第一个进化算法的完整教程 【免费下载链接】evosax Evolution Strategies in JAX 🦎 项目地址: https://gitcode.com/gh_mirrors/ev/evosax evosax是一个基于JAX构建的进化策略库,它提供了高效、灵活的工…

2026/7/22 21:02:43 阅读更多 →
具身交互 Audiobook AI 朗读平台: TTS 落地开发实践

具身交互 Audiobook AI 朗读平台: TTS 落地开发实践

摘要 本文基于魔珐星云全域具身交互智能配套 TTS 引擎搭建一体化有声书朗读平台。该平台采用React 18 TypeScript Vite构建前端应用,通过WebSocket实时接收TTS音频流,实现了书籍内容的点击即播、文字实时高亮、多音色切换等核心功能。文章将从平台配置…

2026/7/22 21:02:43 阅读更多 →
深入解析N2HET四大核心指令:SCMP、SCNT、SHFT与WCAP在嵌入式实时控制中的应用

深入解析N2HET四大核心指令:SCMP、SCNT、SHFT与WCAP在嵌入式实时控制中的应用

1. N2HET模块:嵌入式实时控制的精密引擎在电机控制、数字电源或者任何需要高精度时序与复杂波形生成的嵌入式系统里,CPU直接处理每一个脉冲边沿、每一次捕获事件往往是力不从心的。这不仅会消耗大量计算资源,更会引入难以预测的延迟&#xff…

2026/7/22 21:02:43 阅读更多 →
DCAN模块Message RAM寻址机制与消息对象配置实战解析

DCAN模块Message RAM寻址机制与消息对象配置实战解析

1. DCAN模块Message RAM寻址机制深度解析在嵌入式系统,尤其是汽车电子和工业控制领域,控制器局域网(CAN)总线是连接各个电子控制单元(ECU)的神经系统。德州仪器(TI)的DCAN模块作为一…

2026/7/22 21:02:43 阅读更多 →
Linux系统警报:Hi, My Name is Keyboard攻击原理与防御措施

Linux系统警报:Hi, My Name is Keyboard攻击原理与防御措施

Linux系统警报:Hi, My Name is Keyboard攻击原理与防御措施 【免费下载链接】hi_my_name_is_keyboard 项目地址: https://gitcode.com/gh_mirrors/hi/hi_my_name_is_keyboard Hi, My Name is Keyboard是一系列针对蓝牙键盘的安全漏洞利用工具,可…

2026/7/22 21:01:43 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统,尤其是像TI C6000系列这样的高性能DSP开发中,我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动,但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案? 在数字化协作环境中,消息通知系统的重要性不言而喻明。但现实情况是,企业级通知方案往往需要复杂的API对接(如企业微信、钉钉、飞书),个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点",乙方听到的是"少做几页"。甲方说"不要太复杂",乙方理解成"别放图表了"。结果交过去,甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里,是…

2026/7/22 0:00:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻