答案1
FS 来自于名为 FS 的附加段寄存器386 架构(第二段结尾)。
我的猜测是,在 DS 代表数据段和 ES 代表额外段之后,英特尔只是寻找字母表中的下一个字符(FS、GS)。你可以在上面看到386寄存器维基页面,在右侧的图形上。
来自我的 Linux Mint 系统上的 Linux 内核源代码 ( arch/x86/include/asm/uaccess.h
):
/*
* The fs value determines whether argument validity checking should be
* performed or not. If get_fs() == USER_DS, checking is performed, with
* get_fs() == KERNEL_DS, checking is bypassed.
*
* For historical reasons, these macros are grossly misnamed.
*/
#define MAKE_MM_SEG(s) ((mm_segment_t) { (s) })
#define KERNEL_DS MAKE_MM_SEG(-1UL)
#define USER_DS MAKE_MM_SEG(TASK_SIZE_MAX)
#define get_ds() (KERNEL_DS)
#define get_fs() (current_thread_info()->addr_limit)
#define set_fs(x) (current_thread_info()->addr_limit = (x))
答案2
最近的一篇文章,告别 set_fsJonathan Corbet 发布的文章解释了在 get_fs/set_fs 中使用 fs 的历史原因。
set_fs()最初的作用是设置x86处理器的FS段寄存器,早期用于控制非特权代码可以访问的虚拟地址范围。当然,内核早已停止以这种方式使用 x86 段了。
答案3
正如 Anthon 上面所解释的,只是字母表中的后续字母表示它们是附加数据段。
这一点在Intel的Vol-3A Sys.Prg.Guide中看得更清楚,如下所示,其中说ES/ FS/ GS是“三个附加数据段寄存器”
要了解更多关于从 286 到 386 引入的额外段寄存器 (FS/GS) 的历史,请参阅“Mellowcandle”的答案这里
答案4
在 中get_fs()
,fs 代表自由段。