x86 CPU가 4 개의 "링"중 2 개만 사용하는 이유는 무엇입니까?

0
294

why-do-x86-cpus-only-use-two-out of four-rings-00

운영 체제와 운영 체제가 어떻게 작동하고 서로 상호 작용하는지에 대해 더 많이 배우면, “리소스”가 이상하거나 활용률이 낮은 것으로 보이는 것에 놀랄 수 있습니다. 왜 그런 겁니까? 오늘의 수퍼 유저 Q & A 게시물에는 궁금한 독자의 질문에 대한 답변이 있습니다.

오늘의 질문 및 답변 세션은 커뮤니티 중심의 Q & A 웹 사이트 그룹 인 Stack Exchange의 하위 부문 인 SuperUser에 의해 제공됩니다.

Lemsipmatt (Flickr)의 사진 제공.

질문

수퍼 유저 리더 AdHominem은 x86 CPU가 4 개의 링 중 2 개의 링만 사용하는 이유를 알고 싶어합니다.

Linux 및 Windows 기반 x86 시스템 만 사용 링 0 커널 모드 및 반지 3 사용자 모드. 어쨌든 프로세서가 모두 두 개만 사용한다면 네 개의 다른 링을 구별하는 이유는 무엇입니까? 이것은 AMD64 아키텍처에서 변경 되었습니까?

x86 CPU가 4 개의 링 중 2 개의 링만 사용하는 이유는 무엇입니까?

대답

수퍼 유저 기고자 Jamie Hanrahan이 다음과 같이 답변합니다.

두 가지 주요 이유가 있습니다.

첫 번째는 x86 CPU가 4 개의 메모리 보호 링을 제공하지만 그에 따라 제공되는 보호 수준은 세그먼트 별 수준에 불과하다는 것입니다. 즉, 각 세그먼트는 쓰기 금지와 같은 다른 보호 기능과 함께 특정 링 (권한 수준)으로 설정 될 수 있습니다. 그러나 사용 가능한 세그먼트 디스크립터가 많지 않습니다. 대부분의 운영 체제는 개별 페이지와 같이 훨씬 더 세분화 된 메모리 보호 기능을 원합니다.

따라서 페이지 테이블 기반 보호를 입력하십시오. 전부는 아니더라도 대부분의 최신 x86 운영 체제는 분할 메커니즘을 무시하고 페이지 테이블 항목의 하위 비트에서 사용 가능한 보호 기능에 의존합니다. 이 중 하나를 “권한있는”비트라고합니다. 이 비트는 페이지에 액세스하기 위해 프로세서가 “권한있는”레벨 중 하나에 있어야하는지 여부를 제어합니다. “권한있는”수준은 PL 0, 1 및 2. 그러나 이는 1 비트에 불과하므로 페이지 별 보호 수준에서 메모리 보호와 관련하여 사용 가능한 “모드”의 수는 2 개에 불과합니다. 비 권한 모드에서 페이지에 액세스 할 수 있는지 여부입니다. 따라서 두 개의 고리 만 있습니다. 각 페이지에 대해 4 개의 가능한 링을 가지려면 각 페이지 테이블 항목에 2 개의 보호 비트가 있어야 4 개의 가능한 링 번호 중 하나를 인코딩 할 수 있습니다 (세그먼트 디스크립터와 마찬가지로). 그러나 그렇지 않습니다.

다른 이유는 운영 체제 이식성에 대한 요구입니다. x86에 관한 것이 아닙니다. 유닉스는 운영 체제가 여러 프로세서 아키텍처에 상대적으로 이식성이 있으며 좋은 것이라고 가르쳤다. 그리고 일부 프로세서는 두 개의 링만 지원합니다. 아키텍처의 여러 링에 의존하지 않기 때문에 운영 체제 구현자는 운영 체제를보다 이식 가능하게 만들었습니다.

Windows NT 개발과 관련된 세 번째 이유가 있습니다. NT의 디자이너 (David Cutler와 그의 팀, Microsoft가 DEC Western Region Labs에서 고용 한 팀)는 VMS에 대한 광범위한 경험을 가지고있었습니다. 실제로 Cutler와 다른 몇 명은 VMS의 독창적 인 디자이너였습니다. 또한 VMS가 설계된 VAX 프로세서에는 4 개의 링이 있습니다 (VMS는 4 개의 링을 사용함).

하지만 VMS에서 실행 된 구성 요소는 고리 1과 2 NT 레코드에는 레코드 관리 서비스와 CLI가 각각 제외되었습니다. 반지 2 VMS는 실제로 운영 체제 보안에 관한 것이 아니라 사용자의 CLI 환경을 한 프로그램에서 다음 프로그램으로 보존하는 것이 아니라 Windows에는 그러한 개념이 없었습니다. CLI는 일반적인 프로세스로 실행됩니다. VMS는 반지 1RMS 코드 반지 1 에 전화했다 링 0 상당히 자주, 그리고 링 전이는 비싸다. 그냥가는 것이 훨씬 더 효율적인 것으로 판명되었습니다 링 0 많이 가지고있는 것보다 링 0 내에서 전환 반지 1 코드 (다시 말해서 NT에는 RMS와 같은 것이 없습니다).

운영 체제에서이를 사용하지 않고 x86이 4 개의 링을 구현 한 이유는 x86보다 훨씬 최신 디자인의 운영 체제에 대한 것입니다. x86의 많은 시스템 프로그래밍 기능은 NT 또는 진정한 유닉스 커널이 구현되기 오래 전에 설계되었으며 운영 체제가 무엇을 사용할지 실제로 알지 못했습니다. x86에서 페이징을 받기 전까지는 진정한 Unix-ish 또는 VMS와 같은 커널을 구현할 수 없었습니다.

최신 x86 운영 체제는 세그먼트 화를 크게 무시할뿐만 아니라 기본 주소가 0이고 크기가 4GB 인 C, D 및 S 세그먼트를 설정하기 만합니다 .F 및 G 세그먼트는 때때로 주요 운영 체제 데이터 구조를 가리키는 데 사용됩니다. ), 그들은 또한“태스크 상태 세그먼트”와 같은 것을 무시합니다. TSS 메커니즘은 스레드 컨텍스트 전환을 위해 명확하게 설계되었지만 부작용이 너무 많기 때문에 최신 x86 운영 체제는 “수동으로”수행합니다. x86 NT가 하드웨어 작업을 변경하는 유일한 시간은 이중 오류 예외와 같은 정말 예외적 인 조건입니다.

x64 아키텍처와 관련하여 사용하지 않는 이러한 많은 기능이 제외되었습니다. AMD는 실제로 운영 체제 커널 팀과 대화를 나누고 x86에서 필요한 것, 필요하지 않은 것, 원하지 않는 것, 추가 할 것이 있는지 물었습니다. x64의 세그먼트는 흔적 형식, 작업 상태 전환이 존재하지 않는 것 등으로 만 존재하며 운영 체제는 계속 두 개의 링만 사용합니다.


설명에 추가 할 것이 있습니까? 주석에서 소리를냅니다. 기술에 정통한 다른 Stack Exchange 사용자의 답변을 더 원하십니까? 여기에서 전체 토론 스레드를 확인하십시오.