arm a7运行linux,linux – ARM Cortex A7在内核模式下返回PMCCNT...

在Raspberry Pi2上,作者尝试通过内核模块读取PMCCNTR循环计数寄存器。首先,他们成功设置了PMUSERENR寄存器,但在用户模式下读取PMCCNTR时遇到了非法指令错误。通过使用on_each_cpu函数解决了多核问题,现在可以在用户模式下读取PMCCNTR,但计数器并未递增。问题依然在于如何正确启用PMCCNTR使其工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我想在Raspberry Pi 2上读取循环计数寄存器(PMCCNTR),它有一个ARM Cortex A7内核.我为它编译了一个内核模块,如下所示:

#include

#include

int init_module()

{

volatile u32 PMCR, PMUSERENR, PMCCNTR;

// READ PMCR

PMCR = 0xDEADBEEF;

asm volatile ("mrc p15, 0, %0, c9, c12, 0

" : "=r" (PMCR));

printk (KERN_INFO "PMCR = %x

", PMCR);

// READ PMUSERENR

PMUSERENR = 0xDEADBEEF;

asm volatile ("mrc p15, 0, %0, c9, c14, 0

" : "=r" (PMUSERENR));

printk (KERN_INFO "PMUSERENR = %x

", PMUSERENR);

// WRITE PMUSERENR = 1

asm volatile ("mcr p15, 0, %0, c9, c14, 0

" : : "r" (1));

// READ PWMUSERENR AGAIN

asm volatile ("mrc p15, 0, %0, c9, c14, 0

" : "=r" (PMUSERENR));

printk (KERN_INFO "PMUSERENR = %x

", PMUSERENR);

// READ PMCCNTR

PMCCNTR = 0xDEADBEEF;

asm volatile ("mrc p15, 0, %0, c9, c13, 0

" : "=r" (PMCCNTR));

printk (KERN_ALERT "PMCCNTR = %x

", PMCCNTR);

return 0;

}

void cleanup_module()

{

}

MODULE_LICENSE("GPL");

并且,在insmod之后,我在/var/log/kern.log中观察到以下内容:

PMCR = 41072000

PMUSERENR = 0

PMUSERENR = 1

PMCCNTR = 0

当我尝试从用户模式读取PMCCNTR时,即使PMUSERENR设置为1,我也会收到非法指令.

为什么PMCCNTR在内核模式下读为0,在用户模式下读为非法指令?还有其他我需要做的事情,我没有做到启用PMCCNTR吗?

更新1

部分解决了.解决多核问题的方法是调用on_each_cpu,如下所示:

#include

#include

static void enable_ccnt_read(void* data)

{

// WRITE PMUSERENR = 1

asm volatile ("mcr p15, 0, %0, c9, c14, 0

" : : "r" (1));

}

int init_module()

{

on_each_cpu(enable_ccnt_read, NULL, 1);

return 0;

}

void cleanup_module()

{

}

MODULE_LICENSE("GPL");

我现在可以从userland读取PMCCNTR:

#include

unsigned ccnt_read ()

{

volatile unsigned cc;

asm volatile ("mrc p15, 0, %0, c9, c13, 0" : "=r" (cc));

return cc;

}

int main() {

std::cout << ccnt_read() << std::endl;

}

要在特定核心上运行userland程序,您可以像这样使用任务集(例如,在核心2上运行):

$taskset -c 2 ./ccnt_read

0

PMCCNTR仍未递增.他们需要以某种方式“开启”.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值