【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 开发者的基本功。

相关推荐
IT运维爱好者2 小时前
【Linux】LVM理论介绍、实战操作
linux·磁盘扩容·lvm
LEEE@FPGA2 小时前
ZYNQ MPSOC linux hello world
linux·运维·服务器
郝学胜-神的一滴2 小时前
Linux定时器编程:深入理解setitimer函数
linux·服务器·开发语言·c++·程序人生
冉佳驹2 小时前
Linux ——— 系统中的用户身份切换、文件权限管理、特殊权限和粘滞位设置
linux·chmod·chown·粘滞位·su 命令·chgrp·umask
Tranquil_ovo3 小时前
【Linux】Makefile 基础
linux
漏洞文库-Web安全3 小时前
Linux逆向学习记录
linux·运维·学习·安全·web安全·网络安全·逆向
无奈笑天下3 小时前
【银河麒麟高级服务器部署本地yum源】
linux·运维·服务器·经验分享
dodod20123 小时前
Ubuntu 24.04 LTS 使用清华大学的 Ubuntu 镜像源以加速下载和更新操作
linux·运维·ubuntu
轻颂呀3 小时前
TCP协议
linux·网络·网络协议·tcp/ip