1. 存储设备概述

大家好,我是老张。做嵌入式存储这块十几年了,今天咱们来聊聊存储设备。说实话,很多人觉得存储不就是存个数据嘛,有什么好讲的?但我在项目里踩过的坑,十有八九都跟存储有关。你想想看,CPU再快,外设再强,存储跟不上,整个系统就像堵车的高速公路——白搭。

1.1 存储设备分类

先说说市面上常见的存储设备。我按自己的习惯,把它们分成两大类:机械存储固态存储

HDD(机械硬盘)

HDD这东西,老工程师都不陌生。它靠磁头在旋转的盘片上读写数据。我记得刚入行那会儿,项目里用的还是IDE接口的HDD,40针排线,又宽又硬,走线特别麻烦。HDD的优点就是便宜,容量大。但缺点也很明显——怕震动、速度慢、功耗高。

注意:我曾经在一个车载项目里用了HDD,结果车子一颠簸,硬盘就出坏道。后来全换成SSD了,教训深刻。

SSD(固态硬盘)

SSD现在基本是标配了。它用NAND Flash芯片存储数据,没有机械结构。速度快、抗震、功耗低。但SSD也有自己的脾气——写次数有限、需要垃圾回收、怕掉电。

我个人习惯把SSD按接口再分:SATA SSD、M.2 SATA SSD、M.2 NVMe SSD。速度差距很大,后面会细说。

eMMC

eMMC在嵌入式设备里用得特别多。手机、平板、机顶盒,到处都是。它把NAND Flash和控制器封装在一起,对外提供标准接口。说白了,就是一个小型化的存储方案。

我建议做嵌入式开发的朋友,优先考虑eMMC。为什么呢?因为它省心。坏块管理、ECC纠错,控制器都帮你做了。你只需要发读写命令就行。

UFS

UFS是eMMC的升级版。速度更快,功耗更低。现在高端手机基本都用UFS 3.0或UFS 4.0。它的接口是串行的,全双工,可以同时读写。嗯,这个特性很重要。

NVMe

NVMe是专门为SSD设计的协议。它直接跑在PCIe总线上,延迟极低。我做过一个项目,从SATA SSD换成NVMe SSD,数据库查询速度提升了将近5倍。你想想看,这差距有多大。

1.2 存储设备工作原理

这部分我尽量讲得通俗点。毕竟咱们是搞实战的,不是写论文。

HDD的工作原理

HDD内部有一个或多个盘片,高速旋转(5400转、7200转、甚至15000转)。磁头悬浮在盘片表面,通过电磁感应读写数据。数据是按磁道、扇区组织的。

这里有个关键点:寻道时间。磁头从一个磁道移到另一个磁道,需要时间。这个时间通常是几毫秒。你想想看,几毫秒在CPU眼里,简直是天文数字。所以HDD的随机读写性能很差。

SSD的工作原理

SSD的核心是NAND Flash。它按页(Page)读写,按块(Block)擦除。一个块包含多个页。写入数据时,只能写到空页。如果要修改已有数据,得先把整个块读出来,擦除,再写回去。这就是所谓的写放大

核心要点:SSD的控制器会做磨损均衡、垃圾回收、坏块管理。这些对性能影响很大。不同厂商的固件算法不同,性能差异也很大。

eMMC和UFS的工作原理

eMMC和UFS都是嵌入式存储方案。它们内部有控制器,对外提供标准命令集。eMMC基于MMC协议,UFS基于SCSI协议。UFS支持命令队列,可以同时处理多个请求,所以性能更好。

我记得有一次调试eMMC驱动,发现读写速度上不去。查了半天,原来是没开启HS400模式。默认跑在HS200,速度差了一倍。嗯,这种细节很容易忽略。

1.3 存储设备接口标准

接口标准这块,我建议你重点掌握。因为驱动移植,说白了就是跟接口打交道。

SATA

SATA是串行ATA的缩写。它取代了老旧的PATA(并行ATA)。SATA 3.0的理论带宽是6Gbps,实际有效速度约550MB/s。这个速度对HDD来说绰绰有余,但对SSD来说,已经成了瓶颈。

SATA版本 带宽 实际速度
SATA 1.0 1.5Gbps ~150MB/s
SATA 2.0 3Gbps ~300MB/s
SATA 3.0 6Gbps ~550MB/s

PCIe

PCIe是高速串行总线。它用通道(Lane)来传输数据,每个通道都是双向的。PCIe 3.0单通道带宽约1GB/s,PCIe 4.0翻倍,PCIe 5.0再翻倍。NVMe SSD通常用PCIe 3.0 x4或PCIe 4.0 x4,带宽非常可观。

我建议你在选型时,优先考虑PCIe接口的SSD。虽然贵一点,但性能提升是实打实的。

AHCI

AHCI是SATA控制器的标准接口。它定义了寄存器级接口和命令队列。AHCI支持NCQ(原生命令队列),可以优化多个读写请求的执行顺序。但AHCI是为HDD设计的,对SSD来说,效率不高。

小技巧:如果你在Linux下用SATA SSD,可以检查一下是否开启了NCQ。用cat /sys/block/sda/device/queue_depth查看队列深度。

NVMe

NVMe是专门为SSD设计的协议。它充分利用了PCIe的低延迟和高带宽。NVMe的核心思想是:减少软件开销,发挥硬件性能

NVMe有几个关键特性:

  • 多队列:支持64K个队列,每个队列深度64K。可以充分利用多核CPU。
  • 中断聚合:减少中断次数,降低CPU负载。
  • 无锁设计:每个CPU核心有自己的队列,不需要加锁。

我曾经在一个项目里,把AHCI驱动换成NVMe驱动,4K随机读写性能提升了3倍。你想想看,这差距有多大。

知识体系总览

下面这张图,是我自己画的。它把存储设备的分类、工作原理、接口标准串在了一起。你一看就明白。

存储设备知识体系 存储设备分类 HDD SSD eMMC UFS NVMe 工作原理 磁记录(HDD) NAND Flash(SSD/eMMC/UFS) PCIe协议(NVMe) 接口标准 SATA PCIe AHCI NVMe协议

这张图把整个知识体系串起来了。从上往下看:先搞清楚有哪些存储设备,再理解它们怎么工作的,最后掌握接口标准。这样你写驱动的时候,心里就有底了。

我的建议:刚开始接触存储驱动,别急着看代码。先把这张图印在脑子里。搞清楚设备类型、工作原理、接口标准,写代码就是水到渠成的事。

好了,这一章就讲到这里。下一章咱们开始实战,讲存储设备驱动框架。到时候我会拿一个实际的eMMC驱动来拆解,看看代码是怎么写的。


公众号:蓝海资料掘金营,微信deep3321