ARM cortex-a8上的读周期计数寄存器



我正在尝试从模拟器上的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

下面是我所做的:

  1. 使用修改后的金鱼内核启动模拟器,并在.config文件中插入CONFIG_MODULES=y行以启用模块加载。

  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, 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");
    }
    
  3. 标准库有以下几行尝试读取周期计数器:

     unsigned int result;
     asm volatile ("MRC p15, 0, %0, c9, c13, 0nt":  "=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)

有人知道为什么我仍然得到这个错误吗?当我删除试图访问循环计数寄存器的行时,它就消失了,所以我必须仍然不被允许读取它,即使我认为我做了所有允许读取的事情。

我认为您看到了这个问题,因为您必须为所有核心启用用户模式访问。尝试使用on_each_cpu,看看它是否有效。

相关内容

  • 没有找到相关文章

最新更新