32/64비트 시스템(프로세서)에서 RAM의 워드 크기는 얼마입니까?

32/64비트 시스템(프로세서)에서 RAM의 워드 크기는 얼마입니까?

32/64비트 머신(프로세서)에서 RAM의 워드 크기는 얼마입니까?

이 질문은 나를 미치게 만든다. Intel Core i5 마이크로프로세서와 같은 64비트 시스템에서 RAM 자체에 데이터를 저장하는 워드의 크기는 정확히 얼마입니까?

그리고 데이터를 담는 워드 크기가 32비트에서 64비트로 바뀌나요?

답변1

전통적으로 컴퓨터 아키텍처에서 "단어"는 일반적으로 주소를 지정할 수 있는 가장 작은 메모리 단위였습니다. 그리고 전통적으로 이것은 머신의 범용 레지스터 크기와 동일했습니다.

그러나 바이트 주소 지정이 대중화되면서 개념이 희석되었습니다. (아마도 IBM System/360과 미니컴퓨터 측면의 PDP-11을 꼽을 수 있을 것입니다.)

CPU 아키텍처에 의해 정의된 메모리 주소 지정 측면에서(즉, 프로그래머가 시스템을 보는 방식) "단어" 개념은 바이트와 동의어로 생각하지 않는 한 x86/x64에 존재하지 않습니다. 메모리의 각 바이트에는 고유한 주소가 있으며, 바이트 주소는 해당 바이트에서 시작하는 더 큰 영역의 주소이기도 합니다(더 높은 번호의 주소로 확장). 물론 REP 명령을 사용하여 레지스터와 RAM 사이에서 한 번에 1, 2, 4 또는 (x64의 경우) 8바이트(또는 훨씬 더 많은 메모리 간)를 이동할 수 있지만 우리가 주장하는 주소는 여전히 바이트. 우리는 그 모든 크기의 단어에 대해 산술을 할 수 있습니다. (다른 사람.)

레지스터 측면에서 생각하면 기계의 "워드 크기"는 일반적으로 범용 레지스터의 단어 크기와 동일한 것으로 간주됩니다. x86에서는 32비트, x64에서는 64비트입니다. 대부분의 아키텍처에서 GPR 크기는 CPU가 단일 명령어로 간단한 산술을 수행할 수 있는 가장 큰 정수의 크기입니다.

이제 더 많은 혼란을 소개하겠습니다 ...!

플랫폼(마더보드, RAM 모듈 및 칩 등) 측면에서 Intel 및 AMD "상용" CPU 및 칩셋을 사용하는 모든 시스템에서 RAM은 64비트 청크로 처리됩니다. 이를 단어라고 부를 수 있을 것 같습니다. 주소와 데이터용으로 별도의 핀이 있는 이전 프로세서에서 이를 매우 명확하게 볼 수 있습니다. 가장 중요하지 않은 주소 핀은 A0이 아니라 A3입니다! 물리적 주소 비트 A0, A1 및 A2는 프로세서를 떠나지 않습니다. 그러나 프로그래머는 그러한 주소를 결코 볼 수 없습니다.

그리고 마지막으로 "캐시 라인"이라는 개념이 있습니다. 캐시 라인은 L1/L2/L3 캐시에서 하나의 항목을 차지하는 물리적으로 연속적인 RAM 덩어리입니다. Intel/AMD 세계의 캐시 라인은 한동안 64바이트 너비였습니다. 따라서 현재 캐시에 없는 메모리 주소에 액세스하면 CPU가 가져옵니다.여덟8바이트 RAM 덩어리 중 하나입니다. 다르게 말하면, 캐시에 저장된 주소는 하위 6비트를 생략합니다. 그럼 어쩌면 한마디캐시에실제로는 64바이트 또는 512비트입니다! (그러나 캐시를 우회하는 메모리 액세스는 여전히 한 번에 8바이트만 읽거나 쓸 수 있습니다. 메모리 매핑된 I/O 장치에 의해 디코딩되는 물리적 주소 범위에서 개별 바이트는 주소 지정이 가능할 수 있습니다. 이는 버스에 따라 다릅니다. 물론 512비트 정수에서는 산술 연산을 수행할 수 없습니다.)

Microsoft C 파생 프로그래밍 환경에서 "단어"는 16비트입니다. 이는 Microsoft 이전부터 사용되어 왔으며 데이터 유형의 이름과 정의는 호환성을 위해 32비트 및 64비트 환경으로 전달되었습니다. "더블 워드"(또는 VAX에서 일반적으로 사용되는 용어인 "longword"의 경우 DWORD 또는 LONG)는 32비트입니다. 64비트 정수는 아키텍처에서 "쿼드워드"라고 부르지만 일반적으로 C에서는 UINT64(64비트 정수, 부호 없음)와 같이 더 구체적인 이름을 갖습니다.

따라서 이는 시스템 내 어디에 있는지, 무엇을 보고 있는지에 따라 달라집니다. 요즘 우리는 일반적으로 "단어 크기"에 대해 전혀 생각하지 않고 "GPR 크기"에 대해 생각합니다.

답변2

요즘 캐시 일관성 및 NUMA와 같은 새로운 기능을 고려할 때 RAM이 Intel CPU와 어떻게 작동하는지에 대한 자세한 내용은 잘 모르지만 RAM의 관점에서 볼 때 RAM은 현재 일반적으로 배열되어 있지만 여전히 8비트 바이트라고 생각합니다. 여러 슬롯에 동시에 액세스할 수 있는 채널입니다. 따라서 한 번에 4바이트(슬롯 4개 가정)를 가져오는 데는 이러한 시스템에서 1바이트를 가져오는 것과 동일한 시간이 소요됩니다. 그럼에도 불구하고 RAM은 메모리 컨트롤러의 주소를 입력으로 받아들이고 AFAIK 출력으로 8비트를 반환합니다.

"단어" 크기는 다른 의미를 가질 수 있습니다. 나는 68000 어셈블리 언어를 공부하면서 이 용어를 처음 접했던 것을 기억합니다. 제가 읽고 있던 텍스트에서 "바이트"는 8비트를 의미하고 "워드"는 16비트를 의미했으며 "워드 정렬"은 16비트 경계에 속하는 주소를 의미했습니다. 나는 "워드"라는 용어가 68000(1980년?)이 출시되기 이전에 사용되었으며 그 이전에는 "바이트"와 동의어였을 수 있다는 것을 알고 있습니다.

CPU가 처리하기를 "선호"하는 "네이티브" 데이터는 해당 아키텍처의 "비트 수" 및 실행 중인 모드와 일치합니다. 32비트 CPU(또는 "긴 모드"가 아닌 64비트 CPU)는 32개를 가집니다. -비트 레지스터, RAM(4바이트)의 값을 해당 레지스터 및 기타 항목으로 로드하는 일련의 명령입니다. 그러나 Intel에서는 EAX와 같은 32비트 레지스터를 두 개의 레지스터 AH(EAX의 상위 16비트)와 AL(하위 16비트)로 처리할 수도 있으며 RAM에서 EAX로 항목을 로드하는 수많은 MOV 명령이 있습니다. AH, AL, 그리고 거기에서 다시 RAM으로 돌아갑니다. 지금은 너무 게으른 나머지 인텔 프로그래머 참조 가이드를 볼 수 없지만 AH 또는 AL의 상위 또는 하위 8비트에 단일 바이트를 로드하라는 지침이 있는 것 같습니다. (MIPS에 그런 지침이 있다는 것을 알고 있습니다). 하지만 32비트 모두에서 작동하는 명령이 더 많다고 생각합니다. 더 적은 비트로 작업하려면 먼저 임시 레지스터로 항목을 옮겨야 하기 때문에 효율성이 저하됩니다.

따라서 Intel과 16비트 시대 이후에 만들어진 대부분의 다른 범용 CPU에서는 메모리 주소 지정 방법이 매우 유연합니다. 그러나 지침은 아키텍처의 "비트"에서 작동하도록 더 최적화되었을 가능성이 높습니다.

관련 정보