책에서 나는 다음을 읽었습니다.
32 비트 프로세서에는 2 ^ 32 개의 가능한 주소가있는 반면 현재 64 비트 프로세서에는 48 비트 주소 공간이 있습니다.
내 예상은 64 비트 프로세서라면 주소 공간도 2 ^ 64 여야한다는 것입니다.
그래서이 제한의 이유가 무엇인지 궁금합니다.
책에서 나는 다음을 읽었습니다.
32 비트 프로세서에는 2 ^ 32 개의 가능한 주소가있는 반면 현재 64 비트 프로세서에는 48 비트 주소 공간이 있습니다.
내 예상은 64 비트 프로세서라면 주소 공간도 2 ^ 64 여야한다는 것입니다.
그래서이 제한의 이유가 무엇인지 궁금합니다.
The 32-bit processors have 2^32 possible addresses
반드시 사실이 아니다, 메모리를 해결하기위한 유일한 24 "핀"을 32 비트 CPU가 존재할 수 있습니다. 예를 들어 68EC020 (저렴한 68020 버전)은 32 비트 CPU이지만 메모리 주소 지정을 위해 24 비트를 사용합니다.
답변:
그게 필요한 전부이기 때문입니다. 48 비트는 256 테라 바이트의 주소 공간을 제공합니다. 그것은 많은 것입니다. 곧 그 이상이 필요한 시스템을 보지 못할 것입니다.
그래서 CPU 제조업체는 지름길을 택했습니다. 전체 64 비트 주소 공간을 허용하는 명령어 세트를 사용하지만 현재 CPU는 하위 48 비트 만 사용합니다. 대안은 수년 동안 필요하지 않았던 더 큰 주소 공간을 처리하는 데 트랜지스터를 낭비하는 것이 었습니다.
따라서 48 비트 제한에 가까워지면 전체 주소 공간을 처리하는 CPU를 해제하는 문제 일 뿐이지 만 명령 집합을 변경할 필요가 없으며 호환성이 깨지지 않습니다.
OP의 질문은 물리적 주소 공간이 아닌 가상 주소 공간 에 관한 것이기 때문에 버스 크기와 물리적 메모리에 관한 모든 대답은 약간 잘못되었습니다 . 예를 들어, 일부 386에 대한 유사한 제한은 항상 전체 32 비트 인 가상 주소 공간이 아니라 사용할 수있는 물리적 메모리의 제한이었습니다. 원칙적으로 몇 MB의 실제 메모리만으로도 전체 64 비트의 가상 주소 공간을 사용할 수 있습니다. 물론 스와핑을 통해 또는 대부분의 주소에서 동일한 페이지를 매핑하려는 특수 작업 (예 : 특정 희소 데이터 작업)을 수행 할 수 있습니다.
진짜 대답은 AMD가 단지 값이 싸고 아무도 관심을 갖지 않기를 바랬다는 것입니다.하지만 인용 할 참고 문헌이 없습니다.
__far
(또는 더 나쁘게는 FAR
/ far
!) 포인터를 사용했습니다 ...
wikipedia 기사 의 제한 사항 섹션을 읽으십시오 .
PC는 4 페타 바이트의 메모리를 포함 할 수 없지만 (현재 메모리 칩의 크기로 인해) AMD는 대규모 서버, 공유 메모리 클러스터 및 가까운 미래에 이에 접근 할 수있는 물리적 주소 공간의 기타 사용을 구상했습니다. 비트 물리적 주소는 64 비트 물리적 주소 구현 비용을 발생시키지 않으면 서 확장을위한 충분한 공간을 제공합니다.
즉,이 시점에서 전체 64 비트 주소 지정을 구현할 필요가 없습니다. 이러한 주소 공간을 완전히 활용할 수있는 시스템을 구축 할 수 없기 때문에 현재 (그리고 미래의) 시스템에 실용적인 것을 선택합니다.
내부 네이티브 레지스터 / 동작 폭은 외부 주소 버스 폭에 반영 할 필요 가 없습니다 .
1MB의 RAM에만 액세스하면되는 64 비트 프로세서가 있다고 가정 해 보겠습니다. 20 비트 주소 버스 만 있으면됩니다. 사용하지 않을 모든 추가 핀의 비용과 하드웨어 복잡성에 신경 쓰는 이유는 무엇입니까?
Motorola 68000은 이렇습니다. 내부적으로 32 비트이지만 23 비트 주소 버스 (및 16 비트 데이터 버스)가 있습니다. CPU는 16 메가 바이트의 RAM에 액세스 할 수 있으며 기본 데이터 유형 (32 비트)을로드하려면 두 번의 메모리 액세스 (각각 16 비트의 데이터 포함)가 필요했습니다.
CPU 주소 경로에 트랜지스터를 저장하는 것보다 더 심각한 이유가 있습니다. 주소 공간의 크기를 늘리면 페이지 크기를 늘리거나 페이지 테이블의 크기를 늘리거나 더 깊은 페이지 테이블 구조를 가져야합니다. 더 많은 수준의 번역 테이블입니다). 이 모든 것들이 TLB 미스 비용을 증가시켜 성능을 저하시킵니다.
내 관점에서 이것은 페이지 크기의 결과입니다. 각 페이지에는 최대 4096/8 = 512 페이지 테이블 항목이 포함됩니다. 그리고 2 ^ 9 = 512. 따라서 9 * 4 + 12 = 48입니다.
원래 질문에 대한 답 : 48 비트 이상의 PA를 추가 할 필요가 없었습니다.
서버에는 최대 메모리가 필요하므로 더 자세히 살펴 보겠습니다.
1) 가장 큰 (일반적으로 사용되는) 서버 구성은 8 소켓 시스템입니다. 8S 시스템은 단일 노드를 형성하기 위해 고속 코 히어 런트 인터커넥트 (또는 간단히 고속 "버스")로 연결된 8 개의 서버 CPU에 불과합니다. 더 큰 클러스터가 있지만 그 사이에는 거의 없으며 여기서 일반적으로 사용되는 구성에 대해 이야기하고 있습니다. 실제 사용에서 2 소켓 시스템은 가장 일반적으로 사용되는 서버 중 하나이며 8S는 일반적으로 매우 하이 엔드로 간주됩니다.
2) 서버에서 사용하는 주요 메모리 유형은 바이트 주소 지정이 가능한 일반 DRAM 메모리 (예 : DDR3 / DDR4 메모리), 메모리 매핑 된 IO-MMIO (예 : 애드 인 카드에서 사용하는 메모리) 및 구성에 사용되는 구성 공간입니다. 시스템에있는 장치. 첫 번째 유형의 메모리는 일반적으로 가장 큰 메모리 (따라서 가장 많은 수의 주소 비트가 필요함)입니다. 일부 고급 서버는 시스템의 실제 구성에 따라 많은 양의 MMIO를 사용합니다.
3) 각 서버 CPU가 각 슬롯에 16 개의 DDR4 DIMM을 수용 할 수 있다고 가정합니다. 256GB의 최대 DDR4 DIMM 크기. (서버 버전에 따라 소켓 당 가능한이 DIMM 수는 실제로 16 개 미만의 DIMM이지만 예제를 위해 계속 읽으십시오).
따라서 각 소켓은 이론적으로 16 * 256GB = 4096GB = 4TB를 가질 수 있습니다. 예제 8S 시스템의 경우 DRAM 크기는 최대 4 * 8 = 32TB가 될 수 있습니다. 이는이 DRAM 공간을 처리하는 데 필요한 최대 비트 수가 45 개 (= log2 32TB / log2 2)임을 의미합니다.
다른 유형의 메모리 (MMIO, MMCFG 등)에 대해서는 자세히 설명하지 않겠습니다.하지만 여기서 요점은 현재 사용 가능한 가장 큰 유형의 DDR4 DIMM (256GB)을 사용하는 8 소켓 시스템에서 가장 "요구되는"유형의 메모리입니다. DIMM)은 45 비트 만 사용합니다.
48 비트 (예 : WS16)를 지원하는 OS의 경우 (48-45 =) 3 비트가 남아 있습니다. 즉, 32TB의 DRAM에만 하위 45 비트를 사용하더라도 총 256TB의 주소 지정 가능 공간에 대해 MMIO / MMCFG에 사용할 수있는 2 ^ 3 배의 주소 지정 가능 메모리가 있습니다.
따라서 요약하면 다음과 같습니다. 1) 48 비트의 물리적 주소는 많은 양의 DDR4와 MMIO 공간을 필요로하는 많은 다른 IO 장치로 "완전히로드 된"오늘날의 가장 큰 시스템을 지원하기에 충분한 비트입니다. 정확히 256TB입니다.
이 256TB 주소 공간 (= 48 비트의 물리적 주소)은 주소 맵의 일부가 아니기 때문에 SATA 드라이브와 같은 디스크 드라이브를 포함하지 않으며, 바이트 주소 지정이 가능하고 OS에 노출되는 메모리 만 포함합니다.
2) CPU 하드웨어는 서버 세대에 따라 46, 48 또는> 48 비트를 구현하도록 선택할 수 있습니다. 그러나 또 다른 중요한 요소는 OS가 인식하는 비트 수입니다. 현재 WS16은 48 비트 물리적 주소 (= 256TB)를 지원합니다.
이것이 사용자에게 의미하는 바는 48 비트 이상의 주소 지정을 지원할 수있는 초대형 서버 CPU를 가지고 있더라도 48 비트 PA 만 지원하는 OS를 실행하면 256TB 만 활용할 수 있다는 것입니다. .
3) 대체로 더 많은 수의 주소 비트 (= 더 많은 메모리 용량)를 활용하는 데는 두 가지 주요 요소가 있습니다.
a) CPU HW는 몇 비트를 지원합니까? (이는 Intel CPU의 CPUID 명령에 의해 결정될 수 있습니다).
b) 실행중인 OS 버전 및 PA가 인식 / 지원하는 비트 수.
(a, b)의 최소값은 궁극적으로 시스템에서 활용할 수있는 주소 지정 가능 공간의 양을 결정합니다.
다른 답변을 자세히 살펴 보지 않고이 답변을 작성했습니다. 또한 MMIO, MMCFG의 뉘앙스 및 주소 맵 구성 전체에 대해 자세히 설명하지 않았습니다. 그러나 이것이 도움이되기를 바랍니다.
감사합니다. Anand K Enamandram, 서버 플랫폼 설계자 Intel Corporation
많은 사람들이 이러한 오해를 가지고 있습니다. 그러나 나는 당신이 이것을주의 깊게 읽으면 당신에게 약속하고 있습니다. 이것을 읽은 후에 당신의 모든 오해는 분명해질 것입니다.
프로세서 32 비트 또는 64 비트가 각각 32 비트 주소 버스 또는 64 비트 주소 버스가 있어야 함을 의미하지 않는다고 말하면! ... 반복하지 않습니다 !!
32 비트 프로세서는 32 비트 ALU (산술 및 논리 장치)가 있음을 의미합니다. 즉, 32 비트 이진 피연산자 (또는 단순히 32 자리의 이진수라고 함)에서 작동 할 수 있으며 유사하게 64 비트 프로세서가 64 비트 이진에서 작동 할 수 있음을 의미합니다. 피연산자. 따라서 32 비트 또는 64 비트 프로세서가 설치할 수있는 최대 메모리 양을 의미하지는 않습니다. 피연산자가 얼마나 클 수 있는지 보여줍니다 ... (비유를 위해 10 자리 계산기가 최대 10 자리의 결과를 계산할 수 있다고 생각할 수 있습니다 ... 11 자리 또는 다른 더 큰 결과를 제공 할 수 없습니다 ... 십진수로 표시하지만 단순성을 위해이 비유를 말하고 있습니다) ...하지만 당신이 말하는 것은 메모리 (RAM)의 직접 인터페이스 가능한 최대 크기 인 주소 공간입니다. RAM ' 가능한 최대 크기는 주소 버스의 크기에 의해 결정되며 데이터 버스의 크기 또는 프로세서의 크기가 정의 된 ALU (32/64 비트)도 아닙니다. 예, 프로세서에 32 비트 "주소 버스"가 있으면 2 ^ 32 바이트 = 4GB RAM (또는 64 비트의 경우 2 ^ 64)을 주소 지정할 수 있지만 프로세서 32 비트 또는 64 비트는 이 주소 공간과는 관련이 없으며 (주소 공간 = 메모리에 액세스 할 수있는 거리 또는 RAM의 최대 크기) ALU의 크기에만 의존합니다. 물론 데이터 버스와 주소 버스는 크기가 같을 수 있으며 32 비트 프로세서가 2 ^ 32 바이트 또는 4GB 메모리에 액세스한다는 것을 의미하는 것처럼 보일 수 있지만 우연의 일치 일 뿐이며 동일하지 않습니다. 모든.... 예를 들어 인텔 8086은 16 비트 프로세서 (16 비트 ALU가 있기 때문에)이므로 2 ^ 16 바이트 = 64KB의 메모리에 액세스해야했지만 사실이 아닙니다. 20 비트 주소 버스를 사용하기 위해 최대 1MB의 메모리에 액세스 할 수 있습니다 .... 의심스러운 점이 있으면 Google을 사용할 수 있습니다.
내 요점을 분명히 한 것 같습니다. 이제 귀하의 질문에 ... 64 비트 프로세서가 64 비트 주소 버스가 있어야 함을 의미하지는 않으므로 64 비트 프로세서에서 48 비트 주소 버스를 갖는 것이 잘못되었습니다. ... 그들은 디자인과 제작을 저렴하게 만들기 위해 주소 공간을 작게 유지했습니다 .... 오늘날에는 2 ^ 48 바이트가 충분하지 않은 대용량 메모리 (2 ^ 64 바이트)를 사용하는 사람이 없기 때문입니다.
64 비트 VA의 하위 48 비트 만 사용된다는 것은 사실이 아닙니다. 최소한 Intel 64에서는 상위 16 비트가 사용됩니다.
인텔 ® 64 및 IA-32 아키텍처 소프트웨어 개발자 매뉴얼의 3.3.7.1 절 정식 주소 지정은 다음 과 같이 말합니다.
표준 주소에는 63 ~ 48 비트가 0 또는 1로 설정되어야합니다 (비트 47이 0인지 1인지에 따라 다름)
따라서 47에서 63까지의 비트는 모두 1 또는 모두 0 인 수퍼 비트를 형성합니다. 주소가 표준 형식이 아니면 구현에 오류가 발생합니다.
AArch64에서는 다릅니다. ARMv8 명령어 세트 개요 에 따르면 49 비트 VA입니다.
AArch64 메모리 변환 시스템은 49 비트 가상 주소 (변환 테이블 당 48 비트)를 지원합니다. 가상 주소는 49 비트에서 부호 확장되며 64 비트 포인터 내에 저장됩니다. 선택적으로 시스템 레지스터의 제어 하에서 64 비트 포인터의 최상위 8 비트는로드 / 저장 주소 또는 간접 분기의 대상으로 사용될 때 무시되는 "태그"를 보유 할 수 있습니다.
[vsyscall]
페이지 와 같은 사용자 공간으로 내보내집니다 . (현재 PID와 같은 것을 내보내는 것일 수 있으므로 getpid()
순전히 사용자 공간입니다. 또한 gettimeofday()
사용자 공간 + 커널에서 내 보낸 스케일 팩터에서 rdtsc를 사용할 수 있습니다. 그 중 일부는에서 생각하지만 [vdso]
,에서 최상위에 가깝습니다. 하단 절반.)
__VMALLOC_BASE
합니다. 아마도 직접 사용되지 않을 것입니다.
CPU는 주로 데이터 버스 크기와 엔터티 (내부 아키텍처)의 대부분에 따라 "N 비트"로 간주됩니다 . 레지스터, 누산기, ALU (Arithmetic-Logic-Unit), 명령어 세트 등 : 예 : 좋은 오래된 Motorola 6800 (또는 Intel 8050) CPU는 8 비트 CPU입니다. 8 비트 데이터 버스, 8 비트 내부 아키텍처 및 16 비트 주소 버스가 있습니다.