SRAM、DRAM、ROM、FLASH、EMMC解析

        我们知道计算机五大组成部分:控制器、运算器、存储器、输入设备、输出设备。可见存储器是计算机核心组件之一,而不同类型的存储器有着不同的特性和用途。本文目的在于帮助初学者快速理清它们的关系和区别,先对各种存储器有基本的认识。

        我们可以按照存储器数据掉电是否丢失,把存储器分为两类:

                失去供电之后,数据消失的是易失性存储器,下次上电,没有任何数据。

                失去供电之后,数据仍保留的是非易失性存储器,下次上电,是之前写入的数据。

易失性存储器:断电后数据丢失

        这类存储器就像我们工作时的临时记事本。一旦断电,里面的内容就会消失,主要用于设备运行时的临时数据处理。

RAM是其中的代表,它又可分为 SRAM 和 DRAM。

        SRAM:全名为Static Random Access Memory。速度快,但容量小、成本高。常见用途是作为处理器缓存Cache,能让 CPU 快速获取频繁使用的数据。因为其速度快,需要和 CPU 高效协同工作,所以与 CPU 的连接方式通常是通过内部总线直接连接。

        DRAM:全名为Dynamic Random-Access Memory。成本低于SRAM、容量大,像我们常说的 DDR4、DDR5 就属于 DRAM。常见用途是作为系统的主要内存,也叫运行内存,用于临时存储运行中的程序和数据。与 CPU 的连接多通过 DDR 总线,这种总线专门为 DRAM 设计,能满足其数据传输需求。

非易失性存储器:断电数据不丢失

        这类存储器如同长期档案柜,能长久保存数据,即使断电也不会丢失,多用于存储系统程序、配置信息等。主要有以下四种:ROM、Flash、eMMC、EEPROM

ROM

        全名是Read-Only Memory。传统的 ROM 在出厂时就写入数据,正常使用中只能读取,不能修改。常见用途是存储固定不变的程序,比如早期电脑的 BIOS、嵌入式设备的BootROM等。CPU 通过地址总线指定要读取的存储单元,再通过数据总线获取其中的数据,但随着技术发展,它的部分用途已被NOR Flash替代。

Flash

        作为 ROM 的 升级版,Flash 支持电擦除和重写,灵活性更高。

        NAND Flash:容量大、成本低,写 / 擦除速度快。常见用途是存储大量数据,如手机存储、SSD固态硬盘、U 盘等。与 CPU 的连接方式多样,在嵌入式系统中常通过专用的 NAND 控制器与 CPU 连接,也有的通过 SPI 总线等。

        NOR Flash:支持随机读取,可直接运行程序。常见用途是存储 Bootloader、小型固件等,因为 CPU 可以直接从 NOR Flash 中读取指令并执行。与 CPU 的连接多通过并行总线或 SPI 总线,并行总线能提供较快的读取速度,适合需要快速启动的场景。但 NOR Flash 容量较小、成本较高。

eMMC

         eMMC(embedded MultiMediaCard)是一种将 NAND Flash 芯片主控控制器封装在一起的标准化存储解决方案。你可以把它看作是一个即插即用的固态硬盘SSD,它内部集成了复杂的管理电路,负责处理 NAND Flash 的坏块管理、磨损均衡、纠错等复杂任务。

        特性与优势:eMMC 最大的优势在于其高集成度和易用性。开发者无需深入了解底层 NAND Flash 的复杂特性,只需通过标准化的接口与 eMMC 通信,主控芯片会自动处理所有底层操作。它结合了 NAND Flash 的大容量、低成本优点,同时提供了比裸片 NAND Flash 更稳定、更可靠的性能。不过,其速度通常低于高速的 UFS 或 NVMe SSD。

        常见用途:eMMC 广泛应用于对成本、功耗和集成度有要求,但又需要较大存储容量的嵌入式设备中。例如,中低端智能手机、平板电脑、智能电视、车载信息娱乐系统、物联网网关等,其操作系统和用户数据通常就存储在 eMMC 中。

        与 CPU 的连接方式:CPU 通过专用的 eMMC 控制器和标准的 eMMC 总线与 eMMC 芯片连接。这种接口设计简化了硬件设计,缩短了产品开发周期。

        为什么需要 eMMC? 回到文章的核心问题,eMMC 的存在完美体现了“用不同器件的优势,适配不同场景的需求”这一原则。虽然 NAND Flash 本身成本低、容量大,但直接使用裸片 NAND Flash 需要 CPU 或外部控制器来处理其复杂的管理任务,这增加了软件复杂性和开发难度。eMMC 通过集成主控,将大容量存储这一复杂需求傻瓜化,让系统设计者能更专注于上层应用开发,是在成本、容量、易用性和性能之间取得平衡的优秀产物。

EEPROM

       全名是Electrically Erasable Programmable Read-Only Memory。EEPROM 容量通常较小,可字节级擦写,寿命长。常见用途是存储少量关键数据,如设备序列号、传感器校准值、用户个性化设置等。与 CPU 的连接方式多为 I2C 总线或 SPI 总线,这两种总线结构简单,适合传输少量数据,能满足 EEPROM 的数据交互需求。它的擦写无需像 Flash 那样以块为单位,操作更灵活。

为什么计算机系统不能只靠一种存储器?​

        看完前面的存储器分类,你可能会问:既然都是存数据,为啥不干脆用一种?

        答案很简单 ——没有任何一种存储器能同时满足 “速度快、容量大、成本低、断电存数据” 这四大核心需求,就像没人能同时兼顾 “跑得比博尔特快、力气比举重冠军大、还能像马拉松选手一样持久”。嵌入式系统的存储器选择,本质是 “用不同器件的优势,适配不同场景的需求”,具体矛盾体现在三个维度:​

        首先性能与易失性之间的矛盾。比如我们需要 “速度快” 的存储器让 CPU 实时处理数据 ——SRAM能做到纳秒级响应,但一断电数据就丢;如果强行用非易失性的 Flash 替代 RAM,哪怕是最快的 NVMe Flash,速度也比 DDR 内存慢 100 倍以上,会让 CPU 陷入 “等数据” 的卡顿,像用 U 盘当电脑内存一样离谱。反过来,若只用 RAM 当唯一存储,设备一断电,系统程序、用户数据全没了,每次开机都得重新装系统,显然不现实。​

        其次平衡容量与成本。大容量存储需要控制成本 ——NAND Flash、eMMC 能做到 “每 GB 成本几毛钱”,适合存系统镜像、用户文件;但如果把所有存储都换成 RAM,哪怕是成本较低的 DDR,16GB DDR5 的价格也能买 1TB eMMC,对嵌入式这样成本敏感的设备来说完全不可承受。同理,EEPROM 能字节级擦写、寿命长,但 1MB 容量的价格比 1GB SPI Flash 还高,若用它存固件,成本会飙升到无法量产。​

        最后是场景的适配。不同数据需要不同的 “存储特性”:CPU 运行时的临时数据,需要 “随用随取、速度快”,RAM 是唯一选择;设备启动的引导程序,需要 “断电能存、能直接读程序”,NOR Flash/SPI Flash 最适配;少量关键参数,需要 “能改、寿命长、占用空间小”,EEPROM 比 Flash 更合适;海量用户数据,需要 “容量大、写速度快、成本低”,NAND Flash 或 eMMC 才划算。​

### RK3588 设备通过 NorFlash 启动 U-Boot 并从 eMMC 加载内核的实现方式 #### 1. BootROM 阶段 RK3588 的启动过程始于其内置的 BootROM。在基于 NorFlash 的引导场景下,BootROM 将读取存储于 NorFlash 中的第一个阶段固件文件 `rk3399_loader_v1.27.126.bin` 或类似的 SPL(Secondary Program Loader),并将其加载至内部 SRAM 执行[^1]。 此阶段的主要功能包括: - 初始化 DDR 控制器以便后续可以访问外部内存。 - 跳转到位于 NorFlash 的下一阶段代码(通常是 u-boot-spl 或 ddr.bin)来完成 DDR 初始化。 #### 2. DDR 初始化与跳转 一旦 SPL 成功运行,它会执行必要的硬件初始化操作,特别是 DDR 内存控制器的配置。这一部分逻辑通常封装在一个独立的二进制文件中,称为 `ddr.bin`。该模块负责设置 DRAM 参数以使系统能够正常工作,并最终返回控制权给 BootROM。 随后,BootROM 继续处理流程,加载下一个组件——usbplug.bin 或者直接进入完整的 U-Boot 环境。如果目标是从 eMMC 获取进一步指令,则此时可能涉及 USB 下载工具或其他机制辅助完成镜像写入动作。 #### 3. U-Boot 主体加载 对于特定平台如 Rockchip SoC 来说,官方发布的通用版 U-Boot 可能并不完全适配所有细节需求;因此实际应用当中更多采用的是经过芯片制造商高度优化后的定制化版本[^3]。这些调整不仅限于驱动层面的支持改进,还包括针对不同外设接口特性的兼容性增强等方面的工作成果体现出来。 当 NOR Flash 上预置好的小型 SBL (Second Stage Bootloader) 把环境准备好以后, 完整形式下的 U-Boot 即被安置到了 RAM 更高位置处待命 [^2], 准备接收来自其他介质比如这里提到过的 EMMC 当中的 Linux kernel 映象数据流. 在此期间,U-Boot 进一步完成了如下几项重要任务: - 设置正确的 bootargs 设备树 blob( Device Tree Blob , DTB )路径. - 开启串口调试输出方便监控整个开机序列进展状况. 最后,U-Boot 使用命令诸如 'bootz' 或者 'booti',依据所选架构差异而定,将先前找到的目标操作系统核心映射装载起来从而正式开启 OS 层面的服务提供能力. ```bash # 示例:U-Boot 命令用于从指定地址加载启动内核 => setenv bootcmd "fatload mmc 0:1 ${kernel_addr_r} Image; fatload mmc 0:1 ${fdt_addr_r} rk3588-evb.dtb; booti ${kernel_addr_r} - ${fdt_addr_r}" => saveenv ``` 上述脚本片段展示了如何定义一条自动化的引导命令链路,在其中指定了要加载的内核及其对应的设备树描述符所在分区位置等必要参数。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值