【发布时间】:2013-06-20 19:36:19
【问题描述】:
我正在尝试从模拟器上的 android 本机库中读取 ARM cortex-a8 CPU 上的循环计数寄存器,以模拟 Nexus S。
以下是关于我尝试读写的两个寄存器的链接: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344b/Bgbcjifb.html http://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, 0\n" : : "r" (1)); /* disable counter overflow interrupts (just in case)*/ asm volatile ("MCR p15, 0, %0, C9, C14, 2\n\t" :: "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 Module\n"); } -
该库有以下几行尝试读取循环计数器:
unsigned int result; asm volatile ("MRC p15, 0, %0, c9, c13, 0\n\t": "=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)
有谁知道为什么我仍然收到此错误?当我删除试图访问循环计数寄存器的行时它就消失了,所以即使我认为我做了一切都允许读取,我仍然不能被允许读取它。
【问题讨论】:
-
SIGILL 明确指出非法指令。也许您应该验证是否在内核模式下设置了用户模式访问位。
-
我如何验证这一点?
标签: android performance arm cortex-a8