47

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

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

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

  • /proc 内のファイルを読み込んでいますか?
  • システムコール?
  • 推論によって PAGE_SIZE を計算できる他の関数 (ORDER、getpageshift など)?
  • 他の?
4

7 に答える 7

69

getconfページサイズを簡単に取得できるユーティリティを使用してみてください。

getconf PAGESIZE
于 2012-10-01T11:02:16.137 に答える
19

おおよその方法の 1 つは、サイズを読み取っ/proc/meminfoてチェックし (Mapped現在の私の場合は 52544 kB)、チェックインnr_mappedします/proc/vmstat(私の場合は現在の 131136)。最後にPAGE_SIZE = Mapped/nr_mapped。これにより、正確な値が得られる場合もあれば (引用した現在の例のように)、概算ではあるが非常に近い場合もあります。お役に立てれば!

于 2011-06-07T07:12:01.540 に答える
7

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

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

于 2011-02-09T22:41:01.847 に答える
5

これは私が最終的にやったことです:

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

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

于 2011-08-03T19:44:01.797 に答える
0

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

于 2014-02-03T12:32:07.903 に答える
0

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

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

于 2011-05-10T05:15:42.930 に答える