一、嵌入式设备启动流程1.ROM Boot第一阶段芯片内置ROM出厂固化运行厂家固化在IROM里的代码初始化基础硬件需要的时钟和设备PLL、最小RAM判断启动方式emmcSDUSB把bootloader第一阶段代码加载到IRAM芯片运行内存2.U-Boot在IRAM里运行对应的bootloader第一阶段的代码SPL(Secondary Program Loader二级程序加载器)u-boot-spl.bin初始化整个系统的时钟初始化内存把完整的bootloader搬移到内存中3.在内存里运行bootloader第二个阶段的代码初始化了一些硬件设备根据开发板 去定义网卡串口USB)加载对应的操作系统内存4.运行操作系统无图形界面5.挂载文件系统EXT(2,3,4)6.启动应用程序不在IROM里初始化内存的原因因为芯片厂家不知道开发板采用什么样的内存没有办法进行初始化为啥bootloader分两个阶段?运行芯片内部存储空间有限如果内部空间做大成本提高二、U-boot和Linux 内核之间的参数传递内核自身上电不会主动扫描、探测全部硬件资源依赖 U-Boot 传递基础信息才能正常初始化系统。根文件系统路径、串口 控制台、网卡 IP、NFS 挂载配置这类运行参数完全依靠 U-Boot 的bootargs传递给内核之后才能正确启动硬件系统。数据流向U-Bootsetenv bootargs → bootm启动内核时把bootargs放入内存固定区域 → Linux内核启动解析该字符串参数传递方式通过寄存器r1 : 存放机器 IDMachine ID内核根据该 ID 匹配内核中注册的单板平台代码区分不同开发板硬件平台r2 : 存放内存这片区域存放内存大小、告诉Linux内核启动后挂载文件系统的方式、bootargs 命令行、串口、时钟等全部系统参数U-boot只是告诉了数据在什么位置没有告诉内核可以访问的内存大小数据什么格式什么时候结束Linux内核如何知道它访问的参数结束的地方在哪里u_boot和Linux之间在传递参数的时候是按照双方约定的格式传递格式包含1.struct parm__struct结构体2.tag列表3.设备树.bootargs内核刚启动阶段只会初始化最基础的 CPU、MMU不会自己自动扫描挂载根文件系统、匹配串口输出、不会配置网卡 IP全部依靠 bootargs 告知内核该怎么工作。root/dev/nfs nfsroot192.168.2.62:/home/hqyj/fs4412/rootfs,prototcp,nfsvers3 rwconsolettySAC2,115200 init/linuxrc ip192.168.2.34参数片段具体作用补充说明root/dev/nfs指定根文件系统的介质类型为 NFS 网络文件系统告知内核去哪里寻找系统最顶层的根目录是系统能否启动的核心nfsrootIP: 目录路径填写 PC 主机 IP Ubuntu 上 rootfs 的绝对路径内核通过网线挂载电脑里的根文件系统开发调试常用prototcp,nfsvers3NFS 传输使用 TCP 协议、协议版本为 3提升传输稳定性适配 Ubuntu 默认 NFS 服务rw根文件系统以读写模式挂载不加该参数默认只读板子无法创建设备节点、保存文件会卡死启动consolettySAC2,115200指定调试串口设备名 ttySAC2波特率 115200内核打印日志、命令行交互的串口配置错误则串口无打印ip192.168.2.234开发板开机自动配置静态 IP 地址和电脑 IP 处于同一网段保证 NFS 网络通信正常init/linuxrc指定用户空间第一个运行的程序内核启动后执行的第一个用户态程序是 /linuxrc通常是 BusyBox 提供的初始化脚本或软链接到 /sbin/initbootcmdbootcmd 是 U-Boot 的环境变量存放一串 U-Boot 可执行命令.作用开发板上电倒计时结束后U-Boot 自动执行这组命令完成加载内核、dtb、启动 Linux 系统整套流程bootcmdtftp 41000000 uImage;tftp 42000000 exynos4412-fs4412.dtb;tftp 43000000 ramdisk.img;bootm 41000000 43000000 42000000uImage是 U-Boot 引导加载程序专用的、经过特殊格式封装的 Linux 内核镜像文件。exynos4412-fs4412.dtb设备树文件。ramdisk.img自己的系统映象文件。tftp 0x41000000 uImage通过 TFTP 从电脑下载内核 uImage存到板子内存地址 0x41000000tftp 0x42000000 exynos4412-fs4412.dtb下载设备树 dtb 文件存入内存 0x42000000bootm 41000000 43000000 42000000正式启动 Linux 内核格式bootm 内核地址 ramdisk地址 dtb地址三、Kconfig Makefile .config menuconfig之间的关系总关系Kconfig 定义选项规则 → menuconfig 让你可视化选择 → 选择结果存成 .config → Makefile 读 .config 决定编译哪些 .c 文件 → 最终生成 uImage。1.Kconfig--菜单的菜谱相当于配置对应的宏 将用户选择的功能配置项通过宏的形式确定下来。比如配置为Y代表将对应功能直接编译进内核M代表编译进模块n表示不编译。2.menuconfig--点菜界面读取所有 Kconfig 文件生成一个图形化的菜单界面。在里面用空格键勾选/取消选项。它本身不修改 Kconfig只是可以让使用者方便地选择。3.config - -点好的菜单.config 是人可读的纯文本记录了用户最终选定的内核功能。4.Makefile--后厨按菜单做菜管理Linux内核的编译过程根据.config里面的宏配置决定编译哪些代码四、U-boot启动过程ARM核的设置1.设置CPU 为SVC模式 2.设置异常向量表 3.关闭Cache和MMU(内存管理单元:A.内存访问权限设置 B.物理地址和虚地址的映射)SOC芯片的设置4.处理唤醒的条件 5.判断是否在内存中运行 6.如果不在内存中运行,则初始化系统时钟和内存控制器第一阶段 如果在内存中运行则不需要初始化系统时钟和内存控制器(第二阶段) 7.初始化uart 8.设置sp9.调用board_init_f第一阶段代码: board_init_f 功能将u_boot从存储器搬移到内存跳到内存中运行第二阶段代码: board_init_f (1)执行了初始化序列表 (板子相关的初始化操作) (2)为u_boot重定向预留内存10.对u_boot重定向 (从低端内存搬移到高端内存)11.清bss段 12.board_init_r[1]外围硬件初始化 (emmc 、网卡) [2]让串口作为标准输入输出设备 [3]main_loop探测自动启动是否被打断如果没有被打断,则执行bootcmd指定的命令 如果被打断了则进入u_boot交互界面五、Linux启动过程1.CPU 合法性校验读取 CPU 标识内核检索自身配置判断是否支持当前 CPU不支持则直接打印错误并终止启动。2.单板机器 ID 合法性校验读取 U‑Boot 通过r1寄存器传递的板子 Machine ID和内核内置支持的单板列表比对ID 不匹配打印报错大概率是内核配置与开发板不匹配。3.内存管理基础搭建校验全部通过后调用函数创建一级页表 → 开启 MMU 虚拟内存机制内核正式进入虚拟地址寻址模式。4.基础环境初始化清空 BSS 段、设置栈指针、保存 CPU 编号、单板 ID、ATAGS 参数基地址等全局数据。5.汇编跳转 C 代码使用汇编指令跳转至start_kernel()从汇编环境进入 C 语言的内核主体运行。六、busybox init启动过程1. 启动 init 进程Linux 内核完成根文件系统挂载后执行 init 进程进程 ID 为 1。在 Busybox 中这个 init 就是 /sbin/init由 Busybox 提供。2. 读取并解析 /etc/inittabinit 启动后首先读取并解析 /etc/inittab 文件然后按照该文件的配置去启动相应的应用程序和脚本。#!/bin/sh /bin/mount -a # 根据 /etc/fstab 挂载所有文件系统 mkdir /dev/pts # 创建伪终端设备目录 mount -t devpts devpts /dev/pts # 挂载 devpts 文件系统支持 SSH 等需要终端的程序 echo /sbin/mdev/proc/sys/kernel/hotplug # 告诉内核有热插拔事件时调用 mdev mdev -s # 扫描 /sys 创建所有设备节点/dev/ttySAC2 等3.执行 /etc/init.d/rcS 脚本#!/bin/sh /bin/mount -a # 根据 /etc/fstab 挂载所有文件系统 mkdir /dev/pts # 创建伪终端设备目录 mount -t devpts devpts /dev/pts # 挂载 devpts 文件系统支持 SSH 等需要终端的程序 echo /sbin/mdev/proc/sys/kernel/hotplug # 告诉内核有热插拔事件时调用 mdev mdev -s # 扫描 /sys 创建所有设备节点/dev/ttySAC2 等4.根据 /etc/fstab 批量挂载各类文件系统device:要挂载的设备mount-point:挂载点type:文件系统类型options:挂载参数dump程序根据这个字段来决定这个文件系统是否需要备份fsck orderfsckfile system check程序根据这个字段来决定是否对磁盘做检查。/proc内核运行信息虚拟文件系统/sys硬件设备树、驱动信息文件系统/tmp临时目录内存文件系统/dev设备节点目录5.运行 shell 程序硬件、文件系统全部就绪后依据 inittab 配置启动/bin/sh也就是在串口看到的命令交互终端。6. 执行 /etc/profile 脚本#!/bin/sh export HOSTNAMEfarsight # 设置主机名 export USERroot export HOMEroot # root 用户的家目录 export PS1[${USER}${HOSTNAME} \W]\# # 命令提示符格式[rootfarsight ~]# PATH/bin:/sbin:/usr/bin:/usr/sbin # 命令搜索路径 LD_LIBRARY_PATH/lib:/usr/lib:$LD_LIBRARY_PATH # 库搜索路径 export PATH LD_LIBRARY_PATH四个文件之间的关系Linux 开机自启程序的四种方案方案启动时机进程自愈运行环境适用场景bootargs 指定 init最早根文件挂载完立刻运行无残缺无系统服务极简专用固件/etc/inittab respawn系统初始化完成后崩溃自动重启完整系统环境必须永久常驻的后台服务rcS 内部调用系统初始化中期无基础环境就绪需要提前启动的硬件检测程序/etc/profile 调用所有系统服务、shell 环境就绪无环境最全变量全部生效绝大多数普通业务程序首选
企业数字化 ERP 产品动态
相关推荐
如何看懂 Tessera 的 OTA 更新机制:ESP32 触摸屏夜间 Wi-Fi 自动更新固件完整指南 【免费下载链接】homeassistant_espscreen Tessera: beautiful, easy touch screens for Home Assistant on affordable ESP32 panels, 2.8 to 10.1 inch (CYD, Guition, Waveshare). Drag-and-drop editor, no YAML, no MQTT. 项目地址: https://gitcode.com/gh_mi… · 2026/11/5 5:18:02
GenOffice:免费开源的 AI 办公套件与 genoffice 命令行完整指南 GenOffice:免费开源的 AI 办公套件与 genoffice 命令行完整指南 【免费下载链接】genoffice Free, open-source AI Office suite: Docs, Sheets, Slides, PDF, Markdown and HTML editors with a built-in AI agent, plus a genoffice CLI and agent skill so Claud… · 2026/11/5 5:18:02
iloader 一键侧载 SideStore 免手动重签 iloader 一键侧载 SideStore 免手动重签 【免费下载链接】iloader User friendly sideloader 项目地址: https://gitcode.com/GitHub_Trending/iloa/iloader
想在 iPhone 上侧载应用,免费 Apple 开发者账号只有 3 个 App ID 额度,签名、证书、配对文件又是最容易卡住人的… · 2026/11/5 5:18:02
Blob文件流下载实战:从二进制响应到文件落盘 Blob文件流下载这六个字,最早出现在我手里的时候,是一句很敷衍的工单描述:“导出按钮点了没反应,用户说换浏览器就好了”。翻代码才发现,导出接口走的是 POST,带一堆筛选条件,后端直接Content-T… · 2026/11/5 6:02:15
智能阅读进度管理程序的设计与实现 1. 阅读进度管理程序的设计初衷作为一个纸质书和电子书双修的阅读爱好者,我书架上的待读书籍已经堆成了小山。每次翻开新书时都充满热情,但三分钟热度过后,经常发现书签还停留在前50页。这种"开头猛如虎,看完两页就吃土"… · 2026/11/5 6:02:15
51单片机数字时钟Proteus仿真:DS1302时序与动态扫描实战 简介:本资源是一套完整的51单片机数字时钟Proteus仿真项目,面向电子类专业初学者、单片机入门学习者及嵌入式课程实践者,解决硬件资源有限条件下理解定时器中断、数码管动态显示与软硬协同仿真的核心问题。压缩包共30个文件,含2个… · 2026/11/5 6:02:15
NSGA-III参考点机制与自适应归一化深度解析 简介:本资源是面向多目标优化初学者与进阶研究者的NSGA-III算法Matlab实现包,聚焦2目标经典测试问题(如MOP2),特别适合算法原理理解、代码调试与教学演示场景。压缩包共16个文件,含14个核心m脚本࿰… · 2026/11/5 6:02:15
IDEA+Maven开发Web项目实战指南 1. 为什么选择IDEAMaven开发Web项目作为Java开发者,我们每天都要和各种开发工具打交道。IntelliJ IDEA作为目前最智能的Java IDE,配合Maven这个强大的项目管理和构建工具,可以极大提升Web项目的开发效率。我使用这套组合开发企业级Web应用已有… · 2026/11/5 6:02:15
请求头改写失效:搜索区域判定的多信号一致性校验与工程化替代 1. 先把现象拆开:一次"改请求头失效"到底发生了什么做爬虫、做搜索聚合、做浏览器扩展的同行,最近应该都碰到过同一类反馈:原本靠自定义Accept-Language、User-Agent、Referer这几项请求头就能把搜索服务的返回结果切到国际版&… · 2026/11/5 6:01:15
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
多智能体协作系统架构设计与实践优化 1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39
大模型系统性入门实战指南:从原理到部署微调的全链路路线 提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39
鸿蒙文件系统沙箱机制解析与开发实践 1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38