x86-64 시스템에 48 비트 가상 주소 공간 만있는 이유는 무엇입니까?


97

책에서 나는 다음을 읽었습니다.

32 비트 프로세서에는 2 ^ 32 개의 가능한 주소가있는 반면 현재 64 비트 프로세서에는 48 비트 주소 공간이 있습니다.

내 예상은 64 비트 프로세서라면 주소 공간도 2 ^ 64 여야한다는 것입니다.

그래서이 제한의 이유가 무엇인지 궁금합니다.


11
이 책은 AMD64 아키텍처 (x86-64)의 현재 구현에 대해 구체적으로 설명 했어야합니다. 하위 48 비트 만 사용됩니다. 그러나 이것은 하드웨어 제한이 아닙니다. 모든 64 비트를 사용할 수 있습니다.
Cody Gray

7
항상 책을 식별하는 것이 좋습니다.
Henk Holterman 2011

1
나는 물리적 주소 라인이 자유롭지 않다고 생각합니다 (적어도 16 개의 추가 CPU 핀이 필요합니다). 그리고 동일한 프로세서에서 물리적 RAM 칩으로 48 비트 공간을 채울 수있는 하드웨어를 아직 알지 못합니다. 이것이 가능 해지면 AMD가 누락 된 16 개의 핀을 추가 할 것이라고 확신합니다. :)
Torp

7
심지어, The 32-bit processors have 2^32 possible addresses반드시 사실이 아니다, 메모리를 해결하기위한 유일한 24 "핀"을 32 비트 CPU가 존재할 수 있습니다. 예를 들어 68EC020 (저렴한 68020 버전)은 32 비트 CPU이지만 메모리 주소 지정을 위해 24 비트를 사용합니다.
ShinTakezou 2011

21
64 비트 물리적 주소 지정에는 실제 문제가 있습니다. 가상 메모리 페이지 크기가 너무 작습니다. 이는 모든 컨텍스트 스위치에서 엄청난 페이지 디렉토리와 매우 비싼 TLB 캐시를 플러시합니다. 4KB에서 4MB 페이지로 이동하는 것은 옵션이지만 현재 운영 체제와 매우 호환되지 않습니다.
Hans Passant 2011

답변:


134

그게 필요한 전부이기 때문입니다. 48 비트는 256 테라 바이트의 주소 공간을 제공합니다. 그것은 많은 것입니다. 곧 그 이상이 필요한 시스템을 보지 못할 것입니다.

그래서 CPU 제조업체는 지름길을 택했습니다. 전체 64 비트 주소 공간을 허용하는 명령어 세트를 사용하지만 현재 CPU는 하위 48 비트 만 사용합니다. 대안은 수년 동안 필요하지 않았던 더 큰 주소 공간을 처리하는 데 트랜지스터를 낭비하는 것이 었습니다.

따라서 48 비트 제한에 가까워지면 전체 주소 공간을 처리하는 CPU를 해제하는 문제 일 뿐이지 만 명령 집합을 변경할 필요가 없으며 호환성이 깨지지 않습니다.


118
누구나 640kb면 충분합니다.

7
여전히 8088 시스템을 실행하고 있습니까, bdares?

23
@bdares : 나쁜 비유. 8088/8086 아치의 명령어 세트에는 640k 제한이 내장되어 있습니다. 새로운 ISA (386)를 만드는 것만으로 장벽을 허물 수있었습니다. 반면에 x86_64는 ISA에서 모든 64 비트를 지원합니다. 모두 사용할 수없는 것은 현재 세대의 하드웨어 일뿐입니다 ...
R .. GitHub의 STOP은 ICE 돕기

16
@아르 자형. 사실 CPU의 한계는 1 메가 바이트였습니다. IBM PC는 메모리 매핑 된 주변 장치, BIOS 등을위한 섹션을 지정했습니다. 일부 다른 8088/8086 디자인 (메모리가 제공되는 경우 Zenith Z100)은 주변 장치 등에 대해 덜 지정하고 이에 따라 애플리케이션 프로그램에 대해 더 많이 지정했습니다.
제리 관

25
lwn.net/SubscriberLink/655437/9a48cd3e7a8cbe8a <-이 회신 후 3 년이 지나면 이미 이러한 제한에 도달했습니다. :) HP 컴퓨터에는 320TB의 메모리가 있으며 48 개 때문에 플랫 주소 공간으로 제공 할 수 없습니다. -비트 주소 지정 제한.
agam

18

OP의 질문은 물리적 주소 공간이 아닌 가상 주소 공간 에 관한 것이기 때문에 버스 크기와 물리적 메모리에 관한 모든 대답은 약간 잘못되었습니다 . 예를 들어, 일부 386에 대한 유사한 제한은 항상 전체 32 비트 인 가상 주소 공간이 아니라 사용할 수있는 물리적 메모리의 제한이었습니다. 원칙적으로 몇 MB의 실제 메모리만으로도 전체 64 비트의 가상 주소 공간을 사용할 수 있습니다. 물론 스와핑을 통해 또는 대부분의 주소에서 동일한 페이지를 매핑하려는 특수 작업 (예 : 특정 희소 데이터 작업)을 수행 할 수 있습니다.

진짜 대답은 AMD가 단지 값이 싸고 아무도 관심을 갖지 않기를 바랬다는 것입니다.하지만 인용 할 참고 문헌이 없습니다.


14
"저렴하다"당신은 결코 사용되지 않을 핀을 추가하지 않고, 사용하지 않을 트랜지스터를위한 칩 공간을 차지하지 않고, 기존 명령을 더 빠르게 만들기 위해 여유 공간을 사용하는 것을 의미한다고 생각하십니까? 그게 싸면 내가 들어간다!
Olof Forshell 2011

80386은 각각 최대 4GB의 메모리 (총 32TB)를 포함하는 2 * 4096 선택기를 허용합니다. 80286은 각각 최대 64KB (1GB)를 포함하는 2 * 4096 선택기를 허용했습니다.
Olof Forshell 2011-07-17

비선형 세그먼트 해킹은 내 책에서 주소 공간으로 간주되지 않습니다. 휴대용 소프트웨어가이를 사용할 방법이 없습니다.
R .. GitHub STOP HELPING ICE

@R ..-휴대용 소프트웨어의 정의는 그것이 가능 하다는 것 입니다. :-) 예를 들어, C ++는 포인터를 서로 다른 배열로 비교하는 것을 금지하여 별도의 4GB 세그먼트에있을 수 있습니다.
Bo Persson

컴파일이 실제로 거대한 포인터를 생성하고 각 메모리 역 참조에 대한 세그먼트 레지스터를로드하면 예입니다. 하지만 실제로는 끔찍하게 느리고 대신 모두가 작은 메모리 모델과 __far(또는 더 나쁘게는 FAR/ far!) 포인터를 사용했습니다 ...
R .. GitHub STOP HELPING ICE

10

wikipedia 기사 의 제한 사항 섹션을 읽으십시오 .

PC는 4 페타 바이트의 메모리를 포함 할 수 없지만 (현재 메모리 칩의 크기로 인해) AMD는 대규모 서버, 공유 메모리 클러스터 및 가까운 미래에 이에 접근 할 수있는 물리적 주소 공간의 기타 사용을 구상했습니다. 비트 물리적 주소는 64 비트 물리적 주소 구현 비용을 발생시키지 않으면 서 확장을위한 충분한 공간을 제공합니다.

즉,이 시점에서 전체 64 비트 주소 지정을 구현할 필요가 없습니다. 이러한 주소 공간을 완전히 활용할 수있는 시스템을 구축 할 수 없기 때문에 현재 (그리고 미래의) 시스템에 실용적인 것을 선택합니다.


4 페타 바이트 중 4는 어디에서 왔습니까? 64 개의 주소 라인을 이야기한다면 4GB 인 32 개의 주소 라인으로 가능해진 주소 공간의 제곱으로 끝날 것입니다. 제곱하면 4 페타 바이트가 아닌 16 개가 필요합니다. 내가 뭔가를 놓치고 있습니까?
올로프 포쉘

1
이는 현재의 물리적 한계 (52 비트)에서 비롯됩니다. 핵심은 전체 64 비트 주소 공간에 필요한 것은 말할 것도없고이 제한된 범위를 지원하기에 충분한 RAM을 PC에 넣을 수 없다는 것입니다.
Damien_The_Unbeliever

9

내부 네이티브 레지스터 / 동작 폭은 외부 주소 버스 폭에 반영 할 필요 가 없습니다 .

1MB의 RAM에만 액세스하면되는 64 비트 프로세서가 있다고 가정 해 보겠습니다. 20 비트 주소 버스 만 있으면됩니다. 사용하지 않을 모든 추가 핀의 비용과 하드웨어 복잡성에 신경 쓰는 이유는 무엇입니까?

Motorola 68000은 이렇습니다. 내부적으로 32 비트이지만 23 비트 주소 버스 (및 16 비트 데이터 버스)가 있습니다. CPU는 16 메가 바이트의 RAM에 액세스 할 수 있으며 기본 데이터 유형 (32 비트)을로드하려면 두 번의 메모리 액세스 (각각 16 비트의 데이터 포함)가 필요했습니다.


1
그러나 68000은 "full"32 비트 cpu가 아니라 "16/32 비트"cpu로 간주되므로 16 비트 과거에 여전히 1 피트가 있다고 말할 수 있습니다. 저비용 68EC020 버전은 주소에 대해서만 24 비트를 가지고 있기 때문에 68020을 예로 들었습니다. 68020은 "풀"32 비트 CPU이지만이 멋진 프로세서 제품군을 고려한 +1입니다!
ShinTakezou 2011

@ShinTakezou : 솔직히, 80386SX는 16 비트 CPU였습니까 (80286과 같은 주소 공간을 가지고 있었기 때문) 아니면 32 비트였습니까 (80386DX의 내부 아키텍처를 가지고 있었기 때문)? 한 사람은 당신이하는 것처럼 말할 수 있지만 다른 사람 (이건)은 "내면이 중요한 것"이라고 말합니다. 저를 인용 할 수 있습니다.
Olof Forshell 2011

@Olof "메모리"(외부 세계)의 맥락에서 외부가 중요하다고 생각하므로 68000은 16 비트 CPU (32 비트 데이터를 읽는 데 2 ​​"단계"가
필요함

@ShinTakezou : 메모리 컨텍스트, 심지어 캐시도 최신 프로세서에서 매우 밀접하게 결합되어 있더라도 항상 CPU 자체의 외부에 있습니다. 8088은 8086의 16 개까지 8 개의 데이터 버스 라인이 있었지만 내부적으로 8086과 동일했습니다. 8088이 Z80, 8080, 8085 등과 같은 그룹으로 분류되어야한다는 것이 분명하다고 생각하는 바가 없습니다. 데이터 버스의 너비에 대한 질문은 그 맥락에서 사소한 것 같습니다
Olof Forshell

저는 그런 문제에 대한 전문가가 아니기 때문에 분명한 것이 없습니다. 68000이 여전히 "오래된"프로세서라고 생각할 수있는 과거의 날카로운 절단이 필요하다는 것을 인식하고 싶었습니다. 주소 공간이 32 비트 미만으로 제한되는 것이 "자연스러워"보일 수 있지만 68020은 32 비트가 될 수 있으므로 한계가있는 68EC020의 존재는 "그 한계 (의 한계)"때문이 아니라는 선택임을 분명히합니다. 또는이) 시간 "이지만 다른 고려 사항 (64 핀을 갖는 것이 실질적인 이점이없는 경우 더 저렴하게 만드는 것과 같은) 은이 답변의 주장입니다.
ShinTakezou 2011

7

CPU 주소 경로에 트랜지스터를 저장하는 것보다 더 심각한 이유가 있습니다. 주소 공간의 크기를 늘리면 페이지 크기를 늘리거나 페이지 테이블의 크기를 늘리거나 더 깊은 페이지 테이블 구조를 가져야합니다. 더 많은 수준의 번역 테이블입니다). 이 모든 것들이 TLB 미스 비용을 증가시켜 성능을 저하시킵니다.


1
인텔은 현재 48 비트에서 57 비트로 확장 하는 5 단계 페이징 체계제안하고 있습니다. (현재 x86-64 페이지 테이블과 동일한 수준 당 9 비트 / 4k 페이지). 레벨 당 10 또는 11 비트를 사용하려면 페이지 워크 하드웨어를 변경해야했기 때문에 이것은 대용량 메모리에 대한 최적의 설계가 아닐 수 있지만 4-에 대한 최대 성능도 지원해야하는 듀얼 모드 CPU를위한 합리적인 확장입니다. 현재 형식의 레벨 테이블.
Peter Cordes

물론, 2M 또는 1G hugepages에서는 페이지 디렉토리 포인터가 아닌 최상위 레벨에서 거대한 페이지 테이블 항목까지 4 ~ 3 레벨의 페이지 테이블입니다.
Peter Cordes

6

내 관점에서 이것은 페이지 크기의 결과입니다. 각 페이지에는 최대 4096/8 = 512 페이지 테이블 항목이 포함됩니다. 그리고 2 ^ 9 = 512. 따라서 9 * 4 + 12 = 48입니다.


4

원래 질문에 대한 답 : 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


이 질문은 약 48 비트 가상 주소 공간 크기 (가상 주소가 표준이어야 함)를 묻는 것 입니다. 물리적 비트보다 더 많은 가상 비트를 원하므로 상위 절반 커널은 모든 물리적 메모리를 단일 주소 공간 (자체 또는 사용자 공간)에 매핑 할 수 있습니다. 말했듯이 HW는 DRAM 컨트롤러 + MMIO가 사용할 수있는만큼의 PA 비트 만 구현하면되며 x86-64 페이지 테이블 형식에서 52 비트 제한까지 모든 숫자를 사용할 수 있습니다. ( 64 비트에서 가상 주소가 물리적 주소 (52 비트 길이)에 비해 4 비트 (48 비트 길이)가 짧은 이유는 무엇입니까? )
Peter Cordes

1
4 레벨 페이지 테이블 형식은 HW + SW가 57 비트 VA에 대해 PML5 페이지 테이블을 지원할 때까지 48 비트 VA 제한을 적용합니다. 어쨌든 이것은 유용한 답변이지만 잘못된 질문에 게시 된 것 같습니다. 더 좋은 장소가 있는지 확실하지 않으므로 여기에 남겨 둘 수 있습니다. 헤더를 추가하여 PA 대 VA에 대해 뭔가를 말하도록 편집하면됩니다.
Peter Cordes

2

많은 사람들이 이러한 오해를 가지고 있습니다. 그러나 나는 당신이 이것을주의 깊게 읽으면 당신에게 약속하고 있습니다. 이것을 읽은 후에 당신의 모든 오해는 분명해질 것입니다.

프로세서 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 바이트)를 사용하는 사람이 없기 때문입니다.


16 비트 8086 CPU에 대해 말한 내용에서 이해하지 못하는 한 가지가 있습니다. 16 비트 CPU가 20 비트 주소를 어떻게 처리 할 수 ​​있습니까? 2 단계 작업을 통해 처리합니까? 주소 버스가 20 비트 폭인 경우에도 일단 CPU에 도달하면 레지스터 폭은 분명히 16 비트 만 취할 수 있습니다. 어떻게해야합니까?
programmersn

2
흠 ... 2 단계 작동. 세그먼트 레지스터에는 상위 16 비트 만 포함됩니다. 그런 다음 10H를 곱하여 20 비트로 만든 다음 오프셋을 추가합니다.
hafiz031

1

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 비트는로드 / 저장 주소 또는 간접 분기의 대상으로 사용될 때 무시되는 "태그"를 보유 할 수 있습니다.


1
하위 48 개만 중요하지만 하드웨어는 64 비트로 올바르게 부호 확장되었는지 확인합니다. 왜 제로 확장을 지정하지 않았는지 IDK; 아마도 그들은 높은 절반 주소와 낮은 절반 주소를 확인하는 것이 더 편리하도록 만들고 싶었습니다 (부호 비트 만 확인함으로써). 또는 2 ^ 48 경계를 특별하게 만드는 것을 피하여 맨 위의 주소가 32 비트 부호 확장 상수에 편리하게 맞을 수 있습니다. 후자가 더 가능성이 있다고 생각합니다.
Peter Cordes

어쨌든 현재의 HW 검사는 소프트웨어가 미래의 HW에서 중단 될 태그 된 포인터에 대해 무시 된 비트를 사용하는 것을 방지하므로 필요할 때 미래의 하드웨어를 확장 할 수있는 메커니즘의 일부입니다. (물리적 및 가상 주소 공간에 직접 연결되는 비 휘발성 메모리 덕분에 예상보다 더 빨라질 수 있습니다.)
Peter Cordes

Core i5의 Linux에서 procfs는 7ffd5ea41000-7ffd5ea62000에 매핑된다고 말합니다. 이 주소 범위는 위의 '표준'규칙에 따라 의미가 있습니다. 비트 48-63은 0이므로 올바른 표준 주소가됩니다. 조금 이상한 것은 Linux 소스의 일부 주소입니다. include / asm / pgtable_64_types에는 #define __VMALLOC_BASE _AC (0xff92000000000000, UL)이 표시됩니다. 이것은 정식 주소가 아닙니다. 이러한 주소는 0xffff8로 시작합니다. 왜.
Olsonist

예, IIRC Linux는 사용자 공간에 대해 표준 범위의 낮은 절반을 사용하고 (대부분) 커널 전용 매핑에 대해 높은 절반을 사용합니다. 그러나 일부 커널 메모리는 [vsyscall]페이지 와 같은 사용자 공간으로 내보내집니다 . (현재 PID와 같은 것을 내보내는 것일 수 있으므로 getpid()순전히 사용자 공간입니다. 또한 gettimeofday()사용자 공간 + 커널에서 내 보낸 스케일 팩터에서 rdtsc를 사용할 수 있습니다. 그 중 일부는에서 생각하지만 [vdso],에서 최상위에 가깝습니다. 하단 절반.)
Peter Cordes

IDK는 무엇을 __VMALLOC_BASE합니다. 아마도 직접 사용되지 않을 것입니다.
Peter Cordes

0

CPU는 주로 데이터 버스 크기와 엔터티 (내부 아키텍처)의 대부분에 따라 "N 비트"로 간주됩니다 . 레지스터, 누산기, ALU (Arithmetic-Logic-Unit), 명령어 세트 등 : 예 : 좋은 오래된 Motorola 6800 (또는 Intel 8050) CPU는 8 비트 CPU입니다. 8 비트 데이터 버스, 8 비트 내부 아키텍처 및 16 비트 주소 버스가 있습니다.


  • N 비트 CPU에는 N 크기 엔티티 이외의 다른 항목이있을 수 있습니다. 예를 들어 6800보다 6809의 개선 사항 (둘 다 8 비트 데이터 버스가있는 8 비트 CPU)입니다. 6809에 도입 된 중요한 개선 사항 중에는 2 개의 8 비트 누산기 (A 및 B, 단일 16 비트 레지스터 D로 결합 될 수 있음), 2 개의 16 비트 인덱스 레지스터 (X, Y) 및 2 개의 16 비트 스택 포인터.

Motorola 68000/68020을 예로 들어이 점을 설명 하는 답변 이 이미 있습니다 . 이 질문은 실제로 오래된 8/16 비트 CPU가 아니라 x86-64에 관한 것입니다. x86-64의 경우, 주요 요인 중 하나는 더 넓은 가상 주소에는 더 깊은 페이지 테이블이 필요하며 그 요인은 당신이 말하는 오래된 칩에는 존재하지 않는다는 것입니다.
Peter Cordes jul.

데이터 버스 폭은 레지스터 또는 ALU 폭과 일치 할 필요가 없습니다. 예를 들어 P5 Pentium에는 64 비트 데이터 버스 (정렬 된 64 비트로드 / 스토어는 원 자성이 보장됨)가 있지만 레지스터 / ALU는 32 비트에 불과합니다 (통합 FPU 제외, 이후 Pentium MMX에서는 SIMD 제외). ALU.)
Peter Cordes

OP 쓰기 : "64 비트 프로세서 인 경우 주소 공간도 2 ^ 64 여야한다고 예상했습니다." ........ "이 질문은 실제로 x86-64에 관한 것입니다. 예전 8/16 비트 CPU가 아닙니다." ........ OP 질문의 본질을 놓친 것 같습니다. OP 질문은 64 비트 CPU에 64 비트 주소 버스가 있어야한다는 잘못된 가정의 결과입니다. ALU에 대해 저는 그 엔티티의 많은 부분 을 썼습니다 . 그들 모두는 아닙니다.
Amit G.

이 댓글을 다시 게시하여 스팸 발송을 중지하십시오. 예, 물론 OP는 설명하는 이유로 잘못되었지만 귀하의 답변이 비슷한 실수를하는 것처럼 보인다는 점을 지적했습니다. " 그리고 결과적으로 엔티티의 큰 부분 : 레지스터 및 누산기, ALU (Arithmetic-Logic-Unit) ... "라고 말하면 데이터 버스 폭과 일치한다고 말하는 것처럼 들립니다. "큰 부분"이라는 표현은 어떤 부분 을 말하는지 말하고 있다는 것을 의미합니다 . 때로는 그 부분에 대해서만 사실이라는 의미가 아닙니다.
Peter Cordes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.