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개의 추가 데이터 세그먼트 레지스터"
286에서 386까지 도입된 추가 세그먼트 레지스터(FS/GS)의 역사에 대해 자세히 알아보려면 "Mellowcandle"의 답변을 참조하세요.여기
답변4
에서 get_fs()
fs는 다음을 나타냅니다.무료 구간.