【问题标题】:Reading Cycle Count register on ARM cortex-a8在 ARM cortex-a8 上读取周期计数寄存器
【发布时间】: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

这是我所做的:

  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, 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)

有谁知道为什么我仍然收到此错误?当我删除试图访问循环计数寄存器的行时它就消失了,所以即使我认为我做了一切都允许读取,我仍然不能被允许读取它。

【问题讨论】:

  • SIGILL 明确指出非法指令。也许您应该验证是否在内核模式下设置了用户模式访问位。
  • 我如何验证这一点?

标签: android performance arm cortex-a8


【解决方案1】:

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

【讨论】:

  • 对不起,我对内核有点陌生,我该如何使用它?
  • 创建一个执行用户模式访问操作的新函数(我们称之为enableumd)。并从 init_module call on_each_cpu 使用 enableumd 作为参数。看看on_each_cpu签名就知道怎么用了。
  • 谢谢,但不幸的是这并没有解决我的问题,我仍然收到致命的信号。
  • 我相信你是对的,这是一个在所有内核上启用访问的问题,因为偶尔我会被允许读取寄存器几个周期。但是 on_each_cpu 命令没有启用对 cpu 的访问,可能是因为当我调用它时并非所有 cpu 都打开了电源?您对如何完成这项工作有任何想法吗?
猜你喜欢
  • 2016-03-08
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
相关资源
最近更新 更多