저는 임베디드 시스템(Xilinx의 Zynq. ARMv7, Cortex-A9를 사용함)을 사용하고 Linux를 실행합니다. 특정 범위의 물리적 메모리에 액세스하지 못하도록 해야 합니다.한 번커널 공간이나 사용자에 의해 실수로 생성되었습니다. 신호, 데이터 중단 등을 보낼 수 있지만 하드웨어가 시도합니다.기필코 아니다MMU보다 더 멀리 나아가세요.
베어 메탈 모드 및 U-Boot에서는 TLB 위치에 직접 액세스할 수 있으며 읽기 또는 쓰기 액세스 시 데이터가 중단되도록 MMU를 구성하여 하드웨어 수준에서 메모리 액세스를 제한할 수 있습니다. Linux에서 이 작업을 수행하고 싶습니다. 심지어 mmap()에서도 데이터 중단이 발생합니다.
추리:
Zynq에서는 2GB 주소 공간이 다음 범위에 할당됩니다.가능한하드웨어 수준에서는 응답하지 않습니다. ARM의 AXI/AMBA 프로토콜은 주소에 아무 것도 없더라도 호스트가 주소에 액세스하려는 시도를 결코 "포기"하지 않을 것이라고 명시합니다. 하드웨어에 상주하지 않는 포인터를 역참조하면 전체 칩이 정지됩니다.
나는 "그냥 sudo를 제공하지 않는다"거나 "그냥 좋은 드라이버를 작성"할 수 있다는 것을 알고 있지만, 그것은 그 수준 이전에도 마찬가지입니다. 슈퍼유저가 잘못된 코딩을 하면 데이터가 완전히 중단되도록 초기 부팅 시 MMU의 TLB를 설정하고 싶습니다. boot.S를 해킹하지 않고 TLB를 직접 수정한 다음 API를 사용하여 새로 고치고 싶습니다.
답변1
Linux 커널에는 RAM으로 사용할 물리적 주소 범위를 제한하는 옵션이 있지만 버그가 있는 드라이버나 액세스가 /dev/mem
이러한 범위를 벗어나는 것을 방지할 수는 없습니다. 어쨌든 부팅 중에 커널이 MMU를 제어하므로 부팅 중에 MMU 구성을 수정해도 아무런 이점이 없습니다. Linux 시스템이 특정 메모리 범위에 액세스하지 않는다는 것을 절대적으로 확인하려면 외부 제어가 필요합니다.
귀하의 아키텍처는 Linux 커널이 액세스할 수 있는 항목을 제한하는 방법을 제공합니다.신뢰 영역(정확히 말하면 TrustZone 플러스 메모리 방화벽) 1. 현재 하고 있는 작업에 대한 턴키 솔루션을 찾을 수 있을지 의심스럽습니다. 일부 코딩을 수행해야 합니다. 다행스럽게도,Zync의 TrustZone에 대한 문서사용 가능. 기본 아이디어는 다음과 같습니다.
- 프로세서가 S 모드에서 시작됩니다. 이 잘못된 2GB 범위 내에서 비보안 액세스를 비활성화하려면 TrustZone 제어 레지스터를 설정하십시오.
- 이 작업이 완료되면 NS 모드로 전환하고 일반 부트로더로 분기합니다.
- Linux가 차단된 2GB 범위에 액세스하려고 시도하면 메모리 버스에 도달하기 전에 요청이 차단되고 중단이 트리거됩니다(또는 캐시나 프리페치가 관련된 경우 부정확한 중단이 발생함).
최신 ARM 프로세서는 하이퍼바이저를 실행하는 대안을 제공하지만 Cortex-A9에서는 이를 사용할 수 없습니다.