2010-08-12 6 views
4

왜 메모리가 버스의 데이터 너비에 따라 4 바이트와 8 바이트로 정렬되어야 하는지를 이해했습니다. 하지만 다음 문장은 나를 혼란스럽게합니다메모리 정렬

"OoDrive를 사용하는 장치에서 수행되는 모든 I/O는 512 바이트의 alligned 및 512 바이트의 배수 여야합니다."

주소를 512 바이트로 정렬해야하는 이유는 무엇입니까?

답변

5

큰 버퍼 정렬 제한에 대한 블레 이닝 DMA가 잘못되었습니다.

하드웨어 DMA 전송은 일반적으로 PCI 버스가 한 번에 32 비트 또는 64 비트를 물리적으로 전송할 수 있으므로 4 바이트 또는 8 바이트 경계로 정렬됩니다. 이 기본 정렬 외에도 하드웨어 DMA 전송은 제공된 모든 주소에서 작동하도록 설계되었습니다.

그러나 하드웨어는 물리적 주소를 처리하는 반면 OS는 가상 메모리 주소 (x86 CPU의 보호 모드 구조)를 처리합니다. 즉, 프로세스 공간의 연속 버퍼가 물리적 RAM에서 연속적이지 않을 수 있습니다. 물리적으로 인접한 버퍼를 만드는 데주의를 기울이지 않으면 VM 페이지 경계 (일반적으로 4K 또는 2M)에서 DMA 전송을 분할해야합니다.

디스크 섹터 크기에 맞춰야하는 버퍼의 경우, 이는 사실이 아닙니다. DMA 하드웨어는 하드 드라이브의 물리적 섹터 크기를 완전히 인식하지 못합니다.

Linux 2.4에서 O_DIRECT는 4K 정렬이 필요하며 2.6 미만에서는 512B로 완화되었습니다. 두 경우 모두, 단일 섹터 업데이트가 VM 페이지 경계를 넘어 서서 분할 DMA 전송을 필요로하는 것을 방지하는 것은 설계상의 결정 일 것입니다. 임의의 512B 버퍼는 4K 페이지를 넘을 확률이 1/4입니다.

OS가 하드웨어가 아니라 비난하는 동안 페이지 정렬 버퍼가 더 효율적인 이유를 알 수 있습니다.

편집 : 물론 대용량 버퍼를 작성하는 경우 (100KB), 512B로 정렬했는지 여부에 관계없이 건너 뛴 VM 페이지 경계 수는 실제로 동일합니다. 따라서 512B 정렬로 최적화 된 주된 경우는 단일 섹터 전송입니다.

4

일반적으로 큰 정렬 요구 사항은 기본 하드웨어 DMA 때문입니다. 큰 블록 전송은 때로는 여기에있는 것보다 훨씬 강력한 정렬 제한을 요구함으로써 훨씬 빨라질 수 있습니다.

여러 ARM 프로세서에서 첫 번째 수준 translation table은 16KB 경계에 정렬되어야합니다!

+0

데이터가주기 내에서 4 바이트로 전송되는 것처럼 512 바이트로 정렬하여 더 빠르게 만드는 방법 – Poorna

+0

@ 시리, 그게 중요한 부분입니다. 단일 사이클에서 512 바이트와 같이 8, 16, 32 또는 그 이상을 전송할 수 있습니다. DMA 하드웨어는 기본적으로 모든 것을 구현할 수 있습니다. –

+4

@siri : 프로세서가 전송에 전혀 관여하지 않는 것이 더 빠르다. (즉, DMA는 무엇을 의미 하는가?) DMA 하드웨어는 때때로 아키텍처 자체에 내포되어있는 한계를 넘어서는 한계를 부과한다. – dmckee

0

당신이하는 일을 모르는 경우 O_DIRECT를 사용하지 마십시오.

O_DIRECT는 "직접 장치 액세스"를 의미합니다. 즉, 모든 OS 캐시를 우회하여 디스크 (또는 RAID 컨트롤러 등)에 직접 충돌합니다. 디스크 액세스는 섹터 단위로 수행됩니다.

편집 : 정렬 요구 사항은 IO 오프셋/크기입니다. 일반적으로 메모리 정렬 요구 사항이 아닙니다.

편집 : 당신이 this page에서 찾고 있다면이 (가 유일하게 히트 것으로 보인다), 또한 메모리는 페이지로 정렬되어야합니다 말한다.