IA64用のLinuxモジュールに取り組んでいます。私の現在の問題は、ドライバーがdmaページの割り当てにPAGE_SIZEおよびPAGE_SHIFTマクロを使用していることです。私が抱えている問題は、ドライバーをコンパイルするマシンが、ドライバーを実行するのに必要なマシンではないということです。そのため、コンパイルマシンのPAGE_SIZEが2 ^ 14Kで、宛先マシンが2 ^ 16Kの場合、ドライバーは失敗します。
この質問を、モジュールを実行しているマシンではないマシンでモジュールをコンパイルすることに関する「ベストプラクティス」の問題にしたくありません。私はそれに関する問題を理解しています。私が見つけたのは、人々が主にgetpagesize()またはsysconf(_SC_PAGE_SIZE)を使用していることです。これら2つのオプションはia64カーネルヘッダーに含まれていないため、使用できません。ランタイムPAGE_SIZEを取得できる別の方法はありますか?
私が見ているオプション:
これは私がついにやったことです:
PAGE_SIZE (PAGE_SIZE = 1 << PAGE_SHIFT)
を計算しますPAGE_SHIFT
libcのgetconf
APIを使用します。このラッパーは、現在のシステムページシフトを取得し、モジュールパラメーターとして渡します。現在、モジュールは、異なるPAGE_SIZEの異なるアーキテクチャに問題なくロードされています。
getconf
ユーティリティを使用してみてください。これにより、ページサイズを簡単に取得できます。
getconf PAGESIZE
近似方法の1つは、/proc/meminfo
とMapped
サイズをチェックし(現在は52544 kBです)、_nr_mapped
in /proc/vmstat
(私の現在は131136です。)最後に PAGE_SIZE = Mapped/nr_mapped
。時々、これは正確な値を与えます(私が引用した現在の例のように)、時にはその近似値であるが非常に近い値を返します。お役に立てれば!
カーネルモジュールをビルドしようとしている場合、少なくともモジュールが実行されるカーネル用に構成されたカーネルヘッダーが必要です。これらは、必要なページサイズマクロを定義します。正しく構成されたヘッダーがない場合、カーネルはモジュールのロードを拒否します。
また、異なるアーキテクチャであっても、あるマシンでモジュールをコンパイルして別のマシンで実行しても問題はありません。正しいカーネルソースに対してビルドする必要があります。
ページサイズを見つける1つの方法は、プロセスのsmapから取得することです。
例えば:
cd /proc/1
grep -i pagesize smaps
KernelPageSize: 4 kB
MMUPageSize: 4 kB
ページサイズはカーネルの一部として定義されているものなので、不可能だと思います。カーネルモジュールのコンパイルに使用するツールチェーンの場合、ページサイズの知識が必要です。
少なくとも現在のカーネルアーキテクチャでは、そうすることは不可能です。
テストを実行し、異なるオフセットでファイルをmmapするだけで、どちらが失敗するかを確認できます。ただし、カーネルモジュールでは煩わしいかもしれませんが、使用できるようなテストが他にもあるかもしれません。