板级适配 · 链接脚本 lds(下)①:逐段解剖各内存段
系列目录本篇是板级适配系列第 4 篇下的第 1 部分。承接第 10 篇上的「256KB 公寓楼」规则带你逐间房进去看——.isr_vector/.text/.data/.bss每段怎么布置、门牌号VMA怎么落、行李LMA暂存哪。第 2 部分第 12 篇讲接口符号契约、ASSERT 与通用照妖镜。第 09 篇结尾思考题的答案在第 12 篇揭晓。承接上篇导读上篇说这栋 256KB 公寓楼「楼底低地址排前台/办公室/仓库、楼顶高地址是栈杂物」。本篇就带你逐间房进去看——每间房段具体怎么布置、门牌号VMA怎么落、行李LMA暂存哪。3.1.isr_vector门牌号必须 1KB 对齐一句话理解向量表必须排在最开头、且按 1KB 对齐硬件才能正确找到它——同时正好接住第 09 篇的 VTOR。.isr_vector : { . ALIGN(1024); KEEP(*(.isr_vector)) /* __Vectors初始 SP Reset 166 外设向量 */ . ALIGN(4); } SRAM语法小课堂零基础必看先搞懂这两个符号上面这段短短几行藏着两个最劝退新手的写法这里一次讲透。①*有两张面孔别混括号外面的* “所有输入文件”。比如*(.isr_vector)整句意思是“从每一个被链进来的.o目标文件里把名为.isr_vector的段掏出来排到这儿。”*管的是从哪些文件取。括号里面的* “段名通配符”匹配任意字符。比如*(.text*)里第二个*意思是段名以.text开头的都算——.text、.text.startup、.text.our_code统统中招。所以*(.text) *(.text*)是精确叫.text的 所有以.text开头的合起来一网打尽。一句话记*在括号外管从哪些文件在括号内管段名怎么匹配。②. ALIGN(N)写前面还是后面讲究大不同链接脚本里有个看不见的位置计数器.一个光标记住当前排到哪个地址。ALIGN(N)把.向上取整到 N 的整数倍。写在段内容之前如.text开头那句. ALIGN(4)先把光标挪到 4 字节边界再开始排本段 → 本段起点对齐。CPU 取 32 位指令/数据从对齐地址最顺ARM 还强制代码必须落在 4 字节地址。写在段内容之后如.isr_vector末尾那句. ALIGN(4)本段东西都排完了再把光标补齐到 4 字节边界 → 等于把本段尾巴收齐让紧接着的下一段从干净的对齐地址起步。为什么.isr_vector前后都有前面ALIGN(1024)是VTOR 的硬规矩——向量表基址必须 1KB 对齐硬件才认呼应第 09 篇VTOR0x10000000末尾ALIGN(4)是防御性收尾保证表尾也 4 对齐其实每个向量 4 字节天然对齐写上只是明确意图 保险。.text只要起点对齐就够了所以只在前面写。 这里的 SRAM不是大于 SRAM而是链接脚本的放进语法——把该段排到当前位置计数器.所在的位置、并归属于 SRAM 内存区这就是门牌号写定的那一刻.此刻的地址成为本段 VMA。它是整个镜像的第一节必然落在0x10000000——这正好回应第 09 篇SystemInit 里SCB-VTOR 0x10000000VTOR 指向这里。C 代码和链接脚本的这个数字对账靠 .isr_vector 排在第一节实现。ALIGN(1024)不是强迫症Cortex-M 的 VTOR 要求向量表基址按表大小向上取 2 的幂对齐本表约 728 字节 → 取 1024。不对齐硬件直接忽略你写的 VTOR 低几位中断照样飞。ALIGN(4)则是把位置计数器向上凑到 4 字节倍数——ARM 是 32 位架构指令取指和 32 位数据天然按 4 字节一个字对齐最干净。KEEP()防--gc-sections死代码消除把没人引用的向量表当垃圾删掉——向量表是硬件访问的必须手动保住。可复用经验向量表必须排第一节 按 2 的幂对齐本工程 1KB才能接住SystemInit里VTOR 0x10000000。lds 摆放位置和 C 代码 VTOR 是同一组数字对账改一边必须同步另一边。3.2.text代码段先钉住启动文件一句话理解代码段第一句就把Reset_Handler钉在最前保证链接器一定把它链进来当入口。.text : { . ALIGN(4); KEEP(*(.startup_copro_fw.Reset_Handler)) *(.text) *(.text*) } SRAM第一行又是一个KEEP把Reset_Handler所在的特殊节钉在 .text 最前面——ENTRY(Reset_Handler) 声明的入口必须确保真的被链接进来。3.3 构造器三区段给__libc_init_array留的空插槽一句话理解这三段是给 C 库全局构造器预留的空插槽——本工程用不上但符号必须留着。.preinit_array/.init_array/.fini_array三节用PROVIDE_HIDDEN导出成对的 start/end 符号。启动文件bl __libc_init_array就按这三对符号遍历区间里的每个函数指针依次调用。我们工程没有 C 构造器区间是空的但符号必须在——链接器和 newlib 认符号不认有没有货。3.4.data本脚本最精妙的一处读懂与AT就懂了 LMAVMA一句话理解本工程.data的加载地址和运行地址是同一个启动文件那段搬运退化成无害的自拷贝。决定它俩是否相等的正是和AT这两个符号。① 每个节有两个地址VMA运行地址运行时 CPU 取指/读写用的地址——也就是位置计数器.自动发给每个段的「入住门牌号」。LMA加载地址这个节的初值躺在固件镜像里的哪个位置。别被 “Virtual” 骗了VMA 不是 MMU 那种「虚拟地址」。本工程是无 MMU 的裸机 Cortex-M4CPU 取指/读写时总线上发出的就是 VMA 这个数它等于物理地址。LMA 同理也是镜像里的物理存储地址。VMA 和 LMA 不是「虚拟 vs 物理」而是「运行位置 vs 存储位置」两者可相同单区域也可不同双区域如.data RAM AT FLASH。②和AT不是你以为的那个意思。这是最大的坑 REGION是放进语法——把当前段排进名为REGION的 MEMORY 区指定该段VMA运行地址。AT单独额外指定该段的LMA加载地址区域只在想让加载地址和运行地址不在同一块内存时才出现。官方双区域教程.data RAM AT FLASH用上面的规则一拆就清清楚楚.data RAM指定 VMA运行时在 RAMAT FLASH指定 LMA初值躺在 Flash。于是上电后启动代码必须把初值从 Flash 搬到 RAMCopyDataInit 是真搬运。本工程不一样全 SRAM 单区域没有第二个存储区可搬。.data只写了 SRAM、没写AT链接器默认让 LMA 跟随 VMA得到LMA VMA初值天然就位在运行地址。可复用经验全 SRAM 单区域无 Flash / DRAM 第二存储区时.data直接 SRAM不写AT链接器自动让LMA VMA保留官方CopyDataInit搬运逻辑即可——它会退化成幂等自拷贝、无害。别为了「优化」删官方启动逻辑。3.5.bss清零区间 一个骗链接器的符号一句话理解.bss是未初始化的全局变量区上电必须清零末尾那对end/_end符号是专门给标准库撑场面用的。.bss : { __bss_start__ .; _sbss .; *(.bss) *(.bss*) *(COMMON) end .; _end .; } SRAM_sbss/_ebss给启动文件的 FillZerobss 用.bss 上电是随机值必须清零。end/_end这对符号是给 libnosys 的_sbrk看的标准库的 malloc 用end当堆顶。LiteOS 用自己的 80KB 外部堆根本不用它——但链接器要解析符号不给就报错。可复用经验.bss末尾的end/_end这类「给标准库撑场面」的空壳符号必须留——malloc/_sbrk要解析它。换工程看到这类符号别当垃圾删删了就是undefined reference。小结段作用关键约束.isr_vector向量表第 1 节排最前 1KB 对齐 KEEP接住 VTOR0x10000000.text代码Reset_Handler用 KEEP 钉最前构造器区段给__libc_init_array空插槽符号必留.data已初始化全局变量无 ATLMAVMACopyDataInit 退化自拷贝.bss未初始化全局变量上电清零end/_end应付_sbrk接口符号契约、ASSERT 越界拦截、以及拿到新工程怎么查的通用照妖镜留在第 12 篇继续。参考文档ARM — 《ARMv7-M Architecture Reference Manual》The Cortex-M4 address space/ 复位行为地址0为复位向量取指区、向量表基址由VTOR设定。GNU ld 手册Linker ScriptsMEMORY、ORIGIN/LENGTH、 REGION、AT、ASSERT等语法的权威定义。在线https://sourceware.org/binutils/docs/ld/Scripts.htmlST — RM0436 Reference Manual第 2.5 节 Memory map明确 M4 内部 SRAM 地址窗口SRAM10x10000000/ 128KB …本篇0x10000000起址与256KB约束据此。术语表本文出现缩写/符号含义.isr_vector向量表段须排在最前、1KB 对齐接住 VTOR.text代码段.data已初始化全局变量段.bss未初始化全局变量段上电须清零VMAVirtual Memory Address运行地址段运行时所在地址等于物理地址LMALoad Memory Address加载地址段的初值躺在镜像里的位置 REGION链接脚本放进语法非大于号指定该段 VMA运行地址AT额外指定该段 LMA加载地址区域不写则 LMA 跟随 VMAALIGN(N)把位置计数器.向上取整到 N 的整数倍ALIGN(1024)满足 VTOR 对齐ALIGN(4)满足 32 位字对齐KEEP保住指定段不被--gc-sections删掉用于向量表、Reset_Handler__libc_init_arraynewlib 的 C 库初始化函数遍历构造器区间调用构造器_estack栈顶指针初值 ORIGIN(SRAM)LENGTH(SRAM)MSP 从此向下长_sidata/_sdata/_edata.data的加载地址与运行起止供启动文件用_sbss/_ebss.bss起止供 FillZerobss 清零end/_end.bss末尾符号给标准库_sbrk当堆顶VTOR向量表偏移寄存器指向当前向量表第 09 篇设成 0x10000000MSPMain Stack Pointer主栈指针复位后默认用的栈SRAM片内静态 RAM0x10000000 起256KB程序全住这--gc-sections死代码消除删未被引用的函数/段与 KEEP 配合防误删系列导航上一篇第 10 篇 · 链接脚本 lds上256KB 硬约束与内存地图 本篇第 11 篇 · 链接脚本 lds下① 逐段解剖各内存段 下一篇第 12 篇 · 链接脚本 lds下② 接口契约、ASSERT 与照妖镜板级适配与应用 07–2507 工程全景与启动四步法 08 BSP 契约与实现 09 SystemInit 与 CMSIS 裁剪 10 lds 上 11 lds 下① 12 lds 下② 13 启动文件与五步启动 14 弱符号覆盖与三特殊中断 15 target_config 清单(上) 16 FPU 三件套与栈档 17 改错速查 18 LED 任务与 LOS_TaskCreate 19 LED 实战与错误码 20 los_exc 与三破坏现场 21 FPU 栈帧与 backtrace 22 八环节与四铁律 23 全文件对账与目录 24 六类判据与换板五步 25 经验与变量级增删改留完整 01–06 基础篇与切换汇编 01–06 见各篇导航。代码仓库stm32mp157-liteos-m Gitee · 基线 v0.1-baseline

相关新闻

豆包AI深度使用指南:从提问技巧到工作流融合的提效实战

豆包AI深度使用指南:从提问技巧到工作流融合的提效实战

简介:一份系统剖析豆包AI使用效率差异的实践指南,面向学生、教师、科研人员及新媒体运营等所有豆包用户,旨在帮助读者摆脱“只会简单问答”的低效状态。内容以大学生编程刷题、60岁退休教师教学、科研人员读文献等真实场景为对照,…

2026/10/2 14:32:44 阅读更多 →
校园二手交易App开发:Android原生毕设核心流程与工程实践

校园二手交易App开发:Android原生毕设核心流程与工程实践

简介:一份基于Android Studio开发的校园二手交易系统完整App源码,面向毕业设计学生与Android初级开发者,可用于学习完整的移动端业务实现流程。项目以Java为主,辅以XML布局与Gradle构建脚本,zip压缩包共186个文件&…

2026/10/2 14:30:14 阅读更多 →
FoxyPreview:Windows轻量级文件预览工具深度指南

FoxyPreview:Windows轻量级文件预览工具深度指南

简介:FoxyPreview最新版是一款专为Visual FoxPro(VFP)开发者设计的报表预览与导出工具,面向使用VFP进行桌面应用开发的技术人员及维护工程师,解决传统VFP报表难以跨平台共享、二次处理与归档的痛点。资源包共245个文件…

2026/10/2 14:30:25 阅读更多 →

最新新闻

Splay树原理与C++实现:旋转操作、区间翻转及均摊复杂度详解

Splay树原理与C++实现:旋转操作、区间翻转及均摊复杂度详解

这会儿想说点关于数据结构的硬核内容。Splay 树(伸展树)你可能听说过,也可能在平衡树的题解里见过它的大名,但始终没动手写过。这玩意在 C 竞赛、数据结构实验、甚至某些工程场景里都挺能打,因为它的思路跟 AVL 树、红…

2026/10/2 21:46:52 阅读更多 →
openrig 配置指南:统一管理 Claude Code 与 Codex 的 AI 编码助手运行环境

openrig 配置指南:统一管理 Claude Code 与 Codex 的 AI 编码助手运行环境

1. openrig 到底想解决什么问题第一次看到 openrig 这个名字,我下意识把它和一堆“AI 命令行工具”联系到了一起。原因很简单,最近围绕 Claude Code、Codex 这类终端智能助手的讨论实在太多,而 openrig 恰好出现在同一批热搜词里。但真正把玩…

2026/10/2 21:46:52 阅读更多 →
懂车帝反爬实战:从静态解析到动态行为模拟

懂车帝反爬实战:从静态解析到动态行为模拟

1. 这不是“又一个爬虫教程”,而是懂车帝数据获取的实战切片懂车帝,这个国内汽车垂直领域流量最大的平台之一,它的车型页结构清晰、数据维度丰富——官方指导价、配置表、实拍图、用户口碑、油耗实测、保值率曲线,甚至还有4S店报价…

2026/10/2 21:46:52 阅读更多 →
MySQL+Flask+ECharts:数据可视化全链路实战

MySQL+Flask+ECharts:数据可视化全链路实战

数据可视化这两年几乎是个人开发者和企业报表岗的必备技能,但很多人在第一步就卡住了:数据在哪?怎么组织?怎么高效地把它变成前端能直接“画”的数据?我实操下来最顺手的组合,不是直接用Excel硬刚&#xff…

2026/10/2 21:46:52 阅读更多 →
COLMAP点云可视化与6D位姿对齐:从二进制解析到Open3D/PCL实战

COLMAP点云可视化与6D位姿对齐:从二进制解析到Open3D/PCL实战

简介:这是一款面向三维重建与计算机视觉开发者的点云可视化工具,主要解决Colmap重建结果、pcd/ply点云以及6D位姿R|t难以直观查看的问题。工具支持加载Colmap输出的images、cameras、points3D、project四类文件,也兼容pcd、ply格式点云&#…

2026/10/2 21:46:52 阅读更多 →
Cocos Creator做猜成语游戏:轻量跨端2D开发实战

Cocos Creator做猜成语游戏:轻量跨端2D开发实战

简介:本资源是一套基于Cocos Creator 2.3.3开发的完整猜成语游戏项目源码,面向游戏开发初学者与Unity/Cocos转型开发者,解决2D交互类益智游戏从零搭建、UI逻辑联动、本地数据驱动及跨平台发布等核心实践问题。压缩包共2765个文件,…

2026/10/2 21:45:52 阅读更多 →

日新闻

从零搭建AI工程化:模型之外的完整闭环

从零搭建AI工程化:模型之外的完整闭环

先搞清楚一件事:从零开始做 AI 工程化,难的从来不是调模型、写提示词,而是把一套原型 Demo 变成长得像是“正经系统”的东西。你手里可能已经有了能跑通的代码,也可能刚读完一些概念,但真到了要把它变成可维护、可观测…

2026/10/2 0:00:20 阅读更多 →
大模型训练显存估计与混合精度训练实战指南

大模型训练显存估计与混合精度训练实战指南

1. 大模型训练显存估计与混合精度训练详解显存不够用,几乎是每个做大模型训练的人都会撞上的第一堵墙。你可能也经历过:模型代码写完了,数据管道跑通了,满心欢喜地按下训练启动脚本,结果几秒钟后终端弹出一行红字——C…

2026/10/2 0:00:20 阅读更多 →
小样本学习数据集选型指南:27个真正可用的高质量数据集

小样本学习数据集选型指南:27个真正可用的高质量数据集

1. 小样本学习的“弹药库”:为什么你总在找数据集,却总找不到真正能用的? 小样本、数据集——这两个词最近半年在我处理的200多个AI项目咨询里,出现频率排进前三。不是模型调不好,不是代码写不对,而是卡在…

2026/10/2 0:00:20 阅读更多 →

周新闻

如何划分训练/验证集: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/10/1 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

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

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

2026/10/1 19:41:40 阅读更多 →
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/10/1 20:05:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式: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/10/2 5:26:06 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/2 6:09:11 阅读更多 →