0CCh Blog

SSD TRIM功能的一些记录

如今SSD越来越普及了,本来就想了解下关于SSD的一些情况,正好工作中有机会接触这一块的东西,很幸运。这里先记录一些已知知识,方便以后自己查阅。

说到SSD,第一个想到的就是读写速度快。那个就要归功于其存储原理,关于SSD存储原理的文章很多,我这里简单通俗的描述一下:

  1. SSD存储不同于机械硬盘,他没有机械硬盘所谓的扇区、柱面,磁头。查询逻辑地址上的数据没有机械上的寻址(没有马达)。SSD的存储介质是闪存。
  2. SSD存储数据被覆盖的时候不会马上覆盖原有数据,而是继续往之前没有写的闪存上写。因为闪存擦除次数非常有限,同一个地方小范围反复擦除会导致整个SSD的寿命缩短。
  3. SSD内部是有自己的GC(垃圾回收器),这个GC擦除不需要的数据以及调整需要的数据的位置,能帮助SSD进行擦除平衡。

而这里重点要说到的TRIM功能就是辅助GC更好工作的一环。从Windows 7开始,文件系统上已经集成了自动TRIM功能。但是早些时候的系统,例如Windows XP,就没有这样的功能了。所以手动TRIM工具就出现了。比如Intel的固态硬盘工具集,其中就包含了手动TRIM功能。也许,有人回想,SSD的高端用户团体怎么会还在使用XP呢?不幸的是还真有这样一群坚守XP的SSD用户。下面就记录一些关于执行TRIM要做的事情。

先决条件:

  1. 要执行TRIM,首先要确保自己的硬盘模式是AHCI的。
  2. 然后,系统需要时XP SP2 RC2以上(我想就算是XP的用户,现在也应该都是SP3了吧)。

上面的第一条非常重要,因为目前世面上的大部分盗版盘和所有正版安装盘,都是没有带AHCI驱动的。也就是说,如果你的BIOS上把硬盘模式调整为AHCI,那你回没有任何意外看到一个蓝屏。少部分盗版系统盘会说明自己是支持AHCI的,否则,就需要在IDE/ATA模式下,安装系统,然后去网上找到你的BIOS所指定AHCI驱动,安装后在把BIOS调整回AHCI。

最后,来看看执行TRIM的一种思路:

  1. 判断系统版本,硬盘的控制器,SSD是否支持TRIM。
  2. 创建多个1G的文件,直到占满所有磁盘空间。
  3. 获得这些文件的基于卷的簇。
  4. 将簇转换成基于卷的逻辑地址。
  5. 将基于卷的逻辑地址转换成基于硬盘的逻辑地址。
  6. 按照ATA文档,发送TRIM指令。
  7. 删除所有创建的1G文件。

上面有几个和ATA相关的简单介绍下。首先是SSD是否支持TRIM的问题,需要发送DEVICE IDENTIFY指令,获得硬盘数据,其中WORD 169表示是否支持TRIM,如果是1就是支持了。其次,发生TRIM指令,实际上发送的是DATA SET MANAGEMENT指令,其中Features register设置为1,即为TRIM指令了。至于如何在没有驱动的情况下发生这些指令(这也是我要求系统版本要是XP SP2 RC2以上的原因),可以利用DeviceIOControl函数发送IOCTL_ATA_PASS_THROUGH来完成。

这些记录已经很详细了,那几百行的代码就没必要贴出来了。

另外TRIM还有一个思路,实现起来可以麻烦一些,简单说说吧:

  1. 首先获得NTFS的Bitmap,获得空闲的簇。
  2. 转换空闲的簇到基于硬盘的逻辑地址。
  3. 发送TRIM指令

之所以说这个比较麻烦,是因为他需要保证在进行TRIM的时候,NTFS不发生写操作。方法就是LOCK VOLUME,但不幸的是,系统盘是没法LOCK的,所以这就不得不写一个Native Application,放在开机的时候运行,也就是Check Disk运行的时机。这个思路的优点是:TRIM全面,精确,速度快。

差不多就是这些了,希望这个记录对自己和他人都有所帮助。