커널 함수 "get_fs()"에서 "fs"의 약어는 무엇입니까?

커널 함수 "get_fs()"에서 "fs"의 약어는 무엇입니까?

Linux 커널에는 두 가지 기능이 있습니다.

get_ds()그리고get_fs()

~에 따르면이 기사, 내가 아는 ds것은 의 약어입니다 data segment.

그런데 "fs"의 약어가 무엇인지 짐작할 수 없습니다.

설명이 있나요?

답변1

FS는 FS라는 추가 세그먼트 레지스터에서 나옵니다.386 아키텍처(두 번째 단락 끝)

내 생각엔 Intel이 데이터 세그먼트의 경우 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_fs에 작별 인사Jonathan Corbet의 기사에서는 get_fs/set_fs에서 fs를 사용하는 역사적인 이유를 설명합니다.

set_fs()의 원래 기능은 x86 프로세서의 FS 세그먼트 레지스터를 설정하는 것입니다. 이는 초기에 권한이 없는 코드가 액세스할 수 있는 가상 주소 범위를 제어하는 ​​데 사용되었습니다. 물론 커널은 이러한 방식으로 x86 세그먼트를 사용하는 것을 중단한 지 오래되었습니다.

답변3

Anthon이 위에서 설명했듯이 알파벳의 후속 문자는 추가 데이터 세그먼트임을 나타냅니다.

이는 아래에 표시된 Intel의 Vol-3A Sys.Prg.Guide에서 더 명확하게 볼 수 있습니다. ES/FS/GS는 다음과 같습니다."3개의 추가 데이터 세그먼트 레지스터"

Intel(Vol3A) Sys.Prg.Guide에서

286에서 386까지 도입된 추가 세그먼트 레지스터(FS/GS)의 역사에 대해 자세히 알아보려면 "Mellowcandle"의 답변을 참조하세요.여기

답변4

에서 get_fs()fs는 다음을 나타냅니다.무료 구간.

관련 정보