メモリー管理
概要
64ビットでは理論上16エクサバイトのメモリーを利用できるけど実際にそんなに使えないので利用できるアドレスの範囲に制限を設けている
プロセス毎に仮想アドレス空間を持つ→メモリ空間の独立性
あるプロセスでどのようなメモリにアクセスしても、他プロセスの情報を参照したり、変更したりできなくなる
https://gyazo.com/779f2f5076f9856bd13e4a980647d050
仮想アドレスは実態を持たないので、物理メモリー空間にマッピングする必要がある
物理ページは使用する際に割り当てる
OOM Killer
メモリー使用量が増えて、ページ回収処理によっても必要な空き物理ページを確保できない場合はプロセスを強制停止させてメモリを解放する
時間的局所性
直近にアクセスされたメモリーには近い未来に再度アクセスされる可能性が高い
最近アクセスされていないメモリーには近い未来に再度アクセスされる可能性が低い
デマンドページング
メモリースワッピング
https://gyazo.com/441e6f06b5c57306b160f82f356a0e9c
ページング方式
物理メモリをページ(4kバイト)という単位に分割して管理する
CPUのMMU(メモリ管理ユニット)によって、仮想⇄物理のアドレス変換テーブルを用意することで自動的にアドレス変換を行う
https://gyazo.com/37b0c3b7532028bf41252465aaf048ac
アドレス
リニアアドレス
ページングによって実現する仮想メモリに割り当てられるアドレス
ページテーブル4段→リニアアドレス48ビット→仮想アドレス空間256Tバイト
ページテーブル5段→リニアアドレス57ビット→仮想アドレス空間128Pバイト
中央部分が空く形になっている
将来的にリニアアドレスが64ビットに拡大された場合にOSやアプリケーションに大きな変更を加えなくて済むように
https://gyazo.com/757771e8c189a532ba1cef431273243fhttps://gyazo.com/e8b94fc715685ebc1d82542ee5c35a07
論理アドレス
セグメントという仕組みで実現する仮想メモリに割り当てられるアドレス
64ビットではセグメントは使われていないので論理アドレスも使われていない
物理アドレス
物理メモリに割り当てられるアドレス
52ビット(最大4Pバイト)に制限されている
プロセスのメモリーマップ
各プロセスに対してリニアアドレスで表現される仮想メモリー空間をそのまま割り当てる
前半→プロセス用
後半→カーネル用
後半のカーネル空間は全プロセスで共通の物理メモリが割り当てられている
https://gyazo.com/7a0b7ab782115fbec89059dcdb44dc5d
カーネルのメモリーマップ
全ての物理メモリーをストレートにマッピングする領域がある
連続する物理アドレスをそのまま連続する仮想アドレスに対応付けるという意味
ユーザーモードで動作するプログラムからは読み書きできないように保護されてる
/icons/point.iconカーネルモードで動作するコードは独立した仮想メモリー空間を持たない
直前に実行されていたプロセスなどの仮想メモリー空間をそのまま利用する
https://gyazo.com/4d0128d6f2239b2f1b0e84c1700edc90
PTI
Page Table Isolation
動作モードによってカーネル用メモリを保護する仕組みは長らく問題なかった
「Meltdown」「Spectre」などのCPUの脆弱性を利用すると、動作モードを迂回してカーネル用のメモリー領域を読み出せることが判明した
ユーザーモード時の仮想メモリ空間にはカーネル用の領域をマッピングしない
カーネル用の領域はカーネルモードに遷移している間だけマッピングされる
参照