前提・実現したいこと
Linux PCでデバイスドライバ(カーネルモジュール)の動作確認をしています。
発生している問題・エラーメッセージ
PCによっては、カーネルモジュールのメモリアクセス速度が異常に遅い問題が発生しています。 原因としてどのようなことが考えらますでしょうか? 128MBデータを書き込むのにかかる時間: PC#1: 6秒・・・問題!! PC#2: 0.5秒 以下、PCの詳細です。 PC#1 CPU: Xeon Gold 6254(18core) x 2個 メモリ: DDR4 16GB 2933MT/s RDIMM(ECC Reg) x 6個 OS: CentOS7.7(64bit) PC#2 CPU: Core i7 x 1個 メモリ: DDR4 16GB x 1個 OS: Centos7.7(64bit)
該当のソースコード
C
1#include <linux/slab.h> 2#include <linux/module.h> 3 4#define GRUB_ADDRESS 0x800000000 //GRUBのアドレス(/etc/default/grubにて定義)・・・PCにより定義が異なります 5 6static int __init test_init(void) 7{ 8 //a.変数宣言: 8Byte 9 unsigned long long *data; 10 11 //b.変数初期化: GRUBのアドレスをioremapにて仮想アドレスで初期化 12 void* p = (void*) GRUB_ADDRESS; // Physical address 13 unsigned long long size = 1024*1024*1024; //1GB 14 data = ioremap_nocache( (unsigned long long)p, size ); // Virtual address 15 16 17 printk(KERN_INFO "loop start\n"); 18 19 //c.ループ: 数値をライト: 128MB分ループ 20 unsigned long long ii; 21 for( ii=0; ii<128*1024*1024/8; ii++ ){ //128MB 22 data[ii] = ii; 23 } 24 25 printk(KERN_INFO "loop end\n"); 26 27 return 0; 28} 29 30 31static void __exit test_exit(void) 32{ 33} 34 35module_init(test_init); 36module_exit(test_exit); 37
試したこと
- 時間計測は、(c)のループ前後でprintkメッセージを出し、dmesgのタイムスタンプを利用しました。
- メモリへのアクセス関数をiowrite32()に置き換えてみたりしたのですが、現象に改善は見られませんでした。