0

Nexus S.

私が読み書きしようとしている 2 つのレジスタに関するリンクは次のとおり です 。 .arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344b/Bgbjjhaj.html

これが私がやったことです:

  1. モジュールのロードを有効にするために 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)

このエラーがまだ発生する理由を誰かが知っていますか? サイクルカウントレジスタにアクセスしようとしている行を削除すると消えてしまうので、読み取りを許可するためにすべてを行ったと思っていても、まだ読み取りを許可されていないはずです。

4

1 に答える 1

0

すべてのコアに対してユーザー モード アクセスを有効にする必要があるため、この問題が発生していると思います。on_each_cpu を使用してみて、動作するかどうかを確認してください。

于 2013-06-20T20:15:34.033 に答える