Cプログラムとmallocを使用してプロセッサのページサイズを調べることは可能ですか?sysconf()呼び出しを使用しないのですか?
4 に答える
Linux カーネル ヘッダーを #include できる場合は、マクロ PAGE_SIZE を
<asm/page.h>
cygwin (およびおそらく Windows の ddk) では、私は
<w32api/ddk/winddk.h>
実行時にページ サイズを計算するための "ダーティ トリック" (非常に汚い!) があります。すべて移植性がなく、完全にシステムに依存します。
楽しもう!
多くのシステムで可能なトリックは、1 バイト長だけの共有メモリ オブジェクトを作成することです。システム コールは通常、サイズをシステム ページ サイズに切り上げます。漂白!
もう 1 つは、UNIX ライクなシステムで実行していて、あえて SIGSEGV シグナルを傍受する場合、有効な領域を探してメモリを探索し、それらが丸められている 2 の累乗を確認することができます。うーん...
では、なぜ sysctl が良くないのでしょうか?
よろしく
標準Cには「ページサイズ」の概念がないため、タグに基づいて、いいえ。実装固有の方法があるかもしれません - を使用することに特に嫌悪感はありますsysconf
か? 必要な情報を実際に取得する方法であるため、言及していると思いますが、その場合は使用しないでください。
Malloc は、あなたが知りたいことを教えてはくれません。多くの場合、割り当てられるものの最小サイズと配置に関する考慮事項がありますが、それらは必ずしもページサイズと同じ (または定義された方法で関連する) とは限りません。他の場所を探しますか?どのような環境で実行していますか?
(実際には答えではありませんが、コメントセクションに追加できないため、ここで返信します:調査の結果の一部です)
(最初の質問で先に述べたように、私の興味は純粋に学術的なものであり、ページサイズを計算し、それらすべてが同じ値に同意することを確認するためにいくつかの方法が必要でした)
sysconf を使用せずにシステム/マイクロプロセッサのページ サイズを調べるのは、ただの楽しみです。これは私がこれまでに試したことです:
- sysconf(_SC_PAGE_SIZE) を使用して実際のページ サイズを取得: このコンピューターで 0x1000 を取得しました。これは 4K (32 ビット Linux がロードされた Intel 386 プロセッサ) です。次のステップは、この値を他のいくつかの方法で確認することです (私はそれらを確実に見つけることができます)。
-次に、1バイトのメモリを割り当てました
- ループ内で、オフセット カウンターを使用して、割り当てられたメモリを 1 バイト超えて書き込みました。1ページサイズを超え、2ページサイズをわずかに下回る0x19a8までは正常に機能しました。
-SEGV は、1 ページから 2 ページ サイズの間で、最後に向かって発生します。これは繰り返し可能です。
-そのため、このメソッドはページ サイズを確実に見つけることができませんでした。
それが私がこの質問をした理由です。ページサイズを見つけるためのトリック (カーネルで利用可能な直接情報を使用する以外に) はありますか? malloc についても妥協する準備ができています (他のトリックを使用することを意味します)。