IDL*_*yer 5 linux pager memory arm virtual-memory
我在一个嵌入式系统上(来自 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 来刷新它。
Linux 内核有选项来限制它将用作 RAM 的物理地址范围,但这不会阻止有缺陷的驱动程序或访问/dev/mem以逃避这些范围。在启动阶段修改 MMU 配置不会有任何好处,因为无论如何内核都会在此之后控制 MMU。如果您想绝对确定 Linux 系统不会访问某些内存范围,则需要一些外部控制。
您的架构提供了一种方法来限制 Linux 内核可以访问的内容:TrustZone(或更准确地说 TrustZone 加上内存防火墙)¹。我怀疑您是否会为您正在做的事情找到交钥匙解决方案,您需要进行一些编码。幸运的是,可以使用有关 Zync上TrustZone 的文档。这是基本思想:
¹最近的 ARM 处理器提供了另一种方式,即运行管理程序,但在 Cortex-A9 上不可用。
| 归档时间: |
|
| 查看次数: |
1335 次 |
| 最近记录: |