質問1

質問1

私はLinuxオペレーティングシステムの基本を理解しようとしています。私は64ビットCPUで64ビットUbuntu 12.04を実行しています。システムには2GBのRAMがあります。

cat /proc/meminfo 
MemTotal:        2012040 kB

質問1:欠落している85112KBメモリはどこにありますか?

2097152 (2 gb in kilobytes)
2012040 -
______________
 85112

これは他の目的で予約されていますか?または、システムが利用できない4%RAMのハードウェア制限はありますか?

質問2:初めて読んだとき、ユーザーのカーネルスペースが3:1に分割されていると聞きました。ここではなぜそうではありませんか?

(3/4)*2097152 =1572864 for user space
(1/4)*2097152 =524288  for kernel space

私はLinux RAMキャッシュとバッファについて知っていますが(少なくともそれを理解するためにいくつかの研究努力をしました)、このケースはそれとは何の関係もありません。それでは何が起こっていますか?

ベストアンサー1

同時に2つの質問をしないでください...

質問1

これらのメモリの一部はカーネルコード自体に使用され、一部は予約されています。カーネルはシステムブートメッセージにそれを表示します。

[    0.000000] Memory: 6106920k/7340032k available (3633k kernel code, 1057736k absent, 175376k reserved, 3104k data, 616k init)

「存在しない」行は実際には存在しないメモリです(現在6GiBのRAMが現在コンピュータにインストールされています)。カーネルはメモリマップも印刷します(これはブートメッセージの前の部分です):

[    0.000000] e820: BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009ebff] usable
[    0.000000] BIOS-e820: [mem 0x000000000009ec00-0x000000000009ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000000e2c00-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000bf77ffff] usable
[    0.000000] BIOS-e820: [mem 0x00000000bf780000-0x00000000bf797fff] ACPI data
[    0.000000] BIOS-e820: [mem 0x00000000bf798000-0x00000000bf7d9fff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x00000000bf7da000-0x00000000bfffffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000ffe00000-0x00000000ffffffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000100000000-0x00000001bfffffff] usable

その後、カーネルはマップのさまざまなリカバリを実行し、通常より多くのメモリを保持します。特にドライバがロードされたとき。

質問2

カーネル/ユーザー部門は次のとおりです。仮想アドレス空間、覚えていません。作業するアドレス空間が多すぎるため、64ビットシステムではほとんど関係ありません。

32ビットシステムでは、仮想アドレス0x00000000–0xBFFFFFFFFがユーザーアドレス空間として使用されます。 0xC0000000–0xFFFFFFFF はカーネルで使用されます (3:1 分割で、他のオプションには 2:2 分割が含まれます。この数字は GB 単位なので、1:1 ではなく 2:2 です)。仮想アドレスはプロセスごとに異なります(各プロセスは0x00001000にページを持つことができ、これは別のページです)。

ただし、仮想アドレスはメモリバイトに対応しません。デフォルトでは、次の4つでサポートできます。

  1. 何もありません。このページは使用されません。アクセスしようとするとセグフォルトが発生します。
  2. 物理メモリ。 MMUは、仮想アドレスを実際にどこかにあるDIMMのコンデンサに対応する物理アドレスに変換します。
  3. スワップ(またはメモリマッピングファイル)。アクセスするとページエラーが発生し、カーネルはデータをメモリに読み込んでいる間プロセスを中断します(スペースを確保するために別のデータをディスクに書き込むこともできます)。その後、カーネルはページテーブルを更新してそれをケース#2に置き換えます。
  4. ページはありません。新しく割り当てられたページとしてまだ使用されていないページ。そうなると、カーネルは物理メモリページを見つけて(おそらく他のものと置き換える)、それをゼロで埋め(安全のために)ケース#2にします。

透明な巨大なページはより多くの状況を可能にします。私が忘れてしまったあまり重要なことがあるかもしれません...

とにかく、64ビットチップの仮想アドレスサイズは48ビットです。カーネルがどのパーティションを使用しているかはわかりませんが、その半分も47ビットスペースで、36ビット物理アドレスサイズをはるかに超えています。そして、131,072 GiBのRAMは高すぎます...(そして64がより安くなると、まだ多くのビットが残り、将来のプロセッサではより多くのビットを許可する可能性があることに注意してください)。

おすすめ記事