我试图从Linux内核写入系统控制寄存器。但是结果是分割错误:



来自内核模块的代码:

#define REGBASE 0x20050000

void writeRegister(void){
    __raw_writel( 0x00000002, REGBASE + 0x0004 );
}

如何访问系统控制寄存器所在的片上存储器?

最佳答案

我猜想REGBASE是一个物理地址,而不是虚拟地址。您需要先让内核将其映射到地址空间,然后才能使用它。大多数情况下,您会使用ioremap进行映射。

例如:

void __iomem *io = ioremap(REGBASE, SZ_4K);
writel(0x00000002, io + 0x0004);

08-17 05:46