我正在尝试从模拟器上的android本机库读取ARM cortex-a8 CPU上的周期计数寄存器,模拟Nexus s。
以下是关于我试图读取和写入的两个寄存器的链接:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344b/Bgbcjifb.htmlhttp://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344b/Bgbjjhaj.html
下面是我所做的:
-
使用修改后的金鱼内核启动模拟器,并在.config文件中插入CONFIG_MODULES=y行以启用模块加载。
-
从下面的C文件创建一个模块:android_module.c
#include <linux/module.h> #include <linux/kernel.h> MODULE_LICENSE ("GPL"); int init_module(void) { /* enable user-mode access to the performance counter*/ asm volatile ("mcr p15, 0, %0, c9, c14, 0n" : : "r" (1)); /* disable counter overflow interrupts (just in case)*/ asm volatile ("MCR p15, 0, %0, C9, C14, 2nt" :: "r"(0x8000000f)); printk (KERN_INFO "User-level access to CCR has been turned on.n"); return 0; } void cleanup_module(void) { printk (KERN_INFO "Goodbye Modulen"); }
-
标准库有以下几行尝试读取周期计数器:
unsigned int result; asm volatile ("MRC p15, 0, %0, c9, c13, 0nt": "=r" (result)::);
-
我使用以下命令行选项从eclipse启动模拟器:
-kernel /home/developer/AndroidDevelopment/kernel/goldfish/arch/arm/boot/zImage
-
我将模块推入模拟器,然后:
$adb shell insmod android_module.ko $dmesg
,最后一行是:
<6>User-level access to CCR has been turned on.
这样我就知道模块已经安装了。然而,当我运行使用库的应用程序时,我在Logcat中得到以下消息,应用程序终止。
06-20 19:16:03.860: A/libc(806): Fatal signal 4 (SIGILL) at 0x4e9c31b8 (code=1), thread 826 (Thread-75)
有人知道为什么我仍然得到这个错误吗?当我删除试图访问循环计数寄存器的行时,它就消失了,所以我必须仍然不被允许读取它,即使我认为我做了所有允许读取的事情。
我认为您看到了这个问题,因为您必须为所有核心启用用户模式访问。尝试使用on_each_cpu,看看它是否有效。