我想在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\n\t" : "=r" (PMCR));

printk (KERN_INFO "PMCR = %x\n", PMCR);

// READ PMUSERENR

PMUSERENR = 0xDEADBEEF;

asm volatile ("mrc p15, 0, %0, c9, c14, 0\n\t" : "=r" (PMUSERENR));

printk (KERN_INFO "PMUSERENR = %x\n", PMUSERENR);

// WRITE PMUSERENR = 1

asm volatile ("mcr p15, 0, %0, c9, c14, 0\n\t" : : "r" (1));

// READ PWMUSERENR AGAIN

asm volatile ("mrc p15, 0, %0, c9, c14, 0\n\t" : "=r" (PMUSERENR));

printk (KERN_INFO "PMUSERENR = %x\n", PMUSERENR);

// READ PMCCNTR

PMCCNTR = 0xDEADBEEF;

asm volatile ("mrc p15, 0, %0, c9, c13, 0\n\t" : "=r" (PMCCNTR));

printk (KERN_ALERT "PMCCNTR = %x\n", 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\n\t" : : "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仍未递增.他们需要以某种方式“开启”.

解决方法:

您所做的是启用计数器的用户级访问权限.您尚未启用此计数器.除了允许访问之外,还必须对PMCNTENSET的第31位(C位)进行编程以启用计数.这与您的on_each_cpu()更改一起应该启用您要查找的功能.

需要注意的是:如果进程迁移到CCNT读取之间的不同核心,则会导致测量结果混乱.

标签:linux,raspberry-pi,arm,raspberry-pi2

来源: https://codeday.me/bug/20190823/1695093.html

linux 返回非法指令,linux – ARM Cortex A7在内核模式下返回PMCCNTR = 0,在用户模式下返回非法指令(即使在PMUSERENR = 1之后)...相关推荐

  1. i.MX6UL: i.MX 6UltraLite处理器 - 低功耗,安全,Arm® Cortex®-A7内核

    i.MX6UL: i.MX 6UltraLite处理器 - 低功耗,安全,Arm® Cortex®-A7内核 概述 i. MX6UltraLite作为i.MX6系列的扩展,一系列高性能.超高效的处理器 ...

  2. STM32MP157C-DK2->Develop on Arm® Cortex®-A7之 C语言开发uart例程

    编写C代码开启STM32MP157C-DK2开发板上的uart7的接收功能,并将收到的数据打印到控制台,并通过uart7发送出"uart"字符串. STM32MP157C-DK2的 ...

  3. ARM Cortex A7 架构简介

    Cortex-A7 MPCore 简介 MP表示是多核的意思,Cortex-A7 MPcore 处理器支持 1~4 核,A7主打低功耗,因此多用于运行普通应用,通常和Cortex-A15 组成 big ...

  4. STM32MP157C-DK2->Develop on Arm® Cortex®-A7之 开启UART7串口功能

    开启并测试STM32MP157C-DK2开发板上的uart7的收发功能. 根据en.MB1272-DK2-C01_Schematic可以得知STM32MP157C-DK2开发板的CN14的D0和D1为 ...

  5. linux进入单用户模式改密码,1.4linux单用户模式下修改root密码和救援模式修改root密码...

    在忘记root密码无法登入系统的情况下,有两种修改root密码的方法. 第一种:进入单用户模式下,直接修改root密码,前提是grub没有设置密码. 第二种:使用安装光盘启动,进入救援模式更改root ...

  6. linux Rootkit:x86与ARM的内联内核函数Hooking

    介绍 几个月前,我添加了一个新的项目.(https://github.com/mncoppola/suterusu)         通过我的各种对路由器后门及内核漏洞利用的探险,我最近的兴趣转向Li ...

  7. STM32MP157C-DK2->Develop on Arm® Cortex®-A7之 C语言开发LED例程

    编写C代码控制STM32MP157C-DK2开发板上的LD5以1s的时间间隔闪烁. 根据en.MB1272-DK2-C01_Schematic可以得知STM32MP157C-DK2开发板有两个GPIO ...

  8. 【ARM学习笔记】ARM Cortex -A7 EPIT定时器

    简述 ARM Cortex-A7的一个定时器,用来完成周期性中断定时 特点: 时钟源可选的32位向下计数器 12位的分频值 当计数值和比较值相等的时候产生中断 可以即使编程的计数器值 在低功耗和调试模 ...

  9. Cortex - A7架构的基本资料

    A7支持一到四核,是小核,通常与大核如Cortex - A15 配合,大核负责高性能运算,小核负责普通应用.A7性能堪比A9,但是lower power A7有九种运行模式,我们常用的是 user用户 ...

最新文章

  1. C++显式隐式构造函数
  2. org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'xx' is defined
  3. linux我如何查看一个脚本的路径,linux获取shell脚本所在绝对路径操作介绍
  4. 【性能测试】基本入门(包含mysql锁)
  5. mysql group by top_Mysql group by top N的问题 | 学步园
  6. 【C/C++】运算符优先级记忆
  7. deletefile失败 代码5怎么办_Go语言高级窍门与技巧,看完你也能写出高质量代码...
  8. 解决IntelliJ IDEA在笔记本屏幕中部分界面显示不全被遮挡的问题
  9. Android 换行符号(\n)放到Android当中的TextView显示双斜杠(\\n)
  10. window设置定时任务执行python脚本
  11. 第三章 3.2 DI依赖循环 --《跟我学Spring》笔记 张开涛
  12. 整理了一份嵌入式相关开源项目、库、资料
  13. 项目中的“里程碑”就是我们常说的里程碑吗?
  14. 牛逼,个人开发者可以申请微信支付了!
  15. java中的消息队列
  16. Java集合之Set集合
  17. Burp Suite爆破模块中的四种模式的区别详解和演示(暴力破解)
  18. 容器化改造要怎么做?
  19. 【keil5】keil5仿真STM32设置
  20. 井字棋小游戏c语言简单编码,井字棋小游戏(C语言)

热门文章

  1. 无法定位序数于动态库mfc90d.dll上 由于应用程序配置不正确...解决方法
  2. Oracle 11g xe版本---总结1
  3. Linux平台中使用PHP让word转pdf
  4. [CareerCup] 14.1 Private Constructor 私有构建函数
  5. JS 混合构造函数 和 动态原型
  6. 网盘中搭建git服务
  7. 设计模式速查手册-创建型
  8. AndroidStudio_安卓原生开发_java.io.FileNotFoundException: http://172.19.128.5(拒绝访问)---Android原生开发工作笔记157
  9. Netty工作笔记0046---TaskQueue自定义任务
  10. STM32工作笔记0031---基于STM32F103C8自己实现的跑马灯实验_使用STLINK调试