이 문제에는 추가 설명이 필요합니다.
배경: 저는 ARM 프로세서 + FPGA로 구성된 임베디드 시스템(Xilinx zynq ultrascale+)을 개발 중입니다. 메모리 맵(시스템을 베어 메탈로 사용하는 경우)은 다음과 같습니다.
ARM에 연결됨(데이터시트에 따름):
Segment name | Start addresss | Size
HP0_DDR_HIGH | 0x0_0008_0000_0000 | 32G
HP0_DDR_LOW | 0x0_0000_0000_0000 | 2G
HP0_LPS_OCM | 0x0_0000_FF00_0000 | 16M
HP0_QSPI | 0x0_0000_C000_0000 | 512M
그런 다음 FPGA의 DDR 컨트롤러를 통해 액세스할 수 있는 외부 RAM(4GB)이 있습니다. 이 추억이 여기 있어요
Segment name | Start addresss | Size
C0_DDR4_ADDRESS_BLOCK | 0x0_0005_0000_0000 | 4G
저는 Linux용으로 빌드할 때 Yocto로 변장한 Xilinx Petalinux 툴체인을 사용합니다. 시스템이 부팅된 후 0x5_0000_0000
해당 물리적 주소를 사용하거나 명령을 통해 devmem
또는 사용자 공간에서 물리적 주소를 매핑하여 외부 DDR에 액세스할 수 있습니다.
나는 리눅스가 부팅 시 장치 트리를 구문 분석하여 이 추가 DDR을 발견한다고 생각합니다.
자세한 내용: 데이터시트 보기(https://www.xilinx.com/support/documentation/user_guides/ug1085-zynq-ultrascale-trm.pdf)
이 주소는 MMU 번역 장치에 포함되지 않는 것으로 보입니다.
질문):
- Linux가 가능한 메모리 풀의 일부로 외부 ddr을 사용하는지 확인하는 방법은 무엇입니까? OS가 메모리의 모든 페이지를 추적한다는 것을 알고 있는데 이 메모리가 페이징됩니까?
- 운영 체제가 이 메모리를 사용하여 프로세스 주소 공간을 생성하고 관리할 수 있습니까?
- 이 물리적 주소를 프로세스의 사용자 가상 주소 공간에 매핑한다고 가정하면 커널이 새 페이지 항목을 생성합니까?