![Linux 在访问 Xilinx ARM SoC 上的 io 内存时冻结](https://linux22.com/image/125299/Linux%20%E5%9C%A8%E8%AE%BF%E9%97%AE%20Xilinx%20ARM%20SoC%20%E4%B8%8A%E7%9A%84%20io%20%E5%86%85%E5%AD%98%E6%97%B6%E5%86%BB%E7%BB%93.png)
我正在尝试读取 FPGA 内存Xilinx Zynq 板(zc702) 作为将 RTEMS 驱动程序移植到 Linux 的一部分。我正在使用开发内存2和mmap_测试我使用 Yocto 交叉编译器为开发板交叉编译的程序。该板有 1 GB 普通内存。这意味着 0x0 到 0x40000000 之间的任何读取都会返回有效内存。然而,问题是,当从 0x7AA00000 读取时,内核立即崩溃,甚至没有将内核恐慌消息打印到终端(带有 minicom 和 ssh 的串行端口)。我什至编写了小样本内核模块来从该地址读取并使用 kprint,但它会导致相同的崩溃。由于该驱动程序与 RTEMS 配合使用,因此物理内存地址已被验证是正确的。
必须采取哪些步骤才能从 FPGA 内存/寄存器中读取数据而不致 Linux 崩溃?
答案1
我终于知道为什么总是崩溃了。这是两个因素的结合(就像棘手问题的情况一样)。
- 通过它访问内存时
/dev/mem
必须与页面对齐 - 访问FPGA内存时,必须先加载比特流
最初,我一直在加载 FPGA 比特流(使用cat stream.bit > /dev/xdevcfg
),然后尝试通过直接取消引用物理地址(无映射)来访问寄存器。后来,我考虑/dev/mem
使用 devmem2 进行阅读,但没有加载比特流。两者都导致了类似的错误,程序崩溃和内核冻结,花了一段时间才发现有两个错误。