具体实施方式
本发明实施例提供一种从高速缓存向内存写数据的方法,本发明实施例还提供相应的装置。以下分别进行详细说明。
请参阅图1,本发明实施例中从高速缓存向内存写数据的方法的第一实施例,具体的:
101、通过Cache向第一地址写第一数据块;
中央处理器CPU通过Cache向第一地址写第一数据块,第一数据块的大小等于Cache的Cache Line的大小,第一地址为内存的逻辑地址;第一数据块包括测试数据,该测试数据的大小可能小于一个Cache Line的大小,这时,需要将测试数据增加填充数据,使得增大后的测试数据的大小等于一个Cache Line的大小,即第一数据块,例如:
测试数据为2字节,一个Cache Line的大小为4字节,这时,需要在测试数据中增加填充数据,以增大测试数据的大小,即第一数据块,第一数据块的结构如下表所示:
表1
表1为第一数据块的结构,第一数据块由测试数据和增加的填充数据组成,增加的填充数据的大小等于一个Cache Line的大小与测试数据的大小的差值;在本例中,一个Cache Line的大小为4字节,测试数据为2字节,所以增加的填充数据等于2字节;增加的填充数据可以与测试数据相同,增加在测试数据之后;也可以是随意的数据,例如为全零或全一,增加在测试数据之后;增加的填充数据放在测试数据之后的好处是,在从内存中回读测试数据时,只要根据测试数据的大小读第一数据块的前面相同大小的字节数据即为测试数据;
因为第一数据块的大小等于Cache的Cache Line的大小,刚刚能将Cache Line填满,所以Cache会将第一数据块先缓存在Cache Line中,而不直接写到内存的第一地址中。
第一数据块的大小也可以大于Cache Line的大小,只需保证能将Cache Line填满即可。此时,填充数据的大小可以大于Cache Line的大小与测试数据的大小的差值。
某些类型的Cache中,Cache Line总是被整体操作,第一数据块的大小也可以小于Cache Line的大小。
102、根据第一地址获取Cache中缓存第一数据块的Cache Line的索引;
根据已知的第一地址,计算出Cache中缓存第一数据块的Cache Line的索引。根据Cache具体型号不同,该计算方法也会不同。以一种常见的交换机用Cache为例,计算方法如下:
首先将第一地址向右做14位的逻辑移位运算后的值和十六进制数0x7F进行位与运算,计算出第一位移值;
然后将第一地址向右做7位的逻辑移位运算后的值和十六进制数0x7F进行位与运算,第二位移值;
再将第一位移值和第二位移值进行位异或运算,得出缓存第一数据块的Cache Line的索计算出引;
以上只是本实施例中计算Cache中缓存第一数据块的Cache Line的索引的一个具体的算法,对于特定的Cache也可以通过其他能算出该索引的等价算法,此处不做展开;本实施例中的算法不能视为对本方案的限定。
103、根据第一地址和索引获取第二地址;
根据已知的第一地址,以及步骤102计算得出的Cache中缓存第一数据块的Cache Line的索引,计算出第二地址用于写入第二数据块,使得将要写入第二地址的数据存放的Cache Line的索引与Cache中缓存第一数据块的Cache Line的索引相同,第二地址为内存的逻辑地址;
计算第二地址的具体步骤为:
首先对第二地址赋初值,第二地址的初值等于第一地址加上一个Cache Line的大小,使得第二地址和第一地址只相差一个Cache Line的大小;
然后将第二地址的初值进行右移7位运算后的值和十六进制数0x7F进行位与运算,计算出第三位移值;
再将第三位移值和计算出的Cache Line的索引进行位异或运算,计算出第四位移值;
再将第二地址的初值和十六进制数0xFFE03FFF进行位与运算,计算出第五位移值;
再将第四位移值进行左移14位运算,计算出第六位移值;
最后将第五位移值和第六位移值进行位或运算,计算出出最终的第二地址;
以上只是本实施例中计算第二地址的一个具体的算法,也可以通过其他能算出该第二地址的算法计算第二地址,此外对应于一个索引也可以有多个不同的第二地址,只要保证将写入第二地址的数据会在上述索引对应的Cache Line中缓存即可,此处不做展开;本实施例中的算法不能视为对本方案的限定。
104、通过Cache向第二地址写第二数据块;
在103步骤中计算出第二地址后,将第二数据块通过Cache向内存中的第二地址写入,这时候,因为第二数据块也将要存放于Cache中缓存第一数据块的Cache Line,而第一数据块已经把该Cache Line填满了,所以缓存第一数据块的Cache Line为了能腾出位置存放第二数据块,将会立即把第一数据块搬运到内存中的第一地址。
本发明实施例对第二数据块的大小没有要求,只需可以使Cache将第一数据块搬运到内存中的第一地址即可。通常的设计中第二数据块的大小等于Cache Line的大小,但也可以小于或大于Cache Line的大小。
某些类型的Cache中,Cache Line总是被整体操作,第一数据块的大小也可以小于Cache Line的大小,因此只要相同的Cache Line需要存放第二数据块,Cache总会将第一数据块搬运到内存中的第一地址。
第一数据块和第二数据块可以为相同的数据。
在本实施例中,采用先通过Cache向内存中指定第一地址写第一数据块,并通过该指定第一地址获取在Cache中存放的还未写入内存的数据的Cache Line的索引,并通过该指定第一地址和获取的索引计算出另一个指向该索引的第二地址,并再通过Cache向内存中的第二地址写入第二数据块,使得该索引对应的Cache Line因为被第一数据块填满,并且又需要存放第二数据块而向内存的第一地址中写入第一数据块,从而使得数据不会被长时间保留在没有透传功能的Cache中,及时写入内存中,从而不会因为回读不到内存的数据而导致检测失败。
请参阅图2,本发明实施例中从高速缓存向内存写数据的装置的第二实施例,具体的:
写第一数据块模块201,用于通过Cache向第一地址写第一数据块,第一数据块的大小等于Cache的Cache Line的大小,第一地址为内存的逻辑地址;
第一数据块包括测试数据,该测试数据的大小可能小于一个Cache Line的大小,这时,需要将测试数据增加数据,使得增大后的测试数据的大小等于一个Cache Line的大小,即第一数据块;例如:
测试数据为2字节,一个Cache Line的大小为4字节,这时,需要在测试数据中增加数据,以增大测试数据的大小,即第一数据块,第一数据块的结构如下表所示:
表2
表2为第一数据块的结构,第一数据块由测试数据和增加的填充数据组成,增加的填充数据的大小等于一个Cache Line的大小与测试数据的大小的差值;在本例中,一个Cache Line的大小为4字节,测试数据为2字节,所以增加的填充数据等于2字节;增加的填充数据可以与测试数据相同,增加在测试数据之后;也可以是随意的数据,增加在测试数据之后;增加的填充数据放在测试数据之后的好处是,在从内存中回读测试数据时,只要根据测试数据的大小读第一数据块的前面相同大小的字节数据即为测试数据;
因为第一数据块的大小等于Cache的Cache Line的大小,刚刚能将Cache Line填满,所以Cache会将第一数据块先缓存在Cache Line中,而不直接写到内存的第一地址中。
第一数据块的大小也可以大于Cache Line的大小,只需保证能将Cache Line填满即可。此时,填充数据的大小可以大于Cache Line的大小与测试数据的大小的差值。
某些类型的Cache中,Cache Line总是被整体操作,第一数据块的大小也可以小于Cache Line的大小。
获取索引模块202,用于根据第一地址获取Cache中缓存第一数据块的Cache Line的索引;
获取第二地址模块203,用于根据第一地址和Cache Line的索引获取第二地址,使得将要写入第二地址的第二数据块也缓存于Cache Line的索引对应的Cache Line,第二地址为内存的逻辑地址;
写第二数据块模块204,用于通过Cache向第二地址写第二数据块,因为第一数据块已经将Cache Line填满,所以使得Cache Line的索引对应的缓存第一数据块的Cache Line条将第一数据块写入第一地址。
本发明实施例对第二数据块的大小没有要求,只需可以使Cache将第一数据块搬运到内存中的第一地址即可。通常的设计中第二数据块的大小等于Cache Line的大小,但也可以小于或大于Cache Line的大小。
某些类型的Cache中,Cache Line总是被整体操作,第一数据块的大小也可以小于Cache Line的大小,因此只要相同的Cache Line需要存放第二数据块,Cache总会将第一数据块搬运到内存中的第一地址。
第一数据块和第二数据块可以为相同的数据。
获取索引模块202可以包括:
计算第一位移值单元,用于将第一地址向右做14位的逻辑移位运算后的值和十六进制数0x7F进行位与运算,计算出第一位移值;
计算第二位移值单元,用于将第一地址向右做7位的逻辑移位运算后的值和十六进制数0x7F进行位与运算,计算出第二位移值;
计算索引单元,用于将计算第一位移值单元计算出的第一位移值和计算第二位移值单元计算出的第二位移值进行位异或运算,得出缓存第一数据块的Cache Line的索引。
获取第二地址模块203可以包括:
第二地址赋初值单元,用于对第二地址赋初值,第二地址的初值等于第一地址加上一个Cache Line的大小,使得第二地址和第一地址只相差一个Cache Line的大小;
计算第三位移值单元,用于将第二地址的初值进行右移7位运算后的值和十六进制数0x7F进行位与运算,计算出第三位移值;
计算第四位移值单元,用于将计算第三位移值单元计算出的第三位移值和获取索引模块202获取的Cache Line的索引进行位异或运算,得第四位移值;
计算第五位移值单元,用于将第二地址的初值和十六进制数0xFFE03FFF进行位与运算,计算出第五位移值;
计算第六位移值单元,用于将计算第四位移值单元计算出的第四位移值进行左移14位运算,计算出第六位移值;
计算第二地址单元,用于将计算第五位移值单元计算出的第五位移值,和计算第六位移值单元计算出的第六位移值进行位或运算,得出最终的第二地址。
在本实施例中,采用先通过Cache向内存中指定第一地址写第一数据块,并通过该指定第一地址获取在Cache中存放的还未写入内存的数据的Cache
Line的索引,并通过该指定第一地址和获取的索引计算出另一个指向该索引的第二地址,并再通过Cache向内存中的第二地址写入第二数据块,使得该索引对应的Cache Line因为被第一数据块填满,并且又需要存放第二数据块而向内存的第一地址中写入第一数据块,从而使得数据不会被长时间保留在没有透传功能的Cache中,及时写入内存中,从而不会因为回读不到内存的数据而导致检测失败。
本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取存储器(RAM,RandomAccess Memory)、磁盘或光盘等。
以上对本发明实施例所提供的从高速缓存向内存写数据的方法以及装置进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。