Xilinx ARM SoC에서 io 메모리에 액세스할 때 Linux가 정지됩니다.

Xilinx ARM SoC에서 io 메모리에 액세스할 때 Linux가 정지됩니다.

FPGA 메모리를 읽으려고 합니다.자일링스 Zynq 보드(zc702) RTEMS 드라이버를 Linux로 포팅하는 과정의 일부입니다. 나는 사용하고있다개발 메모리 2그리고mmap_test저는 개발 보드용 프로그램을 크로스 컴파일하기 위해 Yocto 크로스 컴파일러를 사용합니다. 보드에는 1GB의 일반 메모리가 있습니다. 이는 0x0과 0x40000000 사이의 모든 읽기가 유효한 메모리를 반환한다는 것을 의미합니다. 그러나 문제는 0x7AA00000에서 읽을 때 커널 패닉 메시지를 터미널(minicom 및 ssh가 있는 직렬 포트)에 인쇄하지도 않고 즉시 커널이 충돌한다는 것입니다. 해당 주소에서 읽고 kprint를 사용하기 위해 작은 샘플 커널 모듈도 작성했지만 동일한 충돌이 발생했습니다. 이 드라이버는 RTEMS와 함께 작동하므로 물리적 메모리 주소가 올바른 것으로 확인되었습니다.

Linux 충돌 없이 FPGA 메모리/레지스터에서 데이터를 읽으려면 어떤 단계를 수행해야 합니까?

답변1

드디어 내가 왜 계속 충돌하는지 알게 되었습니다. 이는 두 가지 요소의 조합입니다(사악한 문제의 경우와 마찬가지로).

  1. 이를 통한 메모리 액세스는 /dev/mem페이지 정렬되어야 합니다.
  2. FPGA 메모리에 액세스할 때 비트스트림을 먼저 로드해야 합니다.

처음에는 FPGA 비트스트림을 로드한 다음 cat stream.bit > /dev/xdevcfg(매핑 없음) 물리적 주소를 직접 역참조하여 레지스터에 액세스하려고 했습니다. 나중에 읽기 위해 devmem2를 사용하는 것을 고려했지만 /dev/mem비트스트림이 로드되지 않았습니다. 두 가지 모두 유사한 오류, 프로그램 충돌 및 커널 정지가 발생했으며 두 가지 오류가 있음을 발견하는 데 시간이 걸렸습니다.

관련 정보