TrimSSD 支持XP系统的强制TRIM工具!
类型:【转载】
原文作者:【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)