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。

相关新闻

nmap-formatter实战案例:使用Graphviz(DOT)可视化网络拓扑结构

nmap-formatter实战案例:使用Graphviz(DOT)可视化网络拓扑结构

nmap-formatter实战案例:使用Graphviz(DOT)可视化网络拓扑结构 【免费下载链接】nmap-formatter A tool that allows you to convert NMAP results to html, csv, json, markdown, graphviz (dot), sqlite, excel and d2-lang. Simply put its nmap converter. 项…

2026/7/22 20:19:38阅读更多 →
艺术涂料CCC认证是什么?一文讲清楚

艺术涂料CCC认证是什么?一文讲清楚

一、CCC认证到底是什么CCC认证是中国强制性产品认证的简称,俗称“3C”。凡列入目录的产品,必须通过认证并加贴标志才能在国内销售。它管的是产品安全底线,比如电气安全、防火等,和“好不好看、环不环保”并不是一回事。对普通消费…

2026/7/22 20:19:38阅读更多 →
HOL4定理证明系统入门:从安装到第一个定理证明的完整指南

HOL4定理证明系统入门:从安装到第一个定理证明的完整指南

HOL4定理证明系统入门:从安装到第一个定理证明的完整指南 【免费下载链接】HOL Canonical sources for HOL4 theorem-proving system. Branch develop is where “mainline development” occurs; when develop passes our regression tests, master is merged forw…

2026/7/22 20:19:38阅读更多 →
Windows 11集成WSL2 Kali的渗透测试工具包解析

Windows 11集成WSL2 Kali的渗透测试工具包解析

1. 渗透测试套件工具包概述Penetration Suite Toolkit(渗透测试套件工具包)是一个专为安全研究人员、渗透测试工程师和网络安全爱好者设计的集成化工作环境解决方案。这个工具包基于Windows 11 Workstation 24H2 x64原版镜像构建,并完整集成了…

2026/7/22 21:17:48阅读更多 →
2026人形机器人商业化拐点剖析:硬件国产化补齐短板,软硬一体全栈龙头独享落地红

2026人形机器人商业化拐点剖析:硬件国产化补齐短板,软硬一体全栈龙头独享落地红

2026年是人形机器人可落地、可算账、可量产的商业化真正元年。区别于往年以技术样机、参数迭代、展会展示为主的概念阶段,今年行业核心逻辑彻底切换:产业硬件国产化瓶颈基本破除,减速器、传感器、结构件等基础零部件实现规模化国产替代&#…

2026/7/22 21:17:48阅读更多 →
DeerFlow 2.0沙盒架构解析:安全隔离与高效执行的AI智能体解决方案

DeerFlow 2.0沙盒架构解析:安全隔离与高效执行的AI智能体解决方案

1. DeerFlow 2.0沙盒架构的核心价值解析在当今AI智能体技术快速发展的背景下,执行环境的安全性和可靠性成为制约技术落地的关键瓶颈。DeerFlow 2.0作为字节跳动开源的生产级Super Agent框架,其沙盒(Sandbox)模块的设计直击行业痛点,为智能体提…

2026/7/22 21:17:48阅读更多 →
Rugby插件开发指南:扩展功能打造专属Xcode编译加速方案

Rugby插件开发指南:扩展功能打造专属Xcode编译加速方案

Rugby插件开发指南:扩展功能打造专属Xcode编译加速方案 【免费下载链接】Rugby 🏈 Cache CocoaPods for faster rebuild and indexing Xcode project. 项目地址: https://gitcode.com/gh_mirrors/ru/Rugby Rugby是一款专为Xcode项目设计的CocoaPo…

2026/7/22 21:17:48阅读更多 →
PromptLayer安全最佳实践:API密钥管理与异常处理的完整指南

PromptLayer安全最佳实践:API密钥管理与异常处理的完整指南

PromptLayer安全最佳实践:API密钥管理与异常处理的完整指南 【免费下载链接】prompt-layer-library 🍰 PromptLayer - Maintain a log of your prompts and OpenAI API requests. Track, debug, and replay old completions. 项目地址: https://gitcod…

2026/7/22 21:17:48阅读更多 →
Gizeh与Cairo:Python矢量图形开发的黄金组合

Gizeh与Cairo:Python矢量图形开发的黄金组合

Gizeh与Cairo:Python矢量图形开发的黄金组合 【免费下载链接】gizeh Simple Vector Graphics for Python 项目地址: https://gitcode.com/gh_mirrors/gi/gizeh Gizeh是一个基于Cairo的Python矢量图形库,它为开发者提供了简单直观的API来创建精美的…

2026/7/22 21:15:48阅读更多 →
Go语言静态资源打包方案对比与实践指南

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

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

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

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

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

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

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

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

2026/7/22 0:53:59阅读更多 →
中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业做小程序,最常见的矛盾是预算有限,但又不希望功能太单薄;没有技术团队,但又希望后续能自己运营;想快速上线,又担心隐性收费和售后失联。选型时如果只看“低价套餐”或“案例数量”,很容…

2026/7/22 0:01:17阅读更多 →
GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

企业做营销,最怕钱花完了,资产没有留下。 效果广告能带来一段时间的曝光,但预算停止后,流量往往也随之停止。短视频内容可能在几天内冲高,也可能很快沉下去。AI搜索时代,企业需要重新思考一个问题&#xff…

2026/7/22 0:01:17阅读更多 →
Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复 一、你的 Agent 在"再想想"的循环里绕了 12 轮,用户已经关窗口了 Agent 与人最大的区别是:人知道什么时候该停下来给答案,Agent 会一直"想"下去。你给 Agent 接…

2026/7/22 0:01:17阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/21 22:53:50阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/22 18:55:50阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/22 18:55:50阅读更多 →