web-dev-qa-db-ja.com

Linuxカーネルのページサイズをプログラムで取得する方法

IA64用のLinuxモジュールに取り組んでいます。私の現在の問題は、ドライバーがdmaページの割り当てにPAGE_SIZEおよびPAGE_SHIFTマクロを使用していることです。私が抱えている問題は、ドライバーをコンパイルするマシンが、ドライバーを実行するのに必要なマシンではないということです。そのため、コンパイルマシンのPAGE_SIZEが2 ^ 14Kで、宛先マシンが2 ^ 16Kの場合、ドライバーは失敗します。

この質問を、モジュールを実行しているマシンではないマシンでモジュールをコンパイルすることに関する「ベストプラクティス」の問題にしたくありません。私はそれに関する問題を理解しています。私が見つけたのは、人々が主にgetpagesize()またはsysconf(_SC_PAGE_SIZE)を使用していることです。これら2つのオプションはia64カーネルヘッダーに含まれていないため、使用できません。ランタイムPAGE_SIZEを取得できる別の方法はありますか?

私が見ているオプション:

  • / procのファイルを読み取りますか?
  • syscall?
  • 推論によってPAGE_SIZEを計算できる他の関数(例:ORDER、getpageshiftなど)
  • その他?
32
Freddy

これは私がついにやったことです:

  • 現在のモジュールを作り直してpage_shiftという新しいモジュールパラメーターを取得し、それを使用してPAGE_SIZE (PAGE_SIZE = 1 << PAGE_SHIFT)を計算します
  • 現在のシステムを取得するモジュールローダーラッパーを作成しましたPAGE_SHIFT libcのgetconf AP​​Iを使用します。このラッパーは、現在のシステムページシフトを取得し、モジュールパラメーターとして渡します。

現在、モジュールは、異なるPAGE_SIZEの異なるアーキテクチャに問題なくロードされています。

5
Freddy

getconf ユーティリティを使用してみてください。これにより、ページサイズを簡単に取得できます。

getconf PAGESIZE
47
vetri

近似方法の1つは、/proc/meminfoMappedサイズをチェックし(現在は52544 kBです)、_nr_mapped in /proc/vmstat(私の現在は131136です。)最後に PAGE_SIZE = Mapped/nr_mapped。時々、これは正確な値を与えます(私が引用した現在の例のように)、時にはその近似値であるが非常に近い値を返します。お役に立てれば!

17
Pavan Manjunath

カーネルモジュールをビルドしようとしている場合、少なくともモジュールが実行されるカーネル用に構成されたカーネルヘッダーが必要です。これらは、必要なページサイズマクロを定義します。正しく構成されたヘッダーがない場合、カーネルはモジュールのロードを拒否します。

また、異なるアーキテクチャであっても、あるマシンでモジュールをコンパイルして別のマシンで実行しても問題はありません。正しいカーネルソースに対してビルドする必要があります。

6
JayM

ページサイズを見つける1つの方法は、プロセスのsmapから取得することです。

例えば:

cd /proc/1
grep -i pagesize smaps

KernelPageSize:        4 kB
MMUPageSize:           4 kB
5
ria

ページサイズはカーネルの一部として定義されているものなので、不可能だと思います。カーネルモジュールのコンパイルに使用するツールチェーンの場合、ページサイズの知識が必要です。

少なくとも現在のカーネルアーキテクチャでは、そうすることは不可能です。

0
kumar

テストを実行し、異なるオフセットでファイルをmmapするだけで、どちらが失敗するかを確認できます。ただし、カーネルモジュールでは煩わしいかもしれませんが、使用できるようなテストが他にもあるかもしれません。

0
Justin Cormack