2009-10-30 3 views
8

하드웨어 인터페이스를 사용하여 DMA 버퍼를 설정해야하는 데이터를 보내고 있습니다. 버퍼는 64 비트 경계에 정렬해야합니다.버퍼 메모리가 정렬되었는지 어떻게 확인합니까?

DMA 엔진은 버퍼가 적어도 32 비트 경계 (4 바이트)에 정렬 될 것으로 예상합니다. 최적의 성능을 위해 버퍼는 64 비트 경계 (8 바이트)에 정렬되어야합니다. 전송 크기는 4 바이트의 배수 여야합니다. 나는이 같은 버퍼를 만들 posix_memalign를 사용

...

posix_memalign ((void**)&pPattern, 0x1000, DmaBufferSizeinInt32s * sizeof(int))) 

pPattern는 int 형에 대한 포인터이며, 깊은 DmaBufferSizeinInt32s 내 버퍼의 시작이다.

내 버퍼가 64 비트로 정렬되어 있습니까?

답변

8

예, 버퍼는 64 비트로 정렬됩니다. 또한 4 KByte 경계 (따라서 0x1000)에 정렬됩니다. 4KB 정렬을 원하지 않으면 0x1000 대신 0x8을 전달하십시오 ...

편집 : 일반적으로 DMA 체인을 작성할 때 캐시되지 않은 메모리 나 비 캐시를 통해 쓰는 것이 좋습니다 기반 쓰기 대기열. 이 경우 DMA 체인의 시작 또는 끝 부분을 덮어 쓰는 캐시 다시 쓰기를 방지하기 위해 DMA 체인을 캐시 라인 크기에 맞게 정렬하려고합니다.

+0

4KByte 경계 정렬이 필요한지 확실하지 않습니다 ... 제가해야합니까? – Krakkos

+0

기본적으로 10 x 32 비트 단어 인 데이터 객체를 작성하고 있습니다. 매번 10 x 32 비트 단어의 정수를 보내려고합니다. 저는 현재 각 DMA 전송에서 400 x 320 비트 데이터 객체를 DMA하고 있습니다. 내 버퍼 크기 (400 x 10 x 32 비트)가 정렬과 관련이 있는지 확실하지 않습니다. 버퍼의 크기를 조정해야합니까? – Krakkos

+0

나는 그 질문에 대답 할 수 없다. 나는 당신의 플랫폼이 무엇인지 모릅니다. 창의 메모리 페이지는 4K 페이지에 할당됩니다. 즉, 한 번에 전체 페이지를 캐시 해제되도록 설정할 수 있음을 의미하므로 4K 정렬이 필요할 수도 있습니다. 아아, 그래도, 나는 당신의 시스템에 대해 더 많이 알지 못한다고 말할 수 없다 ... – Goz

2

Goz가 지적했듯이 (64 비트보다 많은) 0x1000 바이트 (두 번째 인수)만큼 정렬을 요청하고 있습니다.

당신은 단지 전화 변경할 수 있습니다 :

posix_memalign ((void**)&pPattern, 8, DmaBufferSizeinInt32s * sizeof(int))) 

이 호출 저렴 (이하 낭비 메모리)을 만들 수도 있습니다, 그리고 당신이 뭔가를 요구하기 때문에 어떤 경우에 더 밀접하게 일치, 명확 실제로 무엇을 필요.

+0

좋아요, 지금은 생각합니다 ... 'posix_memalign'의 중간 인수는 정렬입니다. 그리고 내 가치가 64 비트의 요소 였지만 실제로는 4096 바이트로 설정되었습니다. – Krakkos

1

하드웨어를 알 수 없으며 어떻게 pPattern 포인터를 가져 오는 지 알 수 없지만이 모든 것이 위험한 것처럼 보입니다. 내가 익숙한 대부분의 DMA에는 물리적 연속 RAM이 필요합니다. 운영 체제는 사용자 프로그램에 사실상 연속적인 RAM 만 제공합니다. 즉, 1MB의 메모리 할당은 최대 256 개의 연결되지 않은 4K RAM 페이지로 구성 될 수 있습니다.

대부분의 시간 동안 항상 작동하는 것으로 이어질 수있는 연속적인 물리적 조각으로 메모리 할당 시간이 많이 걸릴 것입니다. 안전한 DMA를 제공하려면 커널 장치 드라이버가 필요합니다.

pPattern 포인터 이 장치 드라이버에서 오는 인 경우 왜 더 정렬해야합니까?

+0

문제는 4K 이상의 RAM이 필요한지 여부에 달렸습니다 ... – Goz