在x86_64中,fs和gs寄存器只涉及有限的分段形式。仅以fs为例,fss如何注册FSBase MSR一起生成有效地址?
如果不更改fs而更改fs基数会怎样?还是更改fs基本会自动更改fs?
如果我更改fs寄存器而不更改fs基数会怎样?有效地址计算如何受到影响?
我们可以举一个简单的例子
mov %fs:(%eax), %ebx
FS体系结构寄存器与基于FS的内部寄存器是分开的。
和往常一样,使用段替代仅选择与该段关联的段基础,而不是默认的DS基或SS基(在64位模式下固定为0
。]]
fs
体系结构寄存器本身的实际值与它无关
mov %fs, %eax
实际读取FS寄存器本身,而不使用与其关联的内部基数/限制“寄存器”时,它才起作用。因为有多种方法可以设置内部FS基础(例如,使用wrmsr
或在较新的CPU the wrfsbase
instruction上),其效率要比wrfsbase
到mov
更高(以使其可以从GDT或LDT),操作系统通常会离开FS和GS体系结构寄存器= 0,为空选择器。
在裸机上,您也可以这样做。不要为创建一个带有所需基数的GDT条目而烦恼,并且%fs
将选择器插入mov
或%fs
;只需直接用%gs
或wrmsr
设置基数即可。
如果我更改fs寄存器而不更改fs基数会怎样?
不能,AFAIK。
wrfsbase
将触发从GDT或LDT加载内部段基数/限制寄存器(取决于您移动的值)。[请注意,有些人将这些内部事物称为“缓存”,但它们不是缓存。它们保证在您加载值时不会保留这些值,因此,如果您更改GDT条目而不用该选择器重新加载段寄存器,它们也将永远不会发生变化。
地址的计算也与往常一样:What is an effective address?,其中偏移量部分是编址模式指定的有效地址。有效的地址计算如何受到影响?
一如既往。基数+索引*比例+位移。请注意,“有效地址”只是完整地址的偏移部分,不包括段选择器或基址。
mov %reg/mem, %fs
线性
寻址模式默认为使用DS段基址,除非寻址模式中的“基址寄存器”为E / RBP或E / RSP,在这种情况下为SS基址。但是前缀字节可以覆盖默认值。这就是segment_base + offset
告诉汇编器发出的内容。