当前位置:   article > 正文

鲲鹏服务器ARM硬件的高字节忽略(Top Byte Ignore,TBI)_top byte ignored

top byte ignored

HWASan1 和HWASanIO2 等借助ARM的高字节忽略(Top Byte Ignore,TBI)的硬件特性,使用内存标记检测内存错误。TBI是指64位ARM机器中,程序64位地址中最高的字节被硬件忽略,实际的地址空间只有56位。我们在鲲鹏服务器和openEuler操作系统上验证这个特性。x86的机器上没有这一特性,我们也在个人台式计算机的Ubuntu WSL上作验证。有基于此,本文编写代码并做对比测试。

验证环境

我们使用装载鲲鹏920(ARMv8.2)处理器的泰山服务器上完成验证,操作系统为openEuler。

$ uname -a
Linux Taishan200 5.10.0-60.18.0.50.oe2203.aarch64 #1 SMP Wed Mar 30 02:43:08 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux
  • 1
  • 2

验证代码

我们编写代码如下。逻辑很简单,将一个正常的指针的高字节置为0xff,在鲲鹏服务器上,程序依然能够正确寻址,而在x86上不行。

#include <stdio.h>

int main(){
	int a = 100;
    int *p = &a;
	printf("p=%p, *p=%d\n", p, *p);
	unsigned long tmp = (unsigned long)p;
	tmp |= 0xff00000000000000;
	p = (void*)tmp;
	printf("p=%p, *p=%d\n", p, *p);
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

运行结果

使用gcc编译运行,发现,在ARM机器上,篡改指针的头部字节,并不会影响指针访问内存;而在x86上则会报告段错误。

在ARM机器上的运行结果

p=0xfffff8f02e8c, *p=100
p=0xff00fffff8f02e8c, *p=100
  • 1
  • 2

在x86机器上的运行结果

p=0x7ffcbd058c44, *p=100
Segmentation fault
  • 1
  • 2

上述结果可以看出,ARM硬件确实忽略了指针的头部字节。而这个特性,在x86硬件上没有。


  1. https://clang.llvm.org/docs/HardwareAssistedAddressSanitizerDesign.html ↩︎

  2. https://dl.acm.org/doi/10.1145/3589250.3596139 ↩︎

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/807327
推荐阅读
相关标签
  

闽ICP备14008679号