【RISC-V】区分加载地址、链接地址、运行地址

原本是没有这个概念区分的,现代通用计算机(PC、手机、服务器)都有MMU,你的操作系统内核会自动处理了这一切,你不需要区分这些,但是当你的机器上电时,还没有操作系统内核接管时,你开发的裸机/嵌入式/引导程序需要明确区分这些地址:

┌─上电过程─────────────────────────────────────────┐

│ 上电复位 → BIOS/UEFI固件 → Bootloader → 操作系统内核 → 用户空间 │

└────────────────────────────────────────────────┘

  • 加载地址:程序真正复制或存储(有些固件程序就存储在ROM中)到内存中的起始物理。
  • 链接地址:链接地址是链接器(linker)在生成可执行文件或目标文件时,为每个符号和段分配的虚拟地址。
  • 运行地址:程序真正运行时的内存地址,也是PC在执行指令或访问数据时,实际使用的内存地址

所以

什么情况下一段程序三者地址相同:

比较少见了,现在程序基本都在虚拟内存下运行,只有标准静态链接的非 PIE(Position-Independent Executable)用户态可执行程序三者地址相同(在编译时要明确指明-no-pie参数)

什么情况下加载地址与链接地址不同,但是链接地址与运行地址相同:

一般你编写的程序(大多数用户态程序)都是这个模式,上面也说了,当你的程序运行在 带 MMU 的操作系统 (如 Linux、Windows)时,你的操作系统加载器会将程序加载到内存的虚拟地址。CPU 运行时使用该虚拟地址访问代码和数据。此时链接地址与运行地址与加载地址都相同。

什么情况下链接地址与运行地址不同:

内核或裸机程序在 MMU 开启之前的程序,比如Bootloader 的第二阶段,还有RISCV架构中MMU 开启前会调用固件接口程序和启动操作系统内核的汇编代码(因为MMU启动后归MMU接管了)

注意!!!:这些任务不能依赖虚拟内存 ,代码必须是位置无关(Position-Independent) 或已知加载地址的。

举一个真实的例子,Linux 内核在编译链接时,会被链接脚本链接到一个高的虚拟地址 0xffffffff80000000(. = 0xffffffff80000000,但Bootloader中(如 OpenSBI 或 U-Boot)将内核镜像加载地址编写在了内存的0x80200000处

如何解决:内核代码里的所有MMU启动前的汇编代码都不基于基址编写,而是基于PC编写,用auipc和lla这些,当MMU开启后,立即跳转到虚拟地址

相关推荐
硅农程序猿19 小时前
从需求到硅片| 一文讲清数字芯片设计流程
arm开发·硬件架构·risc-v
hongmai6668885 天前
ESP32-WROVER-B-N8R8:8MB PSRAM加持的经典双核模组,现在还值得选吗?
单片机·嵌入式硬件·物联网·智能路由器·risc-v
hongmai6668886 天前
GK7205V300芯片深度解析:H.265低功耗视觉主控,助力安防监控高效选型
arm开发·嵌入式硬件·物联网·智能家居·h.265·risc-v
2301_805962937 天前
在昉星光2(RISC-V)上构建每日短视频自动生成器
音视频·risc-v
hongmai6668888 天前
聊聊ESP32-C3-WROOM-02-N8这颗8MB Flash的RISC-V模组
笔记·嵌入式硬件·物联网·智能路由器·risc-v
hongmai6668889 天前
耐高温小钢炮:ESP32-C3-MINI-1U-H4模组选型分享
笔记·单片机·嵌入式硬件·物联网·risc-v
国科安芯11 天前
卫星星务计算机数据管理中SEU容错机制的技术实现研究——以AS32S601存储器ECC架构为例
网络·单片机·算法·fpga开发·架构·云计算·risc-v
QYR-分析12 天前
RISC-V AI加速器SoC行业研究报告:开放架构赋能AI芯片,高增赛道开启国产化新机遇
人工智能·架构·risc-v
hongmai66688813 天前
ESP8684-WROOM-02C:一块被低估的RISC-V Wi-Fi模组
单片机·嵌入式硬件·物联网·5g·智能路由器·risc-v
深圳市爱派派智能科技有限公司15 天前
“进迭时空 RISC-V 集群服务器 CSB1-N10SPK3:10 节点 K3,600 TOPS 绿色算力“
运维·服务器·risc-v·k3·进迭时空·集群服务器