2016-11-10 1 views
1

私は現在、メモリページサイズ(sysconf(_SC_PAGESIZE)によって返される)を利用する移植可能なCプログラムで作業しています。私は最も頻繁にページサイズがビット単位の操作を使用して効率的な管理を可能にする2の累乗であることを知っています。私はどこでもこのことを保証していませんでした。だから、ページサイズは2の累乗であると仮定するのはどれくらい安全ですか?この条件を満たさないアーキテクチャの例はありますか?メモリページサイズが2の累乗であると想定するのは安全ですか?

+2

MMUには除算器は含まれていませんが、ビットのマスキングを使用して仮想アドレスをテーブルウォーク用の部分に分割するため、安全な方法です。 – Olaf

+0

あなたはサイズを取り出すことができると仮定する必要がありますか? – skrrgwasme

+0

@skrrgwasme:彼のアルゴリズムは、2のべき乗の配列から利益を得るかもしれません。例えば、FFTが行われます。 – Olaf

答えて

2

ページサイズが2の累乗である必要があるという明示的な声明は見つかりませんが、これは非常に合理的な前提です。 POSIXの "alignment"の概念(posix_memalignを参照)は、任意の除数ではなく、2の累乗で定義されます。具体的には、整列引数はsizeof(void*)の2の累乗でなければなりません。このインターフェイスでページアライメントされたメモリを実現します。それを越えて、すべての現実のアーキテクチャは2のべき乗のページサイズを使用しており、それを常に変えるための合理的な正当性はない。他のものはハードウェアのコストがかなり高くなります。

+0

私は 'memalign'ファミリーの機能について知らなかった。今私はそれらも必要であることを知っている。ありがとう! –

+0

他のページサイズでは、PMMUとキャッシュの非常にタイムクリティカルなパスで真の除算/剰余が必要です。つまり、x86、ARM、PPC、POWER、MIPS、SPARC、SuperH、ColdFire/68XXXのアーキテクチャは、2ページサイズのすべてのパワーを持っています。私には何も表示せず、非常に壊れたデザインを示しています... – Olaf

+0

@VictorSchubert:常に最も一般的な機能を使用してください。 C標準は既に 'aligned_alloc'を提供しています。posix-versionを使用する必要はありません。また、実装によってサポートされる必要はありません。 manページから: "posix_memalign()関数はアドバイザリ情報オプションの一部であり、すべての実装で提供する必要はありません。" – Olaf

1

1)Linuxカーネルのページサイズの計算によって保証されます。これは正式な標準という意味での保証ではありませんが、すでに述べたすべての理由でこのアプローチが変わることはありえません。

/usr/src/kernels/<your_kernel>/include/asm-generic/page.hから:

#define PAGE_SHIFT  12 
#ifdef __ASSEMBLY__ 
#define PAGE_SIZE  (1 << PAGE_SHIFT) 
#else 
#define PAGE_SIZE  (1UL << PAGE_SHIFT) 
#endif 

あなたが見ることができるように、ページサイズは、実際のシフトの観点で定義されているので、常に2の累乗になります。このコードは汎用アーキテクチャの場合に使用され、特定のアーキテクチャではPAGE_SHIFTの異なる値が定義されています。

2)実際には、getconfプログラムを使用してページサイズを取得するには、端末にgetconf PAGESIZEと入力します。これは、決して使用されない可能性の高いバックアップケースをコーディングするよりはるかに簡単な、コンパイル時の迅速なチェックを生成するために使用できます。

3)ページサイズはMMUによって決まります。したがって、正式な規格に最も近いものは、さまざまなメーカーのプロセッサのマニュアルです。例えば、インテル・ソフトウェア・デベロッパーズ・マニュアルのボリューム3Aから表4-1は、Intelプロセッサでページングモードとページサイズの完全なリストを与える:

Intel Page Sizes

4)私はすべての主要なプロセッサアーキテクチャということを伝えることができます2の累乗であるページサイズを使用します。

5)実際には大きな問題があります。実際には、物理​​メモリ領域の断片化はありません。ページとページフレームのサイズは同じである必要があります。したがって、ページサイズが2でない場合、2つのページフレーム以外のパワーが得られます。たとえば、ページ・フレーム・サイズが3000、合計で32ページ(単純化するため)のシステムを使用しているとします。したがって、物理アドレスは17ビット長であり、ページフレームを選択するために5ビット、3000バイトをアドレス指定するために12ビットである。 11111 1111 1111 1111

00000 0000 0000 0000 
\___/ \____________/ 
    |    \ 
(page frame) (page offset) 

ページサイズ(ページ・フレーム・サイズ)が2の累乗に等しい場合、00000 0000 0000 0000から次いで全体の物理メモリ空間は有効なアドレスです。ページフレームのサイズが3000の場合は、XXXXX 1011 1011 0111(最後の有効なアドレス)からXXXXX 1111 1111 1111までの物理アドレス空間にギャップがあります。このようなシステムは使えないと言っているわけではありませんが、私は考えることができないほど厄介な複雑さを増やします。

+0

x86はすべてのLinux実装の少数しかカバーしていませんが、他のOSも考慮する必要はありません。誰かが2のべき乗のページサイズ以外を実装すると仮定する理由はないと私は同意するが、単一のCPUドキュメントはほとんど証明しない。最後の段落は少し混乱しています。物理アドレスのギャップも論理空間内のギャップであり、耐えられません。しかし、(残余で)分け合うことは、両方を避けるでしょう。それは単なるコスト(時間と空間)の比であり、そのようなユニットの利益は容認できないだろう。 – Olaf

+0

MMUは、断片化された物理メモリ空間の上に論理的に一貫した仮想アドレス空間を提供するために、常にいくつかの魔法を行うことができるので、仮想メモリ空​​間は必ずしも断片化されません。物理的な記憶はそれを取り巻くことはできません。 – David

+0

私が書いたように、それはマスキングの代わりに余分な部分を含む真の分割を伴うでしょう!他のすべてのCPU設計者やハードウェア設計者が確認できるように、それは確実に無駄です。 – Olaf

関連する問題