データキャッシュを無効にする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
、誰もがキャッシュを無効にする簡単な方法を知っていれば、私はすべての耳です!
マクロ 'v7_exit_coherency_flush'は、モジュールによって呼び出されることはありません。コンパイルされたカーネルとドライバだけがそのマクロを使用できます。モジュールから呼び出し可能であるためには、関数をエクスポートする必要があることに注意してください( 'EXPORT_SYMBOL')。 includeについては '.S'ファイルはインクルードされるものではありません。代わりに、コピーしてモジュールと一緒にコンパイルすることができます。 – Tsyvarev
これは、通常は[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ドライバ/モジュールは、すべてのハードウェア上で動作するようになっています。 –