侧边栏壁纸
博主头像
曾高明要发光

千里之行、始于足下

  • 累计撰写 13 篇文章
  • 累计创建 0 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

嵌入式linux之RAM与ROM使用

曾高明要发光
2026-02-08 / 0 评论 / 0 点赞 / 190 阅读 / 2,144 字

1. RAM 和 ROM 的基本区别

RAM(随机存取存储器)

  • 临时存储:程序运行时存放的地方
  • 易失性:断电后数据丢失
  • 可读写:CPU可以直接读写
  • 速度快:远快于ROM/硬盘

ROM(只读存储器)

  • 永久存储:存储固件、引导程序等
  • 非易失性:断电后数据保留
  • 传统上只读:现代多为闪存(可擦写)
  • 包含:BIOS/UEFI、引导加载程序、设备固件

2. Linux程序员何时需要关心ROM?

通常不需要直接管理ROM的情况:

// 普通应用开发几乎不接触ROM
// 只需要管理RAM中的变量和数据
int main() {
    char *buffer = malloc(1024);  // 分配RAM
    // ... 使用buffer
    free(buffer);  // 释放RAM
    return 0;
}

需要关心ROM/Flash的场景:

场景描述示例
嵌入式开发程序烧录到Flasharm-linux-gnueabi-gcc -o firmware.bin
固件开发编写硬件驱动程序内核模块、设备树
引导程序开发编写bootloaderU-Boot、GRUB开发
系统升级更新系统固件BIOS/UEFI更新
嵌入式Linux制作系统镜像Yocto、Buildroot

3. 不同角色的关注点

应用层程序员(99%情况)

# 只关心进程内存管理
top          # 查看内存使用
ps aux       # 查看进程信息
free -h      # 查看系统内存
vmstat       # 查看虚拟内存统计

# 程序运行时只使用RAM
# ROM中的数据已由OS加载到RAM

系统/内核程序员

// 可能需要处理ROM相关操作
#include <linux/mtd/mtd.h>  // 闪存驱动开发

// 访问内存映射的ROM区域
void *rom_memory = ioremap(ROM_PHYS_ADDR, ROM_SIZE);

嵌入式开发者

# 需要将程序烧录到ROM/Flash
# 1. 编译时指定链接地址
arm-linux-gcc -Ttext=0x8000 program.c

# 2. 使用烧录工具
flashrom -p programmer -w firmware.bin

# 3. 制作完整的系统镜像
dd if=bootloader.bin of=/dev/mtd0
dd if=kernel.bin of=/dev/mtd1
dd if=rootfs.bin of=/dev/mtd2

4. Linux启动过程中ROM的角色

ROM中的固件 (BIOS/UEFI)
    ↓
ROM中的引导程序 (GRUB/U-Boot)
    ↓
从硬盘/SSD加载内核到RAM
    ↓
内核初始化,建立虚拟内存管理
    ↓
加载用户程序到RAM执行

关键点:ROM中的代码只执行一次,用于初始化硬件并加载操作系统到RAM。

5. 实际开发中的ROM管理

使用设备文件访问ROM区域

# 查看系统中的闪存设备
ls -l /dev/mtd*

# 读取闪存内容
dd if=/dev/mtd0 of=firmware_backup.bin

# 写入闪存(危险操作!)
flashcp new_firmware.bin /dev/mtd1

通过sysfs访问

# 查看固件信息
ls /sys/firmware/

# UEFI相关信息
ls /sys/firmware/efi/

用户空间工具

# 查看和更新固件
sudo fwupdmgr refresh      # 刷新固件源
sudo fwupdmgr get-updates  # 检查更新
sudo fwupdmgr update       # 更新固件

6. 内存映射的ROM区域

// 在某些嵌入式系统中,ROM可能被映射到内存地址空间
// 可以通过指针直接访问(需要知道确切地址)

#define ROM_BASE_ADDR 0xFF000000

// 访问映射的ROM(需要内核权限)
uint32_t *rom_ptr = (uint32_t *)ROM_BASE_ADDR;
uint32_t first_instruction = rom_ptr[0];

7. 现代系统中的"ROM"概念扩展

实际上已经是Flash(可擦写)

  • UEFI/BIOS存储在现代闪存中
  • 可以通过软件更新
  • 但仍然称为"固件"

管理工具示例

# 查看当前固件版本
sudo dmidecode -t bios

# 提取当前BIOS
sudo dd if=/sys/firmware/efi/efivars/... of=bios_backup.bin

# 使用专门的更新工具
sudo biosflash -u new_bios.rom

8. 总结:何时需要关心ROM?

不需要关心ROM的情况(大多数开发者):

  • 开发桌面/服务器应用程序
  • Web开发、数据库应用
  • 普通系统管理
  • 科学计算、数据分析

需要关心ROM的情况:

  1. 嵌入式系统开发

    • 程序需要烧录到板载闪存
    • 需要管理启动流程
  2. 设备驱动开发

    • 需要与硬件固件交互
    • 管理设备特有的存储
  3. 系统固件开发

    • BIOS/UEFI开发
    • 引导加载程序开发
  4. 安全/逆向工程

    • 分析固件漏洞
    • 提取和修改固件

所以对于大多数Linux程序员来说,不需要直接管理ROM,操作系统已经为我们处理好了。ROM主要用于系统启动和固件存储,应用程序运行时完全在RAM中执行。只有当你开发嵌入式系统、设备驱动或系统固件时,才需要深入了解和管理ROM。应用开发者:专注于RAM管理和程序逻辑,不需要担心ROM。系统开发者:了解ROM的作用,但通常通过标准API访问。嵌入式开发者:必须深入了解ROM/Flash管理。

0

评论区