我在一个嵌入式系统上(来自 Xilinx 的 Zynq。它使用 ARMv7、Cortex-A9),并运行 Linux。我需要确保一定的物理内存范围内没有访问过发,无论是意外内核空间或用户。我可以发出信号、数据中止或其他任何事情,但这种硬件尝试不能超过 MMU。
在裸机模式和 U-Boot 中,我可以直接访问 TLB 的位置,并且可以通过将 MMU 配置为在发生任何读或写访问时中止数据来限制硬件级别的内存访问。我想在 Linux 中这样做,即使是 mmap() 也会引发数据中止。
推理:
在 Zynq 中,2GB 的地址空间被分配给一个可能永远不会在硬件级别响应的范围。ARM 的 AXI/AMBA 协议说主机永远不能“放弃”访问地址的尝试,即使那里什么都没有。如果我取消引用一个没有硬件驻留的指针,整个芯片就会挂起。
我知道我可以“只是不给 sudo”或“只是编写好的驱动程序”,但这甚至在那个级别之前。我想在早期启动时将 MMU 的 TLB 设置为如果我的超级用户进行了一些错误的编码,则数据完全中止。我宁愿不 hack boot.S,而是直接修改 TLB,然后使用 API 来刷新它。