内核函数“get_fs()”中的“fs”缩写是什么?

内核函数“get_fs()”中的“fs”缩写是什么?

Linux 内核有两个函数:

get_ds()get_fs()

根据本文,我知道ds是 的缩写data segment

但是,我无法猜测“fs”是什么缩写。

有什么解释吗?

答案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是“三个附加数据段寄存器”

来自英特尔 (Vol3A) Sys.Prg.Guide

要了解更多关于从 286 到 386 引入的额外段寄存器 (FS/GS) 的历史,请参阅“Mellowcandle”的答案这里

答案4

在 中get_fs(),fs 代表自由段

相关内容