6

Linux カーネルでmem_mapは、すべての「構造体ページ」記述子を保持する配列です。これらのページには、highmem を動的にマッピングするための lowmem の 128MiB メモリが含まれています。

lowmem サイズは 1GiB なので、mem_map配列には 1GiB/4KiB=256KiB エントリしかありません。各エントリ サイズが 32 バイトの場合、mem_mapメモリ サイズ = 8MiB です。しかし、mem_mapすべての 4GiB 物理メモリをマップするために使用できる場合 (x86-32 で利用可能な物理メモリが非常に多い場合)、mem_map 配列は 32MiB を占有し、それは多くのカーネル メモリではありません (または間違っていますか?)。

私の質問は、そもそも間接的な highmem マッピングのためにその 128MiB を low で使用する必要があるのはなぜですか? 別の言い方をすれば、最大 4GiB の物理メモリ (利用可能な場合) をすべてカーネル空間に直接マップしないのはなぜでしょうか?

注: 上記のカーネル ソースに関する私の理解が間違っている場合は、修正してください。ありがとう!

4

3 に答える 3

1

こちらをご覧ください: http://www.xml.com/ldd/chapter/book/ch13.html

カーネルのロー メモリは、x86 では 32 ビット ポインターでアドレス指定される「実際の」メモリ マップです。

カーネル ハイ メモリは「仮想」メモリ マップであり、x86 では仮想構造でアドレス指定されます。

すべてを常にアドレス指定できるわけではなく、仮想メモリ セグメント (仮想のページ マップされたプロセス空間) 用にほとんどのメモリが必要になるため、すべてをカーネル アドレス空間にマップする必要はありません。

少なくとも、それが私がそれを読んだ方法です。うわー、それはあなたがした複雑な質問です。

さらに混乱を招くように、第 13 章では、一部の PCI デバイスが 32 ビット空間に対応できないことについて説明しています。

x86 では、一部のカーネル メモリの使用は、DMA アドレッシングの問題により、メモリの最初のギガバイトに制限されます。私はこのトピックに 100% 精通しているわけではありませんが、PCI バス上の DMA には互換モードがあります。それはあなたが見ているものかもしれません。

于 2009-02-23T07:25:09.353 に答える
0

別の言い方をすれば、最大 4GiB の物理メモリ (利用可能な場合) をすべてカーネル空間に直接マップしないのはなぜでしょうか?

理由の 1 つはユーザー空間です。すべての使用空間プロセスには独自の仮想アドレス空間があります。x86 に 4Gb の RAM があるとします。したがって、カーネルが 1Gb のメモリ (直接マップされた ~800 + ~200 vmalloc) を所有することを提案した場合、他の ~3Gb はすべて、ユーザー空間で回転するプロセス間で動的に分散する必要があります。では、複数のアドレス空間がある場合、どうすれば 4Gbs を直接マップできるのでしょうか?

なぜ x86 で zone_highmem が必要なのですか?

理由は同じです。カーネルは、低メモリ用に最大 800Mb しか予約しません。他のすべてのメモリは、オンデマンドでのみ特定の仮想アドレスに割り当てられ、接続されます。たとえば、バイナリを実行すると、新しい仮想アドレス空間が作成され、バイナリ コードとデータ (ヒープ、スタック ...) を格納するためにいくつかのページが割り当てられます。したがって、高メモリの重要な属性は、動的メモリ割り当て要求を処理することです。ユーザー空間によって何がトリガーされるかを事前に知ることはできません...

于 2014-10-05T07:53:17.630 に答える
0

物理アドレス拡張を使用する場合、3.6 GB は上限ではありません。物理アドレス拡張は、最近のほとんどの x86 ボードで一般的に必要とされ、特にメモリ ホットプラグを備えています。

于 2009-02-23T07:39:27.120 に答える