如何从linux内核模块(cpu:ARM)写入寄存器

Har*_*ock 4 linux memory arm

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

无法处理虚拟地址 20050004 处的内核分页请求

内核模块中的代码:

#define REGBASE 0x20050000

void writeRegister(void){
    __raw_writel( 0x00000002, REGBASE + 0x0004 );
}
Run Code Online (Sandbox Code Playgroud)

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

tan*_*grs 5

我猜 REGBASE 是一个物理地址而不是虚拟地址。您需要先让内核将其映射到地址空间中,然后才能使用它。大多数时候你会ioremap用来映射它。

例如:

void __iomem *io = ioremap(REGBASE, SZ_4K);
writel(0x00000002, io + 0x0004);
Run Code Online (Sandbox Code Playgroud)