什么是“FS”/“GS”寄存器?

所以我知道下面的寄存器和它们的用途应该是什么样的:

  • CS =代码段(用于IP)

  • DS =数据段(用于MOV)

  • ES =目标段(用于MOVS等)

  • SS =堆栈段(用于SP)

但是,下面的寄存器有什么用途呢?

  • FS =“文件段”?

  • GS = ???

注意:我并没有问任何特定的操作系统 – 我问他们打算如何使用CPU,如果有的话。

它们的目标是什么,以及Windows和Linux所使用的是什么。

段寄存器的原意是允许程序访问许多不同的(大的)内存段,这些内存段是独立的,是永久虚拟存储的一部分。 这个想法来自1966年的Multics操作系统 ,它将文件视为简单的可寻址内存段。 没有BS“打开文件,写入logging,closures文件”,只是“将该值存储到该虚拟数据段中”,并使用脏页面刷新。

我们目前的2010年操作系统倒退了一大步,这就是为什么他们被称为“太监”。 你只能处理你的进程空间的单个段,给出一个所谓的“平坦(恕我直言)愚蠢的地址空间”。 x86-32机器上的段寄存器仍然可以用于真正的段寄存器,但没有人打扰过(前英特尔总裁安迪·格鲁夫(Andy Grove)在上个世纪有一个相当出名的公众形象,他的钱来实现这个function,没有人会用它,去吧,安迪!)

AMD在64比特时决定他们并不在乎是否将Multics作为一个select(这是慈善的解释;不可饶恕的是他们对Multics毫无头绪),所以禁用了64位模式下片段寄存器的一般function。 仍然需要线程来访问线程本地存储,并且每个线程都需要一个指针…在可以立即访问的线程状态(例如,在寄存器中)的某处…到线程本地存储。 由于Windows和Linux在32位版本中都使用FS和GS(感谢Nick的说明),所以AMD决定让64位段寄存器(GS和FS)主要用于这个目的(我想你可以让他们指向你的进程空间的任何地方;不知道如果应用程序代码可以加载它们)。 英特尔惊慌失措地以64位的价格夺取了AMD的市场份额,安迪退休后,决定只是复制AMD的计划。

如果每个线程的内存映射都有一个绝对的虚拟地址(例如0-FFF),那么它就是其线程本地存储(不需要[segment]寄存器指针!)。 在20世纪70年代,我在一个8位操作系统上做了这个工作,而且非常方便,就像有一大堆寄存器可以工作一样。

所以,段寄存器现在有点像你的附录。 他们服务一个退化的目的。 给我们集体的损失。

那些不了解历史的人注定不会重复; 他们注定要做一些事情。

寄存器FSGS是段寄存器。 它们没有处理器定义的目的,而是由操作系统运行它们的目的。 在Windows 64位中, GS寄存器用于指向操作系统定义的结构。 FSGS通常被OS内核用来访问线程特定的内存。 在Windows中, GS寄存器用于pipe理线程特定的内存。 Linux内核使用GS来访问特定于CPU的内存。