자일링스의 Microblaze에서 full MMU를 사용하여 Linux 커널 3.3을 실행 중입니다. 내가하고있는 일은 내가 다음을 알아야한다는 것을 요구한다. 나는 텍스트 파일 (버퍼)을 만들고이 버퍼의 물리적 주소를 찾아야하고, 커널이이 파일을 메모리의 불연속 영역에 기록하는 것을 원하지 않는다.리눅스에서 버퍼의 실제 주소 얻기
미리 설정된 실제 메모리 주소에서 데이터를 스트리밍하는 DMA 엔진이 있기 때문에 필자가 필요로하는 이유 때문에이 정확한 메모리 위치에 버퍼 파일을 만들도록 Linux를 강제해야하므로이 데이터를 쓸 때 그 즉시 다른 하드웨어 코어로 DMA 엔진에 의해
자세한 내용 전송 파일 :.
내 시스템은 512MB의 DDR3 RAM은 자일링스의 '멀티 포트 메모리 컨트롤러 (MPMC) "를 통해 시스템에 연결이를 기본 주소 이 메모리 컨트롤러의 0x90000000입니다. 시스템의 모든 장치는 MicroBlaze를 포함하여이 컨트롤러를 통해 메모리에 액세스합니다. 내가 가지고있는 DMA 장치는 Native Perso 매우 낮은 수준에서 메모리와 통신하기위한 NPI (Nality Interface). 따라서 매우 빠른 성능을 제공합니다.
이 NPI DMA 장치는 원래 가상 메모리를 지원하지 않는 "xilkernel"이라는 매우 기본적인 임베디드 커널에서 사용되도록 설계되었지만 MMU는 MicroBlaze의 일부가 아니므로 프로그래머는 OS 코드가 어디에 있는지 볼 수있었습니다. DMA가 스트리밍되는 소스 주소로 0x91800000과 같은 실제 메모리 주소를 선택하면 프로그래머는 정확한 주소에 파일을 배치하고 시스템을 실행합니다.
대신에 Linux를 사용하도록 프로젝트를 마이그레이션해야 할 때 xilkernel 우리는이 문제에 직면 해 리눅스에서 블록 장치로 액세스 할 수있는 외부 저장 장치에 파일을 가지고 있으며 각 파일을 주 메모리 (DDR3 RAM)로 이동하고 DMA 스트림을 파일로 만들어야합니다. 현재 고정 주소의 DMA 스트림이지만 필요한 경우 일반화 할 수 있습니다.
Linux 커널이 가상 메모리와 실제 메모리를 관리하는 방법을 설명하는 장을이 PDF에서 살펴보십시오. 다양한 시나리오에서 실제 메모리를 매핑하고 고정하는 방법에 대한 예제를 제공합니다. http://lwn.net/images/pdf/LDD3/ch15.pdf –
@bromanous이 장치를 직접 개발했거나 수정할 수없는 타사 IP 코어입니까? 수정이 가능하면 tian_yufen이 말하는 표준 DMA 기능을 사용할 수 있도록 DMA 주소 소프트웨어를 구성 가능하게 설정하는 것이 좋습니다. –
@BenjaminLeinweber, 예 DMA 코어의 소스 코드를 가지고 있으며 DMA 스트림이 일반 매개 변수로 사용되는 주소를 구성 할 수 있습니다. – bromanous