从ATA层向设备发送TRIM命令

浅谈Android4.4和Android L中的trim技术 浅谈Android的trim技术,不同的版本trim技术的实现方式是有所不同的,本文主要介绍Android4.4和Android L中trim技术framework层的实现流程和vold层的简单介绍。 阅读详情

    ATA TRIM命令是文件系统用来通知设备哪些逻辑地址不再被占用,可以被设备回收为空闲空间,在ATA命令集中,TRIM命令只是DATAMANAGEMENT SET(DMS)命令的一个子命令,DMS命令是专门用来做设备优化的(The DATA SET MANAGEMENT command provides information for deviceoptimization (e.g., file system information),如图1所示,当DMS的feature属性最低位置1,发送的就是TRIM命令。

    TRIM命令的传送过程中,通过入口的方式传递需要告诉设备的LBA地址,比如需要告诉设备第11至18个block可以回收,在DMA的写buffer中共需8个字节,高16bit为len值8, 低48位为LBA起始地址11。 每个入口的长度因为用2个字节16bits表示,然后全0的reserved,所以每个入口最多可以表示65535个blocks,如需单次通知设备更多地址,就会再相应增加一个入口。

 

图1. DMS命令ATA格式

 

    发送ata_trim命令的代码如下,需要把它放到一个和内核一起编译的模块中,通过/proc/变量的值输入进行调用。 感兴趣的话,可以一起讨论喔微笑

int ata_trim(uint block, uint n_block)
{
	struct ata_queued_cmd *qc=NULL;
	struct ata_taskfile *tf =NULL; 
	struct sg_table *table=kmalloc(sizeof(struct sg_table),GFP_ATOMIC);
	int rc=0,  nents=1; //entry(sg list) number of scatter/gathering list in sg_table
	struct page *pg_pt;
	u32 size;
	void *buf;	//transfer buffer to send lba addresses...

	if(ata_dev_lookup())
		goto error_exit;

	/*allocate an ata cmd structure from the ata port*/
	qc = ata_qc_new_init(dev);
	if(unlikely(!qc))
		goto error_exit;

	/*allocate sg_table and sg list*/
	allocate_mempool();
	rc = __sg_alloc_table(table, nents, SCSI_MAX_SG_SEGMENTS,GFP_ATOMIC, scsi_sg_alloc);
	if (unlikely(rc)){
		__sg_free_table(table, SCSI_MAX_SG_SEGMENTS,scsi_sg_free);
		goto error_exit;
		}

	pg_pt=alloc_pages(GFP_ATOMIC,0);  //allocate 1page: 4k dataspace...
	if(!pg_pt)
		goto error_exit;
	printk("\nStarting block is : %lu , blocks count is : %d \n\n", block, n_block);
	
	sg_set_page(table->sgl, pg_pt, 8, 0);	// 8 bytes for 1 trim entry
	
	table->nents=1;
	table->orig_nents=1;
	ata_sg_init(qc,table->sgl,1); 

	qc->scsidone=my_scsidone; 
	qc->complete_fn=my_ata_scsi_qc_complete;
	
	//orignally for write_same of multiple areas... now to transfer only one LBA...
	buf = page_address(sg_page(table->sgl));	
	if(!buf)
		goto error_exit;
	//size is the used bytes and it is the size for DMA to transfer
	size = ata_set_lba_range_entries(buf, 4096, block, n_block);	
	qc->dma_dir=DMA_TO_DEVICE;
	qc->nbytes=size;	//data size in bytes to be transfered
	
	tf=&qc->tf;
	tf->protocol = ATA_PROT_DMA;
	tf->hob_feature = 0;
	tf->feature = ATA_DSM_TRIM;
	tf->hob_nsect = (size / 512) >> 8;
	tf->nsect = size / 512;
	tf->command = ATA_CMD_DSM;
	tf->flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE | ATA_TFLAG_LBA48 |
		     ATA_TFLAG_WRITE;

	if(!qc->sg || !qc->n_elem || !qc->nbytes)
		goto error_exit;

	ata_qc_issue(qc);
	mdelay(800);
	qc_error_disp(qc->err_mask);

	return 0;
error_exit:
	printk("\n\nTO client--------------Getting Resources	failed----------------- \n\n");
	return 1;
}




        
SSD中TRIM命令启用失败的报错与修复 SSD TRIM故障修复指南 SSD TRIM命令是提升固态硬盘性能的关键技术,能显著优化写入性能并延长使用寿命。摘要涵盖TRIM机制原理、各系统修复方案及预防措施: TRIM核心作用:通过标记无效数据块减少写放大,提升随机写入性能30-50%,延长闪存寿命20%以上 系统修复方案: Windows:通过fsutil命令或注册表修改启用 macOS:使用trimforce工具或修复内核扩展 Linux:修改/etc/fstab添加discard选项 高级诊断: 检查SSD健康状态(坏块率、剩余寿命) 验证P 阅读详情

相关推荐

​​9.2 TRIM命令实现与垃圾回收优化​

本文探讨PCIe存储扩展中TRIM命令与垃圾回收(GC)的优化策略。TRIM通过标记无效LBA减少GC开销,在PCIe NVMe SSD中采用异步和批量处理优化。GC优化方案包括动态区域映射、存储内数据迁移和热数据分离。PCIe适配涉及带宽分配、功耗管理,并以医疗影像系统为例展示优化效果:写放大从5.2倍降至1.8倍,寿命延长30%。最后提供TRIM验证、GC监控方法和典型问题解决方案,建议合理配置TRIM间隔并采用ZNS分区等优化措施。

amy_mhd的博客 583

使用AT命令操作Modem 3G/4G模块

除了标准的AT命令集,不同厂商可能会引入自定义的AT命令来支持特定的功能。这些自定义的AT命令可以用于设备的特定配置、控制和操作。例如,一个嵌入式设备制造商可能会引入用于控制设备唯一功能的AT命令。

虎哥LoveDroid 9648

ATA命令描述7.1版本

硬盘等的操作指令及其描述和使用方法。同时包含错误情况下的返回值得情况等。

STM32实战总结:HAL之FatFS

STM32实战总结:HAL之FatFS

qq_28576837的博客 4061

ATACMD:低级ATASATA硬盘诊断工具

ATACMD 低级ATA/SATA硬盘诊断工具 有关此程序的信息,请访问 http:\ 。

将CityScapes数据集转换为COCO格式的实例分割数据集

##¥##2019年结束前最后两小时,写出本年度最后一篇博客,不是博主没地方去跨年,实在是Coding乐趣无穷ahhhh ##¥## COCO数据集是研究实例分割的通用数据集,但是针对道路环境的数据较少,对于自动驾驶和移动机器人的应用并不适配。而提供道路环境的实例分割数据的数据集目前有KITTI、CityScapes、Apllo等,CityScapes算是应用较广,数据质量较高的一个,所以,本篇...

陆羽飞的博客 9940

ATA 和SATA

ATA 和SATA一.ATAATA是AT Attachment的缩写,意思是AT计算机上的附加设备。ATA可以使用户方便地在PC机上连接硬盘。 ATA标准从1994年至今共经历了7代标准,现在简述如下: ATA-1(1994):是最早的IDE标准。 ATA-2(1996):是EIDE的标准,支持PIO3,4和DMA 1,2传输方式,最大数据传输速度为16MB/s。 ATA-3(

JonnyWei的专栏 6138

UVM和System verilog笔记总结(四)

virtual sequence 即虚seq,用于管理多个实sequence的执行顺序。 下面有三个sequence,此时需要virtual sequence去管理这三个的顺序。 virtual sequence和virtual sequencer需要成对写,使用例化实的sequence和sequencer控制: 此时在virtual sequence里面启动,而不是之前在test.sv里面用default或start函数启动。具体方法如下:先例化 再启动,用 `uvm_do_on 实sequence

weixin_42655118的博客 642

FatFs模块功能配置选项

Fatfs模块的功能可以裁剪,通过配置宏定义实现,宏定义位于文件ffconf.h中。1.功能配置1.1 _FS_READONLY 使能或禁用与写相关函数。 当设置为只读(1)时,API函数f_write、f_sync、f_unlink、f_mkdir、f_chmod、f_rename、f_truncate、f_getfree。1.2 _FS_MINIMIZE 函数功能裁剪。1.3 _USE_STR...

朱工的专栏 2万+

COLMAP生成MVSNet数据集

COLMAP生成MVSNet数据集

qq_43307074的博客 5635

HP DL380G9 iLO降级Degrated及存储失败storage Failed报错如何解决?

HP DL380G9 iLO降级(Degrated)及存储失败(storage Failed)报错如何处理? ©Lander Zhang 专注外企按需IT基础架构运维服务,IT Helpdesk 实战培训践行者https://blog.51cto.com/lander 2018/09/7 7:30 问题描述 某沙特公司搭建的虚拟化环境中有一台ESXi主机报Storage Fialed警告但是仍...

weixin_34226182的博客 4847

存储笔记--导论篇

1.计算机器总线示意图 计算机总线工作模式:    半双工 总线或设备的位宽:     按照数据总线的条数 CPU位数:         内部寄存器到计算单元之前的总线条数 PCI总线:         目前台式机与服务器所普遍使用的一种南桥与外设连接的总线技术。PCI地址总线、数据总线分时复用。 系统总线(前端总线):   CPU与北桥连接的总线 内存总线:         内存

大圣编了个程 552

聚类教程:cisTopic——来自单细胞表观基因组学数据的顺式调控主题的概率建模

之前运行这步的时候报错了如下: 后来发现原因是Ubuntu自动把R包更新到4.2版本,但是Rstudio版本没有更新,更新Rstudio即可,更新Rstudio的教程看此教程:。

watermel__的博客 1051

SSD的TRIM到底是什么?

固态硬盘,也就是我们常说的SSD,跟传统机械硬盘相比,具有读写速度快、防震抗摔性强、低功耗、无噪音等特点,因此不少用户在升级自己的电脑硬件时,也愿意选择固态硬盘。虽然硬盘的主要作用是存储数据,但是不同的硬盘在自身的性能上有一些细微的差别,其中,固态硬盘有一个非常特殊的功能——TRIM指令。什么是TRIM指令?这个功能有什么作用?会对硬盘数据产生怎样的影响?我们将在今天的文章中,为您详细阐述这些问题...

weixin_33796205的博客 1806

从编译到调通:RK3588与FPGA的PCIe XDMA驱动实战解析

本文详细解析了在RK3588平台上为FPGA板卡编译、加载与调试PCIe XDMA驱动的完整实战流程。内容涵盖环境准备、Makefile深度定制、编译排错、驱动加载与内核日志解读、设备节点分析以及用户空间编程实战,旨在帮助开发者打通RK3588与FPGA之间的高速PCIe通信链路,实现稳定可靠的数据传输。

weixin_29304021的博客 482

昇腾,Ascend,NPU,mindie,镜像,部署vllm:第5篇,昇腾环境下部署蒸馏版deepseek-r1,并在dify中注册模型供应商

这两天没少折腾deepseek-r1。之前在A100上用ollama部署了一份DeepSeek-R1-Distill-Qwen-32B,感觉真的特别慢。现在,再用昇腾部署一遍,看看速度能不能更快。p.s. 类似的内容其实已经写了很多遍了。但感觉之前写得都太碎,不够顺畅。接着新模型写篇长文,把能包括的都包括进来。这样大家也不需要到处翻来翻去。

xiezhipu的博客 2450

TRIM 命令详解

TRIM指令详解:提升SSD性能与寿命的关键 TRIM是操作系统发送给SSD的ATA/NVMe指令,用于通知SSD哪些数据块已删除,可标记为空闲并重用。其核心价值在于解决SSD的“无效数据搬运”问题:若无TRIM,SSD在垃圾回收时仍会搬移已删除数据,导致写入放大(WAF)增加、性能下降和寿命缩短。TRIM通过直接标记无效数据块,显著提升垃圾回收效率,降低WAF,并保持长期性能稳定。 主流操作系统(Windows 7+、macOS 10.10.4+、Linux 2.6.33+)均支持TRIM,企业级NVMe

weixin_49423593的博客 200

Android 13 内置xapk安装包的方法

安装xapk 内置xapk

安卓兼职framework和app工程师的博客 223

SSD的TRIM原理及实践

作者:吴业亮 博客:wuyeliang.blog.youkuaiyun.com 一、原理 TRIM指令是微软联合各大SSD厂商所开发的一项技术,属于ATA8-ACS规范的技术指令。 TRIM是告诉NAND闪存固态存储设备要擦除哪些数据的SATA接口指令。当相关页面的数据可以被覆盖时,操作系统会发给SSD一个TRIM指令。SSD控制器等到主机开始删除和再次写入操作的时候,执行安全擦除操作。因为在写入操作过程中不用花时间去擦除原本的数据,写入速度要快得多。 Trim指令也叫disable delete notify(禁用删

本人任职于安超云技术架构部,拥有十余年云计算与AI经验。专注AI基础设施、分布式集群、高可用架构、虚拟化、存储、网络及数据库等领域。博客内容以学习笔记为主,力求准确,但个人能力所限,难免疏误。非常欢迎交流指正,期待与您共同探讨技术 8456

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

FTL——Trim命令

本文章内容来源《深入浅出SSD 固态存储核心技术 原理与实战.pdf》 对一个文件File A来说,用户看到的是文件,操作系统把文件划分为若干个逻辑块,然后写人SSD的闪存空间。当用户删除掉文件File A时,其实它只是切断用户与操作系统的联系,即用户访问不到这些地址空间;而在SSD内部,逻辑页与物理页的映射关系还在,文件数据在闪存当中也是有效的,如图4-35所示。 在没有Trim之前,SSD无法知道那些被删除的数据页是否无效,必须等到系统要求在相同的地方(用户空间、逻辑空间)写人数据时才知道那些数据是无

weixin_37981492的博客 1166

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

SSD 之Trim指令

Trim,其实是一个ATA指令,并无正式中文名称,操作系统发送此指令给SSD主控,以通知它哪些数据占用的地址是‘无效’的。        在讲解Trim的重要性前,先说一点文件系统的相关知识。当我们在操作系统中删除一个文件时,系统并没有真正删掉这个文件的数据,它只是把这些数据占用的地址标记为‘空’,即可以覆盖使用。但这只是在文件系统层面的操作,硬盘本身并不知道那些地址的数据已经‘无效’,除非系统

YuZhiHui_No1的专栏 7059

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

trim ssd_Linux中的固态驱动器:为SSD启用TRIM

trim ssd 在运行Linux的计算机上安装了第一个固态驱动器(SSD)之后,我已经开始研究如何保养它们。 固态驱动器的运行方式与传统磁驱动器不同,并且它们需要从软件方面进行不同的维护才能发挥最佳功能。 在传统的磁盘驱动器上,删除时,删除的文件不会从磁盘上完全删除。 这就是为什么您可以恢复已删除文件的原因。 本质上,文件系统仅引用磁盘上文件的位置,并且删除文件后,该引用将被删除,从而使您...

cumo3681的博客 564

Linux中的TRIM机制

背景:项目中使用了一块江波龙的32GB的emmc存储,运行两三个月左右发现emmc的健康度只剩70%。项目会通过rm命令定时删除日志文件。疑问是:linux中执行rm命令只是删除了文件的目录项(文件名)和 inode 引用,把占用的空间标记为 “空闲可覆盖”,实际上文件需要等下一次写入才会从磁盘删除。随着固态硬盘(SSD)的普及,用户对其性能和寿命的关注度日益提高。与传统机械硬盘(HDD)不同,SSD 基于 NAND 闪存芯片存储数据,其读写机制和寿命管理方式有本质区别。

qing22222222的博客 591

Trim or Discard or Unmap

trim 是ata 的一个指令,对应scsi指令是unmap,那么什么是trim呢?trim就是OS发送给ssd or other type controller, 告诉它哪些数据对应的LBA地址是无效的。之后trim就不做什么其他操作了。后续的事情由GC来进行。Secure erase是一则ATA安全擦除命令,用户清除磁盘上的所有数据。这则命令可以理解为主控的返厂状态命令...

weixin_34235371的博客 2147

SSD的TRIM功能有什么作用?

TRIM指令是微软联合各大SSD厂商所开发的一项技术,属于ATA8-ACS规范的技术指令。          TRIM是告诉NAND闪存固态存储设备要擦除哪些数据的SATA接口指令。当相关页面的数据可以被覆盖时,操作系统会发给SSD一个TRIM指令。SSD控制器等到主机开始删除和再次写入操作的时候,执行安全擦除操作。因为在写入操作过程中不用花时间去擦除原本的数据,写入速度要快得多。    

Gick 1万+

Android中的TRIM优化

要了解Android 4.3 TRIM支持对性能的提升,首先要了解的是TRIM。TRIM 是什么?  Trim-一个ATA指令,由操作系统发送给SSD主控制器,告诉它哪些数据占的地址是“无效”的。当你在电脑里删除一个文件的时候,操作系统并不 会真正的去删除它。操作系统只是把这个文件的地址标记为“空”,让它可以被再次使用,这表示这个文件所占的地址已经“无效”。但这会带来一个问题,硬盘并 不知道操作系

eclipse_xu 7131
上一篇: ~结尾的文件导致程序出错
下一篇: cmalloc和malloc
Iphone4
博客等级 码龄17年 17粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值