【Linux驱动开发】NOR Flash 技术原理与 Linux 系统应用全解析

NOR Flash 技术原理与 Linux 系统应用全解析

文章目录

  • NOR Flash 技术原理与 Linux 系统应用全解析
      1. NOR Flash 技术详解
      • 1.1 存储原理与架构
      • 1.2 NOR vs. NAND Flash 对比
      • 1.3 接口类型
      1. 代码运行机制:XIP 技术
      • 2.1 XIP 原理图解
      • 2.2 启动流程与优化
      1. Linux 系统应用
      • 3.1 MTD 子系统架构
      • 3.2 设备树 (DTS) 配置范例
      • 3.3 常用工具链实战
      1. 总结

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 启动流程与优化

  1. Reset: CPU 复位,PC 指针指向 Reset Vector(通常在 Flash 起始地址)。
  2. Fetch: CPU 直接从 Flash 读取第一条指令。
  3. Boot: 执行 Bootloader(如 U-Boot SPL)。
  4. 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 开发者的基本功。

相关推荐
摇滚侠6 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush47 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5207 小时前
Linux 11 动态监控指令top
linux
不会C语言的男孩8 小时前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
古城小栈8 小时前
Unix 与 Linux 异同小叙
linux·服务器·unix
凡人叶枫9 小时前
Effective C++ 条款42:了解 typename 的双重意义
java·linux·服务器·c++
2601_9618752410 小时前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant
java_cj10 小时前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes
lsyeei10 小时前
linux 系统目录详解
linux·运维·服务器
森G10 小时前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt