NOR Flash 技术原理与 Linux 系统应用全解析
文章目录
- NOR Flash 技术原理与 Linux 系统应用全解析
-
-
- NOR Flash 技术详解
-
- 1.1 存储原理与架构
- 1.2 NOR vs. NAND Flash 对比
- 1.3 接口类型
-
- 代码运行机制:XIP 技术
-
- 2.1 XIP 原理图解
- 2.2 启动流程与优化
-
- Linux 系统应用
-
- 3.1 MTD 子系统架构
- 3.2 设备树 (DTS) 配置范例
- 3.3 常用工具链实战
-
- 总结
-
1. NOR Flash 技术详解
NOR Flash 是一种非易失性闪存技术,由 Intel 于 1988 年开发。其核心特点是支持芯片内执行 (XIP, Execute In Place),即 CPU 可以直接通过总线读取指令并执行,而无需先将代码复制到 RAM 中。这一特性使其成为嵌入式系统 Bootloader 和固件存储的首选。
1.1 存储原理与架构
NOR Flash 的存储单元采用浮栅晶体管(Floating Gate Transistor)。

- Cell Structure : 采用并联结构(Parallel),每个存储单元直接连接到位线(Bit Line)。这使得它可以像 RAM 一样进行随机读取(Random Access)。
- Read Mechanism: 通过检测位线上的电流来判断存储单元是 '0' 还是 '1'。
- Write/Erase :
- 写入(编程):热电子注入(Hot Electron Injection)。一次只能写一个字(Word/Byte),且只能将 '1' 变为 '0'。
- 擦除:Fowler-Nordheim 隧道效应。必须按块(Block/Sector)擦除,将所有位重置为 '1'。
1.2 NOR vs. NAND Flash 对比
| 特性 | NOR Flash | NAND Flash |
|---|---|---|
| 读取速度 | 极快 (Random Access) | 较慢 (Page Read) |
| 写入速度 | 慢 | 快 |
| 擦除速度 | 很慢 | 快 |
| 容量成本 | 高 (低密度,通常 < 128MB) | 低 (高密度,GB/TB 级) |
| XIP 支持 | 支持 | 不支持 (需 Shadow 到 RAM) |
| 位反转 (Bit Flip) | 极少 (无需强 ECC) | 常见 (需强 ECC) |
| 应用场景 | 代码存储 (Bootloader, BIOS) | 数据存储 (SSD, eMMC, SD卡) |
1.3 接口类型
- Parallel NOR: 传统的地址/数据总线并行接口(CFI 标准),引脚多,速度快,但占用 PCB 空间大。
- SPI NOR: 串行接口,引脚少(通常 8 脚),封装小。
- Quad SPI (QSPI): 4 线数据传输,大幅提升带宽,是目前嵌入式系统的主流。
2. 代码运行机制:XIP 技术
XIP (Execute In Place) 是 NOR Flash 的灵魂。
2.1 XIP 原理图解

在 XIP 模式下,NOR Flash 被直接映射到 CPU 的物理地址空间(例如 0x08000000)。CPU 的取指单元(Fetch Unit)像访问 SRAM 一样访问 Flash。
2.2 启动流程与优化
- Reset: CPU 复位,PC 指针指向 Reset Vector(通常在 Flash 起始地址)。
- Fetch: CPU 直接从 Flash 读取第一条指令。
- Boot: 执行 Bootloader(如 U-Boot SPL)。
- Relocation: 初始化 DDR RAM,将主程序(或 Kernel)从 Flash 复制到 RAM(为了更快的运行速度)。
代码优化技巧:
- 减少擦写: 尽量避免在 NOR Flash 上频繁更新配置参数。使用磨损均衡(Wear Leveling)文件系统(如 JFFS2)或预留专门的参数扇区。
- 按块对齐: 固件升级时,确保写入的数据长度是 Page 的整数倍,起始地址是 Block 的边界。
3. Linux 系统应用
在 Linux 中,NOR Flash 通常由 MTD (Memory Technology Device) 子系统管理。
3.1 MTD 子系统架构

- MTD Core: 提供统一的读/写/擦除接口,屏蔽底层差异。
- SPI-NOR Framework: 专门处理 SPI 接口的 Flash,支持 JEDEC ID 自动识别。
- Partitioning : 将物理 Flash 划分为多个逻辑分区(如
mtd0,mtd1)。
3.2 设备树 (DTS) 配置范例
以下是一个典型的 QSPI NOR Flash 设备树节点配置:
dts
&qspi {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_qspi>;
flash0: w25q256@0 {
compatible = "jedec,spi-nor";
reg = <0>;
spi-max-frequency = <104000000>; /* 104 MHz */
m25p,fast-read;
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
partition@0 {
label = "bootloader";
reg = <0x00000000 0x00100000>; /* 1MB */
read-only;
};
partition@100000 {
label = "kernel";
reg = <0x00100000 0x00600000>; /* 6MB */
};
partition@700000 {
label = "rootfs";
reg = <0x00700000 0x01900000>; /* 25MB */
};
};
};
};
3.3 常用工具链实战
Linux 提供了 mtd-utils 工具包来管理 Flash。
1. 查看分区信息:
bash
mtdinfo /dev/mtd0
# 输出示例:
# Name: bootloader
# Type: nor
# Eraseblock size: 65536 bytes, 64.0 KiB
# Amount of eraseblocks: 16 (1048576 bytes, 1.0 MiB)
2. 擦除分区:
bash
flash_erase /dev/mtd1 0 0
# 参数说明:/dev/mtd1 是设备,第一个 0 是起始块,第二个 0 表示擦除到末尾
3. 写入镜像:
bash
# 将 zImage 写入 kernel 分区
flashcp -v zImage /dev/mtd1
4. 读取校验:
bash
# 读取前 64KB 数据
dd if=/dev/mtd0 of=boot_dump.bin bs=64k count=1
hexdump -C boot_dump.bin | head
4. 总结
NOR Flash 凭借其 XIP 特性和高可靠性,在嵌入式系统启动链路中扮演着不可替代的角色。掌握其在 Linux 下的驱动配置、分区规划及 MTD 工具使用,是嵌入式 Linux 开发者的基本功。