类型:【转载】
原文作者:【mengxp】
日期:【2012-9-5 19:41】
原文地址:http://bbs.pceva.com.cn/thread-58217-1-1.html

 

本帖最后由 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


下载
trimssd.rar (399.5 KB, 下载次数: 1806)

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

 

本帖最后由 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[1024];
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[0] = 1; //TRIM
pPassthru->CurrentTaskFile[1] = 1; //Number of 512-byte blocks of LBA Range Entries to be transferred.
pPassthru->CurrentTaskFile[6] = 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[6] & 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)

发表评论