2016-11-16 15 views
0

データキャッシュを無効にするlinuxカーネルモジュールを作成しようとしています。私はarch/arm/include/asm/cacheflush.hでv7_exit_coherency_flush(all)関数を使用しようとしています。この関数はv7_flush_dcache_allを呼び出します。これはarch/arm/mm/arch-v7.Sにあります。モジュール/ v7_flush_dcache_allの未知のシンボルがLinuxカーネルモジュールで未定義

私の問題は、私は私のモジュールを作るしようとしたとき、私は警告

WARNING: "v7_flush_dcache_all [/home/pi/Documents/ARMHammer/kern/my_kernel/cache_disable.ko] undefined! 

を取得し、私はモジュールを挿入しようとすると、私はエラー

insmod: ERROR: could not insert module cache_disable.ko: Unknown symbol in module 

を取得するので、それはのように見えるということですそのach-v7.Sファイルは読み込まれていません。私は単にそれを私のメインファイルに含めようとしましたが、それは多分アセンブリファイルのために多くのエラーを作りました。

私はかなりの時点で固執していますが、多分私はアセンブリファイルをMakefileに含めることができますか、あるいは必要な.hファイルをすべて含んでいないかもしれませんか?その価値は、ここに私のメインのファイル

#include <linux/kernel.h> 
#include <linux/module.h> 
#include <linux/init.h> 
#include <linux/sched.h> /* For current */ 
#include <linux/tty.h>  /* For the tty declarations */ 
#include <linux/version.h> /* For LINUX_VERSION_CODE */ 
#include <linux/mm.h> 

#include <asm/cp15.h> 
#include <asm/cacheflush.h> 
#include <asm/glue-cache.h> 
#include <asm/shmparam.h> 
#include <asm/cachetype.h> 
#include <asm/outercache.h> 

// #include "my_cache-v7.h" 


MODULE_LICENSE("GPL"); 
MODULE_AUTHOR("Peter Jay Salzman"); 


static void print_string(char *str) 
{ 
    struct tty_struct *my_tty; 
    #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,5)) 
     my_tty = current->tty; 
    #else 
     my_tty = current->signal->tty; 
    #endif 

     if (my_tty != NULL) { 
      ((my_tty->ops)->write) (my_tty, /* The tty itself */ 
    #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,9))  
          0, /* Don't take the string 
           from user space  */ 
    #endif 
          str, /* String     */ 
          strlen(str)); /* Length */ 
    #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,9))  
      ((my_tty->ops)->write) (my_tty, 0, "\015\012", 2); 
    #else 
      ((my_tty->ops)->write) (my_tty, "\015\012", 2); 
    #endif 
    } 
} 

static int __init print_string_init(void) 
{ 
    v7_exit_coherency_flush(all); 

    print_string("The module has been inserted. Hello world!"); 
    return 0; 
} 

static void __exit print_string_exit(void) 
{ 
    print_string("The module has been removed. Farewell world!"); 
} 

module_init(print_string_init); 
module_exit(print_string_exit); 

と私のMakefileを何のために

また
obj-m += cache_disable.o 
KDIR = /home/pi/linux/ 
all: 
    make -C $(KDIR) M=$(PWD) modules 

clean: 
    make -C $(KDIR) M=$(PWD) clean 

、誰もがキャッシュを無効にする簡単な方法を知っていれば、私はすべての耳です!

+0

マクロ 'v7_exit_coherency_flush'は、モジュールによって呼び出されることはありません。コンパイルされたカーネルとドライバだけがそのマクロを使用できます。モジュールから呼び出し可能であるためには、関数をエクスポートする必要があることに注意してください( 'EXPORT_SYMBOL')。 includeについては '.S'ファイルはインクルードされるものではありません。代わりに、コピーしてモジュールと一緒にコンパイルすることができます。 – Tsyvarev

+0

これは、通常は[proc](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/arm/mm/proc- v7.S?id = refs/tags/v4.9-rc5#n542)メカニズム。特定のARMバージョンは、特定のARM CPUタイプに関連付けられます。 Linuxドライバ/モジュールは、すべてのハードウェア上で動作するようになっています。 –

答えて

1

v7_exit_coherency_flush()は、パワーマネージメントコードのために、パワーオフするためにCPUをカーネルからきれいに取り除くためのものです。それは非常に正当な理由からランダムモジュールから呼び出し可能ではありません。あなたが実際にデータを失い、奇妙で微妙な方法でマシンをクラッシュさせたいのであれば、カーネル関数を完全にバイパスし、SCTLRを直接打つために簡単なインラインasmを使用するかもしれません。*

あなたが達成しようとしていることを想像するのは恐ろしいですが、キャッシュをオフにしてLinuxを(辛抱強くゆっくりと)実行したい場合は、カーネルを再構築し、CONFIG_SMPをオフにするCONFIG_CPU_DCACHE_DISABLE。それはうまくいくかもしれない曖昧にサポートされた方法です。

*私はそれを説明するつもりもない、それはひどい考えです。

関連する問題