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/25 5:00:12 阅读更多 →
佳能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/24 23:02:32 阅读更多 →
AI直播成本骤降70%?广州裕富科技智播系统与四大智能体深度评测

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

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

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

最新新闻

Buzz监控告警:及时发现并解决平台异常问题

Buzz监控告警:及时发现并解决平台异常问题

Buzz监控告警:及时发现并解决平台异常问题 【免费下载链接】buzz A hive mind communication platform 项目地址: https://gitcode.com/GitHub_Trending/buzz14/buzz Buzz作为一款高效的分布式通信平台,其稳定运行直接关系到团队协作效率。本文将…

2026/7/25 23:43:23 阅读更多 →
Jellium Desktop错误代码参考:常见问题的解决方案

Jellium Desktop错误代码参考:常见问题的解决方案

Jellium Desktop错误代码参考:常见问题的解决方案 【免费下载链接】jellium-desktop An unofficial desktop client for Jellyfin 项目地址: https://gitcode.com/GitHub_Trending/je/jellium-desktop Jellium Desktop是一款非官方的Jellyfin桌面客户端&…

2026/7/25 23:43:23 阅读更多 →
YOLOv11水果识别系统:从数据集构建到PyQt5部署

YOLOv11水果识别系统:从数据集构建到PyQt5部署

1. 项目概述:当计算机视觉遇上水果摊去年夏天帮朋友改造他的水果连锁店库存系统时,我深刻体会到了传统人工盘点的痛点——店员需要逐个检查每种水果的品类和成熟度,耗时耗力还容易出错。这促使我尝试用YOLO系列算法开发了一套智能水果识别系统…

2026/7/25 23:43:23 阅读更多 →
Agency-Agents:分布式AI代理协作框架解析与实践

Agency-Agents:分布式AI代理协作框架解析与实践

1. 项目背景与现象解读 今天打开GitHub Trending页面时,一个名为agency-agents的项目以单日6167星的惊人增速吸引了我的注意。这个号称"群体智能引擎"的开源项目在48小时内突破万星,背后开发团队MiroFish的突然崛起同样令人好奇。作为长期关注…

2026/7/25 23:43:23 阅读更多 →
如何快速上手node-sonos:5分钟实现Sonos设备自动发现

如何快速上手node-sonos:5分钟实现Sonos设备自动发现

如何快速上手node-sonos:5分钟实现Sonos设备自动发现 【免费下载链接】node-sonos 🔈 Sonos Media Player Interface/Client 项目地址: https://gitcode.com/gh_mirrors/no/node-sonos node-sonos是一个功能强大的Sonos Media Player Interface/C…

2026/7/25 23:43:23 阅读更多 →
Headless Tree 选择功能详解:掌握单选、多选与批量操作技巧

Headless Tree 选择功能详解:掌握单选、多选与批量操作技巧

Headless Tree 选择功能详解:掌握单选、多选与批量操作技巧 【免费下载链接】headless-tree The definitive tree component for the Web 项目地址: https://gitcode.com/gh_mirrors/he/headless-tree Headless Tree 是一款专为 Web 开发打造的高效树形组件&…

2026/7/25 23:42:23 阅读更多 →

日新闻

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:00:35 阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:00:35 阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:00:35 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/7/24 18:52:18 阅读更多 →

月新闻