2013-06-20 16 views
0

我想读的周期数从Android原生库模拟器上进行了ARM Cortex-A8 CPU上注册,模仿的Nexus S.读循环计数的ARM Cortex-A8的注册

下面是关于链接两个寄存器我试图读写: 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

这里是我做了什么:

  1. 启动模拟器与修改金鱼KER nel,将CONFIG_MODULES = y行插入.config文件以启用模块加载。

  2. 创建从下面的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"); 
    } 
    
  3. 图书馆有试图读取循环计数器下面几行:

    unsigned int result; 
    asm volatile ("MRC p15, 0, %0, c9, c13, 0\n\t": "=r" (result)::); 
    
  4. 我开始来自eclipse的模拟器使用以下命令行选项:

    -kernel /home/developer/AndroidDevelopment/kernel/goldfish/arch/arm/boot/zImage 
    
  5. 我推模块到仿真器则:

    $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

SIGILL明确指出非法指令。也许你应该验证是否在内核模式下设置了用户模式访问位。 – Ash

+0

我该如何验证? –

回答

0

我想你会看到这个问题,因为你必须为所有内核启用用户模式访问。尝试使用on_each_cpu,并查看它是否有效。

+0

对不起,我是内核的新手,我将如何去使用它? –

+0

创建一个执行用户模式访问操作的新函数(让它称为_enableumd_)。并从_init_module _call on_each_cpu_以_enableumd_作为参数。看看_on_each_cpu_签名,你就会知道如何使用它。 – Ash

+0

谢谢,但不幸的是,这并没有解决我的问题,我仍然得到致命的信号。 –