我正在尝试从模拟器上的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_MODULES = y行插入.config文件以启用模块加载。
从以下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)
有谁知道我为什么还会收到此错误?当我删除试图访问循环计数寄存器的行时它就消失了,所以即使我认为我做了所有允许阅读的内容,我仍然不能允许它读取它。
答案 0 :(得分:0)
我认为您正在看到此问题,因为您必须为所有核心启用用户模式访问。尝试使用on_each_cpu,看看它是否有效。