大家好!我正在用 Station P2 做系统相关的研究,现在遇到一个问题,希望有了解 Linux 内核或 RK3568 内部实现的小伙伴看看是怎么回事。

背景是这样:我对 Ubuntu 20.04 Linux 内核(版本 4.19.219)做了一些改动,想让某些指定的用户态程序运行在内核线程态(EL2t 或 EL1t,SPSel 选择 sp_el0)。当然,这些程序用到的虚拟内存会在页表里 clear PTE_USER 和 PTE_PXN,以便它们运行的时候能正常访问自己的内存。Linux 内核里的异常向量表我也做了对应的改动,以便它们运行时能正常地执行系统调用和处理中断。

现在我遇到的问题是:我想在这些程序运行时启用 PAN(Privileged Access Never)来阻止它们访问内核内存(我在页表里对所有内核内存 set PTE_USER),然而无论是内核里 eret 时 set SPSR.PAN 还是程序运行时手动 msr pan, #1,程序都会卡住并且没有办法杀掉。卡住的状态下通过 htop 看 CPU 占用率基本为零,但没办法知道当前 CPU 到底处于什么状态。我在内核异常向量表的 kernel_ventry 宏里加了一堆 print 也没有触发,似乎说明 CPU 不在 handler mode?

总之现在的状况我实在搞不明白了,难道是 RK3568 在硬件上不支持 EL2t 或 EL1t 启用 PAN?如果有懂的小伙伴还望不胜赐教!感谢!