mengxp 发表于 2012-9-5 19:41

[PCEVA首发]TrimSSD 支持XP系统的强制TRIM工具!9月16日更新

本帖最后由 mengxp 于 2012-9-16 17:02 编辑

Native版本已经支持x64版本windows(9月8日)
Native版本添加按任意键取消功能(9月16日)


TrimSSD是一款可以在任何Windows操作系统对SSD进行TRIM操作的软件

支持重启后对系统盘进行TRIM操作

速度超快,完胜任何同类软件。

仅支持NTFS文件系统,暂不支持FAT32。


**特别注意**

目前只是测试版,可能有bug,请在操作前*务必*备份重要数据。防止数据丢失!



我在以下平台测试通过

P8600
4G RAM
镁光M4 128G
WindowsXP sp3 (64G memory unlimited patched)

分区情况
20G / 10G(未4K对齐) / 10G / 10G / 70G

均为NTFS文件系统,都是4K簇

每个分区都Trim测试过,没有异常,数据无丢失无损坏。



期待高玩们的测试结果。

另寻合作

TrimSSD QQ群 113715040


主界面1



主界面2



Trim标记过程中



重启后对系统盘Trim



下载



如果提示缺少msvcr100.dll请使用下面链接下载(我的账号被限制附件200K)
http://www.vxgate.net/trimssd.rar

djsgd 发表于 2012-9-5 20:29

额这软件是楼主自己做的啊

crazyray 发表于 2012-9-5 21:10

不错啊不错啊

RAID 智能响应刚好缺少对SSD的TRIM管理

楼主这个软件不知道是否可作为替代方案

mengxp 发表于 2012-9-5 21:35

RAID之后好像就不支持trim了吧?

软件会发送ATA指令检测是否支持trim的 你可以试一下。

afc 发表于 2012-9-5 22:01

不错不错

mengxp 发表于 2012-9-5 22:09

下一步计划使用文件系统过滤驱动实现xp系统的删除文件后发送Trim

jeffxl 发表于 2012-9-5 22:49

猜测是查询MFT的文件、目录结构,暴露文件系统级别上看到的“剩余空间”部分。然后用“无效”逻辑数据填充文件系统表达的“剩余空间”并删除这些数据,致使剩余空间在逻辑分布上的平顺化和非碎片化,相当于整理了一次SSD的FTL,暴露了主控“看不到”的剩余空间部分以期更有利做主动GC和再次写入这些剩余空间时“平顺性、连续性”。

和INTEL的官方工具应该是异曲同工,通过文件级IO操作达成“优化”的目的,但操作是强制的而非标准TRIM指令。(TRIM只是告诉了这些物理地址“无效”,擦不擦、什么时候擦由固件策略定义)

Pale_Cheung 发表于 2012-9-5 23:09

这么快就有了。
raid 的 cache 盘还是不支持的么?

junweb 发表于 2012-9-5 23:48

占位,以观后效

mengxp 发表于 2012-9-5 23:57

本帖最后由 mengxp 于 2012-9-6 21:47 编辑

INTEL的官方工具是创建足够大的文件,然后获取这个文件的分配表,对文件的所有簇进行TRIM操作

而我的是直接获取卷位图。对未使用的簇进行TRIM操作,属于磁盘级操作,非文件系统IO。

卷位图是什么?请参考NTFS文件系统$Bitmap文件

显然我的这种方法是最快的,因为我不需要创建文件。

相对于intel的方法,他的不需要锁卷,我的要锁定卷以防止卷位图变化。

TRIM指令就是标记FLASH位图而已,这并不属于擦除(ERASE),标记操作由SSD内部完成
TRIM之后读不出数据不是因为擦除,而是因为Flash块被标记可以回收重映射,强制返回空数据。
TRIM存在的意义在于MLC写入寿命均衡算法(位于SSD固件内部)。

另外我的这就是标准的TRIM指令


ULONG TrimBlock(HANDLE hDrive,ULONGLONG StartLba,ULONG LbaCount)
{
    UCHAR szPassthru;
    PATA_PASS_THROUGH_EX pPassthru = (PATA_PASS_THROUGH_EX)szPassthru;
    ULONG dwPassthruLen = sizeof(ATA_PASS_THROUGH_EX) + 512;
    PLBA_RANGE_ENTRY pLbaEntry = (PLBA_RANGE_ENTRY)(szPassthru + sizeof(ATA_PASS_THROUGH_EX));
    ULONG dwBytesRet;
    BOOL bRet;

    memset(szPassthru,0,sizeof(szPassthru));
    pPassthru->Length = sizeof(ATA_PASS_THROUGH_EX);
    pPassthru->AtaFlags = ATA_FLAGS_DATA_OUT;
    pPassthru->DataTransferLength = 512;
    pPassthru->TimeOutValue = 10;
    pPassthru->DataBufferOffset = sizeof(ATA_PASS_THROUGH_EX);
    pPassthru->CurrentTaskFile = 1;      //TRIM
    pPassthru->CurrentTaskFile = 1;      //Number of 512-byte blocks of LBA Range Entries to be transferred.
    pPassthru->CurrentTaskFile = 6;      //DATA SET MANAGEMENT, DMA
    pLbaEntry->LbaLow = (DWORD)(StartLba & 0xFFFFFFFF);
    pLbaEntry->LbaHigh = (WORD)(StartLba >> 32);
    pLbaEntry->LbaCount = (WORD)LbaCount;

    bRet = DeviceIoControl(hDrive,IOCTL_ATA_PASS_THROUGH,pPassthru,dwPassthruLen,pPassthru,dwPassthruLen,&dwBytesRet,NULL);
    if(!bRet)
      return FALSE;

    if(pPassthru->CurrentTaskFile & 1)   //Any Error?
      return FALSE;
    return TRUE;
}

最有力的文档(摘自ATA命令规范 第99页,ATA8-ACS-2 Draft Rev.2__T13.pdf)
Information technology -
ATA/ATAPI Command Set - 2(ACS-2)

crazyray 发表于 2012-9-6 00:15

顶楼主一个 周么有空了好好研究下

jeffxl 发表于 2012-9-6 00:32

本帖最后由 jeffxl 于 2012-9-6 00:38 编辑

mengxp 发表于 2012-9-5 23:57 static/image/common/back.gif
7#版主你明显是小看了我的实力

INTEL的官方工具是创建足够大的文件,然后获取这个文件的分配表,对文件的 ...

了解你的操作原理和意图了,非常感谢解惑。如果代码上能避免不出现操作后数据逻辑结构的BUG的话,这个要加大分。

hoho9043 发表于 2012-9-6 00:39

{:7_386:}技术帝- -

jeffxl 发表于 2012-9-6 00:45

本帖最后由 jeffxl 于 2012-9-6 00:47 编辑

mengxp 发表于 2012-9-5 23:57 static/image/common/back.gif
7#版主你明显是小看了我的实力

INTEL的官方工具是创建足够大的文件,然后获取这个文件的分配表,对文件的 ...

这里有个问题,盘的FTL对应卷位图表达的未使用的簇对于SSD的FTL映射表来说,这些未使用的空间都是动态映射的(而真的干净颗粒BLOCK没必要形成LBA-PBA映射关系,动态使用即可)。HOST级操作“定位”的这些未使用簇其实大部分操作时间都被SSD返回空数据地址(虽然对HOST透明),实际上大部分簇对应的PBA地址都是空映射关系。你的操作是仅耗时(这也是没办法)对那些主控不知道的“脏页”用穷举所有文件系统未使用的簇发送TRIM指令来枚举操作,致使达到操作分区范围内映射的无效脏页可以被TRIM掉吧?

jeffxl 发表于 2012-9-6 01:07

在AMD AHCI环境下使用Kingston HyperX 240G刚测试通过。我系统分区和游戏分区这软件暂时无法独占IO,提示需要重启在独占模式下操作,所以这两个分区暂时未测试。

as0607891266 发表于 2012-9-6 01:19

支持一个 虽然不怎么懂

neeyuese 发表于 2012-9-6 02:41

看了下,说说我的想法,不知道对不对:

1.Intel的工具箱Trim做法,是在windows系统里生成很多2GB的空文件(数据为0x00,实际也就是不磨损介质)填充整个分区的容量,然后得到这些文件占用的地址并用DSM指令往SSD主控发送这些地址,让主控知道这些地址的数据都无效,好处是数据完整性高,虽然效率稍低,但不需要脱机运行。
2.你的工具利用NTFS元文件$Bitmap操作,跑的比Intel的windows文件操作更低一层,有点类似操作系统还原做的快照,但是要求拍照的时候停止一切IO,避免“成相”抖动造成数据结构完整性隐患,由于当前系统里有太多出问题的可能,比如杀毒软件,底层驱动之类,造成在系统里做快照的安全性降低,所以最好的办法是在系统启动这些非必要的驱动和服务之前对文件系统做快照,避免一切不必要的干扰,快照后把得到的信息用DSM传给SSD主控,好处是干净利落,缺点是需要重启。
3.如你所说,你接下去的开发目标是驱动层面分离出删除后的文件来进行Trim,这个你在发布前一定要多做数据完整性测试,并且建议安装一些比较底层的杀毒软件测试,因为这种出漏洞的几率非常高。

再一次支持你的开发成果并感谢分享,上面的理解如有错误也请指出。

mengxp 发表于 2012-9-6 08:56

读取位图之前会锁定分区。锁定之后所有文件级过滤驱动程序(杀毒软件通常都在这一级别),就会停止工作,因为正常的文件读写已经被系统禁止了,就不会有读写文件的请求。但是磁盘过滤级还在工作(磁盘还原类软件)。各个厂家做法不同,这个我没有测试过,不建议使用。

删除文件之后Trim还在可行性探究中。。

wsy2220 发表于 2012-9-6 12:12

强力支持原创软件!

cwk 发表于 2012-9-6 12:39

XP用户的福音
页: [1] 2 3 4 5 6
查看完整版本: [PCEVA首发]TrimSSD 支持XP系统的强制TRIM工具!9月16日更新