linux 返回非法指令,linux – ARM Cortex A7在内核模式下返回PMCCNTR = 0,在用户模式下返回非法指令(即使在PMUSERENR = 1之后)...
我想在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之后)...相关推荐
- i.MX6UL: i.MX 6UltraLite处理器 - 低功耗,安全,Arm® Cortex®-A7内核
i.MX6UL: i.MX 6UltraLite处理器 - 低功耗,安全,Arm® Cortex®-A7内核 概述 i. MX6UltraLite作为i.MX6系列的扩展,一系列高性能.超高效的处理器 ...
- STM32MP157C-DK2->Develop on Arm® Cortex®-A7之 C语言开发uart例程
编写C代码开启STM32MP157C-DK2开发板上的uart7的接收功能,并将收到的数据打印到控制台,并通过uart7发送出"uart"字符串. STM32MP157C-DK2的 ...
- ARM Cortex A7 架构简介
Cortex-A7 MPCore 简介 MP表示是多核的意思,Cortex-A7 MPcore 处理器支持 1~4 核,A7主打低功耗,因此多用于运行普通应用,通常和Cortex-A15 组成 big ...
- STM32MP157C-DK2->Develop on Arm® Cortex®-A7之 开启UART7串口功能
开启并测试STM32MP157C-DK2开发板上的uart7的收发功能. 根据en.MB1272-DK2-C01_Schematic可以得知STM32MP157C-DK2开发板的CN14的D0和D1为 ...
- linux进入单用户模式改密码,1.4linux单用户模式下修改root密码和救援模式修改root密码...
在忘记root密码无法登入系统的情况下,有两种修改root密码的方法. 第一种:进入单用户模式下,直接修改root密码,前提是grub没有设置密码. 第二种:使用安装光盘启动,进入救援模式更改root ...
- linux Rootkit:x86与ARM的内联内核函数Hooking
介绍 几个月前,我添加了一个新的项目.(https://github.com/mncoppola/suterusu) 通过我的各种对路由器后门及内核漏洞利用的探险,我最近的兴趣转向Li ...
- STM32MP157C-DK2->Develop on Arm® Cortex®-A7之 C语言开发LED例程
编写C代码控制STM32MP157C-DK2开发板上的LD5以1s的时间间隔闪烁. 根据en.MB1272-DK2-C01_Schematic可以得知STM32MP157C-DK2开发板有两个GPIO ...
- 【ARM学习笔记】ARM Cortex -A7 EPIT定时器
简述 ARM Cortex-A7的一个定时器,用来完成周期性中断定时 特点: 时钟源可选的32位向下计数器 12位的分频值 当计数值和比较值相等的时候产生中断 可以即使编程的计数器值 在低功耗和调试模 ...
- Cortex - A7架构的基本资料
A7支持一到四核,是小核,通常与大核如Cortex - A15 配合,大核负责高性能运算,小核负责普通应用.A7性能堪比A9,但是lower power A7有九种运行模式,我们常用的是 user用户 ...
最新文章
- C++显式隐式构造函数
- org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'xx' is defined
- linux我如何查看一个脚本的路径,linux获取shell脚本所在绝对路径操作介绍
- 【性能测试】基本入门(包含mysql锁)
- mysql group by top_Mysql group by top N的问题 | 学步园
- 【C/C++】运算符优先级记忆
- deletefile失败 代码5怎么办_Go语言高级窍门与技巧,看完你也能写出高质量代码...
- 解决IntelliJ IDEA在笔记本屏幕中部分界面显示不全被遮挡的问题
- Android 换行符号(\n)放到Android当中的TextView显示双斜杠(\\n)
- window设置定时任务执行python脚本
- 第三章 3.2 DI依赖循环 --《跟我学Spring》笔记 张开涛
- 整理了一份嵌入式相关开源项目、库、资料
- 项目中的“里程碑”就是我们常说的里程碑吗?
- 牛逼,个人开发者可以申请微信支付了!
- java中的消息队列
- Java集合之Set集合
- Burp Suite爆破模块中的四种模式的区别详解和演示(暴力破解)
- 容器化改造要怎么做?
- 【keil5】keil5仿真STM32设置
- 井字棋小游戏c语言简单编码,井字棋小游戏(C语言)
热门文章
- 无法定位序数于动态库mfc90d.dll上 由于应用程序配置不正确...解决方法
- Oracle 11g xe版本---总结1
- Linux平台中使用PHP让word转pdf
- [CareerCup] 14.1 Private Constructor 私有构建函数
- JS 混合构造函数 和 动态原型
- 网盘中搭建git服务
- 设计模式速查手册-创建型
- AndroidStudio_安卓原生开发_java.io.FileNotFoundException: http://172.19.128.5(拒绝访问)---Android原生开发工作笔记157
- Netty工作笔记0046---TaskQueue自定义任务
- STM32工作笔记0031---基于STM32F103C8自己实现的跑马灯实验_使用STLINK调试