1

온라인 리눅스 커널과 많은 x86 튜토리얼에서 두 코드 세그먼트와 두 개의 데이터 세그먼트를 사용하는 것이 좋습니다. 두 개의 코드 세그먼트가 필요하다는 것을 이해합니다. CPL이 DPL (일치하지 않는 세그먼트의 경우)과 정확히 일치해야하기 때문입니다.두 개의 겹치는 데이터 세그먼트 (예 : Linux 커널)가있는 이유는 무엇입니까?

그러나이 튜토리얼과 StackOverflow 관련 질문 중 특히 두 가지 데이터 세그먼트가 필요한 이유는 분명하지 않습니다. CPL = 0 인 프로세스는 DPL = 3 인 데이터 세그먼트에 액세스 할 수 있으므로 코드 세그먼트와 다르게 작동합니다.

두 개의 데이터 세그먼트가있는 단점은 서로 다른 권한 수준의 프로세스간에 전환하는 경우 DS, ES 등의 레지스터를 다시로드해야한다는 것입니다.

내 구체적인 질문입니다 : 플랫 메모리 모델을 사용하므로 모든 코드와 세그먼트가 완전히 겹치지 만 한 명의 사용자가 아닌 사용자와 커널 데이터 세그먼트를 갖는 목적은 무엇입니까? 데이터 세그먼트?

답변

3

설명은 here입니다. SS는 레지스터, 스택 세그먼트, 세그먼트 셀렉터로드되면 인텔 매뉴얼에서 (5.7 절)

특권 레벨 검사 인용

도 발생한다.
스택 세그먼트와 관련된 모든 권한 수준은 CPL과 일치해야합니다. 즉, CPL, 스택 세그먼트 선택기의 RPL 및 스택 세그먼트 설명 자의 DPL이 동일해야합니다. RPL과 DPL이 CPL에 대해 과 같지 않으면 일반 보호 예외 (#GP)가 생성됩니다. 커널을로드 할 때

강조 꺼야

SS 0으로 DPL 같 가진 데이터 세그먼트를 요구 (또는 스위치 중).
32 비트 모드에서 마찬가지입니다. 64 비트 모드

, it is possible to use a NULL selector64 비트 모드 1

프로세서는 NULL 세그먼트 선택기에 의하면 런타임을 행하지 않는다 (이전 포함) 런타임 검사를 억제한다. 프로세서는 이 참조 세그먼트 레지스터에 NULL 세그먼트 선택기가있는 메모리에 액세스하려고하면 #GP 오류가 발생하지 않습니다. 완전성 중

, 스택 동작은 모든 관련 정보, 주소 크기 스택 주소 크기, 하나의 코드 세그먼트로부터 회수하거나 암시 (64)에 설정되어 및 오퍼랜드 크기를 수행 할 때 비트.


1 만약 내가 올바르게 기억 는 64 비트 모드는 여전히 호환성을 위해, 비록 커널 데이터 세그먼트를 사용합니다.

관련 문제