Assembly INVD指令有什么用途?
显然,x86在不将内容写回内存的情况下使缓存层次结构无效 我很好奇,这样的指示有什么用?考虑到人们对不同缓存级别中的数据几乎没有控制权,对异步刷新的数据更没有控制权,这似乎只不过是一种确保您不知道内存中保存了哪些数据的方法。好问题 像Assembly INVD指令有什么用途?,assembly,x86,cpu-cache,Assembly,X86,Cpu Cache,显然,x86在不将内容写回内存的情况下使缓存层次结构无效 我很好奇,这样的指示有什么用?考虑到人们对不同缓存级别中的数据几乎没有控制权,对异步刷新的数据更没有控制权,这似乎只不过是一种确保您不知道内存中保存了哪些数据的方法。好问题 像invd这样的钝动作指令的一个用例是专门的或非常早期的引导代码,例如当RAM的存在或不存在尚未被验证时。由于我们可能不知道RAM是否存在,它的大小,甚至不知道它的特定部分是否正常工作,或者我们可能不想依赖它,因此CPU有时将自己缓存的一部分编程为RAM并将其作为RA
invd
这样的钝动作指令的一个用例是专门的或非常早期的引导代码,例如当RAM的存在或不存在尚未被验证时。由于我们可能不知道RAM是否存在,它的大小,甚至不知道它的特定部分是否正常工作,或者我们可能不想依赖它,因此CPU有时将自己缓存的一部分编程为RAM并将其作为RAM使用是很有用的。这称为缓存为RAM(汽车)。在设置CAR、使用CAR和拆除CAR模式的过程中,内核必须确保从未将任何内容从缓存写入内存
缓存为RAM
上车
要设置CAR,CPU必须设置为无填充缓存模式,并且必须将用于CAR的内存范围指定为写回。这可以通过以下步骤完成:
invd
整个缓存,防止任何缓存写操作被写出并导致混乱cr0.CD=0
)cr0.CD=1
)invd
完全删除CAR区域的内容,然后设置正常缓存模式
英特尔80486手册
英特尔暗示高速缓存是内存在网络中的使用。英特尔80486是第一个引入invd
指令的CPU。第12.2节改为:
12.2内部缓存的操作
软件控制高速缓存的操作模式。可以启用缓存(重置初始化后的状态)、在存在有效缓存线时禁用缓存(缓存的行为类似于快速内部RAM的模式)或完全禁用缓存
禁用缓存时必须遵循预防措施。每当CD设置为1时,如果副本仍在缓存中,i486处理器将不会读取外部内存。当NW设置为1时,如果数据在缓存中,i486处理器将不会写入外部内存。这意味着陈旧的数据可以在i486cpu缓存中生成。如果NW后来设置为0,或者缓存线后来由于缓存未命中而被覆盖,则此陈旧数据将不会写入外部内存。通常,禁用时应刷新缓存
在设置CD和NW时,通过使用测试寄存器加载数据,可以冻结缓存中的数据。这对于为时间关键中断代码和数据提供有保证的缓存命中非常有用
请注意,所有段应以16字节边界开始,以允许程序对齐缓存线中的代码/数据
用法示例
coreboot有一个描述上述过程的。幻灯片21使用了invd
指令
AMD称之为缓存,作为通用存储
其他用途
在某些情况下,由于DMA(直接内存访问)硬件导致缓存不一致,
invd
也可能有用。要详细说明iwillnotexistidnotexists对CAR的回答:
我认为它实际上是如何做到的
rep stos
应该使用类似ItoM的无RFO协议,即它只发送一个invalidate,而不发送RFO),所以我认为它需要映射到一个实际的设备,比如SPI flash,因为当从一个SAD中有映射但没有接收设备的设备读取数据时,当它到达IIO或IMC时,你会得到一个