BSP基础知识
linux启动流程概括设备上电后SoC 片内 BootROM 从 Flash 读第一段启动代码到 片内 SRAM 执行完成 DDR 初始化和最小硬件 init然后加载 Bootloader到 DDR 。解压boot代码并把控制权交给BootoaderBootloader 从 Flash kernel 分区读出 uImage连同 bootargs、initrd/ramdisk、设备树 一起准备好按 ARM Linux 启动协议跳转到 Kernel 入口。Kernel 自身完成解压、MMU、驱动 init后挂载根文件系统启动 init再由 init/启动脚本拉起业务进程如媒体主进程。整体链路BootROM → miniboot/SPL → U-Boot → Linux Kernel → init → 业务。BootRom完成了什么任务BootRom是Rom里写死的不可改。解决的问题是“没有DDR之前怎么把能初始化DDR的代码跑起来”。主要完成的工作如下初始化最基础的始终必要pin(引脚)识别启动介质(后续从哪里读取代码)。从启动介质固定偏移读取一部分boot代码到片内Ram。第二阶段片内Ram完成了什么任务1初始化DDR配置DDR控制器、做信号校准、确认可用内存大小。、2最小硬件初始化保证读Flash正常。配置时钟、引脚和flash控制器。3将boot代码从flash拷贝到DDR。4、Bootloader主要完成了什么工作1) 自搬运避免和内核加载冲突。2) 初始化驱动3读分区表准备bootargs4) 从flash kernel分区读uImage到DDR5) 准备initrd、设备树DTB6) boot跳转kernel。Kernel会自解压5、kernel主要完成了什么工作1) 自解压2) 建页表、开MMU/Cache3) start_kernel()架构init、内存管理、调度器、驱动init4) 挂载根文件系统按 bootargs 里 root 挂 squashfs/yaffs2 等。5创建init进程(/linuxrc)6、init进程如何启动业务Init进程是busybox通用小程序他只执行/etc/inittab里面的脚本dnode脚本主要做的任务有挂载文件系统先让 mdev(busybox的小程序) 按内核已经注册好的设备把 /dev 补齐再手工补上 Flash 分区要用的 /dev/mtd/*rcS脚本启动应用程序。7、常见问题bootargs 谁传给 kernelU-Boot 把 bootargs 写进设备树的 /chosen/bootargs跳进内核时 r2 指向这块设备树。(设备树保存在flash里)ATAG方式U-Boot在临跳内核时在内存里搭一张标签链表r2指向这张表。(这张表保存在内存里)initrd 干什么Linux内核分为内核(uimage)、根文件系统、u-boot。其中内核就是负责与硬件交互、进程调度管理等工作而根文件系统就负责与用户的交互其实就是将flash的一块区域挂载在/目录下。而initrd是在内存里维护一个临时的根文件系统因为有些板子不能直接挂载真正的根文件系统需要进行处理。3.驱动什么时候起来驱动分为两批进行加载第一批在内核镜像里根分区还没有挂载上就初始化完了。第二批是ko要等/linuxrc根文件系统跑进rcS在这个脚本里面进行加载脚本。4.媒体相关内存Bootloader 通过 bootargs / 厂商 tag 把 预留物理内存告诉 kernel媒体 SDK 在用户态或内核模块里映射使用。内核的用的内存本身就有规定好的字段而媒体内存相关字段是厂商那边新加的。7、常见问题1.开MMU之前和之后CPU用的地址一样嘛答不一样开MMU之前用的是物理地址开了之后是虚拟地址。要先建好页表再开启MMU。2.DMA和Cache为什么会看到不同的数据答DMA读的都是内存里面的数据而Cache是内存和CPU之间的缓存CPU修改数据需要先修改cache再刷到内存里。所以就有可能cache的数据被修改了但是还没有刷到内存里所以DMA读到的数据就和cache里的不一样。解决方法数据是 CPU 准备好、要送给设备的先把 Cache 里的新数据写回内存再让 DMA 去读。这样 DMA 读到的才是刚写的。数据是设备经 DMA 写进内存、要给 CPU 用的等 DMA 写完把 Cache 里这块旧数据丢掉再让 CPU 去读。CPU 发现 Cache 里没有就会去内存拿设备刚写的内容。3. 预留内存、CMA 和普通内存重叠会怎样答普通内存谁都可以申请预留内存从可用内存挖走页分配器看不到CMA 是内核里一块「平时能借给别人、用时要收回来」的连续物理内存这三段必须互斥。媒体区被划进了内核可用区两边会互相改同一块物理内存现象是花屏、数据随机错、跑一会儿才崩。4. 设备树一项怎样变成一个能用的设备compatible用来和驱动匹配匹配程序执行驱动的peobe函数然后申请资源向用户态注册接口。5.probe失败一般是什么原因匹配字符串不一致模块的时钟或复位没准备好寄存器范围错误依赖的设备还没起来。6.平台设备和字符设备是什么关系平台设备表示这颗SOC上有这个硬件信息在设备树里总线不会自己发现它。字符设备时给应用open的接口。常见顺序是平台驱动 probe 成功再注册字符设备。一个讲硬件怎么被发现一个讲应用怎么打开它。7.中断为什么不能睡眠硬中断没有进程上下文。它不是一个可以挂起、再唤醒的进程所以不能睡眠。8.上半部和下半部各做什么上半部应答硬件清理设备寄存器确认中断否则同一条中断会一直进来。下半部剩下比较耗时的所有任务。9.下半部有什么方式软中断硬中断返回后尽快执行仍是中断上下文不能睡眠同一种软中断可以在多颗CPU上同时跑。tasklet建立在软中断上面但同一个tasklet不会在两颗CPU上同时跑不能睡眠。工作队列在内核线程里跑有进程上下文可以睡眠。10.时钟、复位、引脚配错分别是什么现象时钟没开读寄存器常是全0或者总线直接挂死。复位没释放模块一直停在复位里探测超时。引脚复用错该有的波形没有。11.根为什么做成只读配置另放分区根要保证下次还能启动用只读压缩文件系统运行中不往根上写。配置和日志放可写分区坏了可以恢复。12.内核和根为什么分成两个分区两者体积和更新频率不同可以只更新其中一块。内核先于根运行根损坏时只要bootloader和内核还在仍有机会恢复。13.14.BSS为什么清未初始化的全局变量放在 BSS镜像里不占空间上电后内存是随机值。启动代码要把这段清零这些变量才是 0。15. 多核时从核谁来拉起主核先准备好从核入口和参数再通过固件或 SoC 的启动寄存器释放从核。从核不能在主核的内存和锁还没准备好时进入内核。

相关新闻

成为全栈·Next.js 网站前台篇·文章列表:服务端首屏与客户端持续加载怎样协作

成为全栈·Next.js 网站前台篇·文章列表:服务端首屏与客户端持续加载怎样协作

成为全栈Next.js 网站前台篇文章列表:服务端首屏与客户端持续加载怎样协作 首屏内容适合由服务端直接交付,继续加载需要浏览器管理交互状态。两者合在一起时,真正难的是让第 2 页从第 1 页的下一步开始,而不是重新发明一份列表。 …

2026/9/30 22:29:30 阅读更多 →
【Redis初阶】(篇二)《一文吃透 Redis:特性、应用场景、版本演进与安装配置全解析》

【Redis初阶】(篇二)《一文吃透 Redis:特性、应用场景、版本演进与安装配置全解析》

一.了解 Redis Redis 官网:Redis - Real-time data for agents & apps Redis(Remote Dictionary Server)是一个开源的、基于内存的键值对(Key-Value)NoSQL 数据库。 在数据结构上,Redis 的 key 永远是…

2026/9/30 22:29:30 阅读更多 →
工业配电开关三大核心指标:电气参数、公差范围与机械寿命协同解析

工业配电开关三大核心指标:电气参数、公差范围与机械寿命协同解析

1. 工业级配电开关控制设备不是“能通电就行”的玩具——它是一套精密协同的机电系统很多人第一次接触工业级配电开关控制设备时,下意识会把它和家里墙上那个咔哒一声就跳闸的空气开关画等号。这种认知偏差,在项目现场已经酿成过三次非计划停机事故&…

2026/9/30 22:29:30 阅读更多 →

最新新闻

STM32按键消抖本质:GPIO输入读到的不是电平,而是时序采样快照

STM32按键消抖本质:GPIO输入读到的不是电平,而是时序采样快照

1. 这不是“读高电平还是低电平”的简单问题你把按键焊到STM32的PA0引脚上,写好初始化代码,while(1)里用HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)轮询——结果发现:按键明明没按,串口却疯狂打印“KEY PRESSED”;或者按下去…

2026/9/30 23:01:59 阅读更多 →
OpenClaw 本地部署 Windows 实操:用 TaoToken 统一 Key 打通自动化配置

OpenClaw 本地部署 Windows 实操:用 TaoToken 统一 Key 打通自动化配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 23:00:58 阅读更多 →
OpenClaw 本地优先架构拆解:从本地网关到混合推理的配置骨架与验证路径

OpenClaw 本地优先架构拆解:从本地网关到混合推理的配置骨架与验证路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 22:59:57 阅读更多 →
Hermes Agent 记忆矩阵拆解:MEMORY.md 文件、Hindsight 向量库与 SQLite 会话状态的三层协同与冲突

Hermes Agent 记忆矩阵拆解:MEMORY.md 文件、Hindsight 向量库与 SQLite 会话状态的三层协同与冲突

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 22:59:57 阅读更多 →
嵌入式驱动量产工程化:从能跑到敢用的跨越

嵌入式驱动量产工程化:从能跑到敢用的跨越

1. “能跑”和“会崩”之间,隔着整整一个量产工程体系你写完一个GPIO驱动,烧进板子,按下按键,LED亮了——恭喜,你完成了“能跑”阶段。你把SPI Flash驱动加进RTOS固件,读写测试循环100次全通过——好&#…

2026/9/30 22:59:57 阅读更多 →
一文讲清楚 Claude Code Skills、MCP工具,看完小白变大神!(附保姆级教程)

一文讲清楚 Claude Code Skills、MCP工具,看完小白变大神!(附保姆级教程)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 22:58:57 阅读更多 →

日新闻

Base64 图片头部特征识别:从文件头到格式判断的完整指南

Base64 图片头部特征识别:从文件头到格式判断的完整指南

1. 项目概述:为什么说看懂 base64 图片头部是基本功这几年跟 base64 打交道的机会越来越多,后端接口返回图片、前端渲染验证码、小程序里存小图、还有一些老系统导出报表,动不动就给你一段长到怀疑人生的 base64 字符串。很多人拿到字符串就直…

2026/9/30 0:00:35 阅读更多 →
Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

简介:本资源是一份面向Java初学者与课程设计学生的公交站牌广告灯箱管理系统毕业设计文档,聚焦城市公共广告资源信息化管理痛点,提供从需求分析到技术实现的完整方案。文档采用标准学术论文结构,含摘要、英文摘要、目录及五章正文…

2026/9/30 0:00:35 阅读更多 →
用 Redis Lua 构建大模型 API 多租户原子配额治理体系

用 Redis Lua 构建大模型 API 多租户原子配额治理体系

我去年年底接了一个内部 AI 平台的治理需求,背景很直接:公司把 DeepSeek、MiniMax 这类大模型 API 统一封装成内部网关,开放给几个业务团队用。结果第一个月账单出来,额度直接超了 4 倍。仔细查日志,发现原因并不复杂—…

2026/9/30 0:00:35 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/29 19:29:29 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/29 5:58:00 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/30 15:27:04 阅读更多 →