此线程引用的是在写入 USB 时针对内核严重错误而创建的另一个线程。
我们发现、它似乎仅在 PRU 运行时发生。
我们的 PRU 代码与 TIDA0155示例非常相似: https://git.ti.com/cgit/apps/tida01555/
我们使用其中一个 PRU 内核作为 SPI 总线、另一个 PRU 内核将数据读取并写入 DDR 存储器中的某个位置。
我们在 DTS 文件中保留了这部分内存、我修改了 PRU 驱动程序以接受 memory-region 命令、也重新映射了此部分。
/*为 PRU 缓冲区保留128KB DDR 存储器*/
/{
保留存储器{
#address-cells =<1>;
大小单元格=<1>;
范围;
PRU_RESERVED:PRU_RESERVED@0x9ffc0000{
reg =<0x9ffc0000 0x00020000>;
无地图;
};
};
};
以下是/proc/iomem 结果、表明该段不包括在内:
8000000000-9ffbFFFF:系统 RAM
80008000-809fff:内核代码
80b00000-810e87e7:内核数据
9ffe0000-afefffff:系统 RAM
b0000000-bffffffffff:系统 RAM
我们的应用代码使用 mmap 来连接该区域。 在该设置中、所有操作均按预期工作。
PRU_MEM =(t_PRU_cmd *) mmap (0、getpagesize ()*32、PROT_READ | PROT_WRITE、MAP_SHARED、PRU_FD、PRU_MEM_START_LOC);
插入 USB 磁盘时、我们还有另一个过程会将一些数据写入到该文件中。 当 PRU 运行时、稍后我们将遇到内核严重错误。
内核严重错误始终是由于虚拟地址空间0xFFEF_Fxxx 处的未处理内核寻呼请求所致、其中 xxx 可能是不同的值。
最近、我还注意到* PgD 的 值通常与0xAFE_D861相同。 我不确定这个地点的重要性。
起初、我认为这在 PRU DDR 位置的范围内、但情况并非如此。 它在它之外。
引用的线程中显示了更完整的内核紧急情况。
如果 PRU 在 USB 处于中断或其他状态时尝试读取/写入 DDR、是否会发生某种类型的问题? 当 USB 写入散聚列表时、USB 使用的缓冲区就好像被破坏了一样。 我不确定是什么原因导致了这种情况。
[17472.778646] 8<--剪切此处----
[17472.816034]无法在虚拟地址 ffeff400处处理内核分页请求
[17472.904550] PgD = f30404e2
[17472.937623][ffeff400]* PgD=afefd861、* Pte=00000000、* Ppte=00000000
[17473.014446]内部错误:Oops:37 [#1]抢占 ARM
[17473.076287]中链接的模块:sd_mod USB_storage scsi_mod PRU_rproc IRQ_pruss_inTC pruss_omap_mailbox
[17473.190415] CPU:0 PID:4339通信:USB 存储未被污染5.10.65-AM335x #1
[17473.274647]硬件名称:通用 AM33XX (平展器件树)
[17473.349301] PC 位于__raW_writesl+0x1c/0xd4
[17473.401559 ] LR 位于 MUSB 默认值 WRITE_Fifo+0xa4/0xc4
[17473.46466]电脑:[ ] LR:[ ] PSR:20050093
[17473.541231] sp:c4be5bb0 IP:00000000 fp:c4be5bd4
[17473.605204] R10:c10db9e4 R9:c4d59c80 R8:c4d59c80
[17473.66977] r7:c4d59cb4 r6:f011dc28 r5:00000200 r4:ffeff400
[17473.749141] R3:00000000 R2:0000007c R1:ffeff400 r0:f011dc28
[17473.829105]标志:nzCv 在 模式 SVC_32 ISA ARM 段上关闭 FIQ
[17473.917602]控制:10c5387d 表:83ed4019 DAC:00000051
[17473.987971]处理 USB 存储(pid:4339、栈限制= 0x83bd0ec4)