L4-Linux のメモリ管理における問題点とその解決策
x86 のページング機構 1024 x 1024 x 4 K = 4 G x86 1024 1024 page table CR3 page directory table
話(図)を簡単にするために ページ・サイズを 256KB とする 仮想アドレス空間を 2GB に制限する 一層(8エントリ)のページ・テーブル 1GB の RAM を使うものとする 4ページの物理ページ
仮想空間とページ・テーブル 仮想空間 物理メモリ O GB ページ・テーブル 0x30000000 0x00000000 仮想空間 物理メモリ O GB ページ・テーブル 0x30000000 0x00000000 0x20000000 1 GB 0x10000000 2 GB
プロセスとページ・テーブル 各プロセスはそれ自身の仮想空間を持つ ページ・テーブル O GB 3 2 process 1 1 GB 2 GB
ユーザ空間とカーネル空間 仮想空間はユーザ空間とカーネル空間から成る User Kernel ページ・テーブル CR3 O GB 1 GB
カーネル空間のマッピング 仮想空間 物理メモリ O GB ページ・テーブル User Code Linux Kern 0x30000000 仮想空間 物理メモリ O GB ページ・テーブル User Code Linux Kern 0x30000000 User Code 1 GB Linux Kern 0x00000000 0x10000000 0x20000000 2 GB 0x30000000
仮想空間に関連する Linux のシステム・コール mlockall() プロセスの実行に必要な全てのページをメモリ常駐にする。 mmap() デバイスのメモリをプロセスの仮想空間にマップする。 clone() スレッド(メモリ空間を共有するプロセス)を生成する。 …
mlockall() 仮想空間 物理メモリ O GB ページ・テーブル page 1 Linux Kern page 2 仮想空間 物理メモリ O GB ページ・テーブル page 1 Linux Kern page 2 0x30000000 page 3 page 3 0x10000000 0x20000001 1 GB Linux Kern 0x00000000 0x10000000 0x20000000 2 GB 0x30000000
mlockall() 仮想空間 物理メモリ O GB ページ・テーブル page 1 Linux Kern page 2 page 2 仮想空間 物理メモリ O GB ページ・テーブル page 1 Linux Kern page 2 page 2 0x30000001 page 3 page 3 0x10000001 page 1 0x20000001 1 GB Linux Kern 0x00000000 0x10000000 0x20000000 2 GB 0x30000000
mmap() 仮想空間 物理メモリ O GB ページ・テーブル page 1 Linux Kern page 2 0x30000000 仮想空間 物理メモリ O GB ページ・テーブル page 1 Linux Kern page 2 0x30000000 page 3 page 3 0x10000000 0x20000001 1 GB Linux Kern 0x00000000 VME 0x10000000 0x20000000 Universe 2 GB 0x30000000
mmap() 仮想空間 物理メモリ O GB ページ・テーブル page 1 Linux Kern page 2 0x3000000 仮想空間 物理メモリ O GB ページ・テーブル page 1 Linux Kern page 2 0x3000000 page 3 page 3 0x10000000 VME 0x20000001 1 GB Linux Kern 0xfc000000 0x00000000 VME 0x10000000 0x20000000 Universe 2 GB 0x30000000
clone() ページ・テーブルを共有するプロセスを生成する ページ・テーブル O GB User 1 GB Kernel 2 GB
clone() ページ・テーブルを共有するプロセスを生成する ページ・テーブル O GB User 1 GB Kernel 2 GB
Linux と L4-Linux の比較 Linux は L4 タスクの1つ User Code Linux Server Linux Kernel L4 Kernel
Linux Server の page table 仮想空間 物理メモリ O GB ページ・テーブル L4 Kern Linux Linux 0x00000000 0x10000000 0x20000000 1 GB L4 Kern 0x30000000 0x00000000 0x10000000 0x20000000 2 GB 0x30000000
システム・コール 例えば getpid() の場合 Linux Server User Code User Code Linux L4 L4
プロセス切替を伴う場合 例えば read() で休眠するとき User Linux read() Linux L4
L4-Linux におけるメモリ管理 ページ・テーブルはどこにある? User Linux Linux L4
L4-Linux におけるメモリ管理 ページ・テーブルの2重構造 User Linux Linux L4 CR3 CR3
2つのページ・テーブルに対する操作 はじめにページ・フォルトありき User Linux Code access page fault IPC(receive)
2つのページ・テーブルに対する操作 何をどうするかは全て Linux サーバが決める User Linux Code IPC(receive)
2つのページ・テーブルに対する操作 何をどうするかは全て Linux サーバが決める User Linux Code page in IPC(receive)
2つのページ・テーブルに対する操作 マッピングを実現するのは L4 カーネル Linux IPC(receive) IPC(send)
L4-Linux と mlockall() 全てのページが読み込まれた後も、、、 User Linux Code mlockall() page in User Code Linux mlockall()
L4-Linux と mlockall() 本物のページ・テーブルは空っぽのまま User Linux Code mlockall() return 0
L4-Linux と mmap() Linux のページ・テーブルを書き換えても、、、 User Code Linux mmap()
L4-Linux と mmap() 本物のページ・テーブルには反映されない User Code Linux mmap() return 0
L4-Linux における clone() 各スレッドが独自のページ・テーブルを持つ User Linux Server Linux L4
L4-Linux における clone() 各スレッドが独自のページ・テーブルを持つ User Linux Server Linux L4
問題点の整理 Linux が管理・操作する仮のページ・テーブルと L4 の中にある本物のページ・テーブルの2つが存在する。 前者に対する操作が後者に反映される機会はプロセスがページ・フォルトを起こした時であり、その時だけである。 リアルタイム・プロセスにするためには、実行開始前に本物のページ・テーブルを論理的なページ・テーブルに従って埋め尽くしておく必要がある。
2つのページ・テーブルに対する操作 マッピングを実現するのは L4 カーネル Linux IPC(receive) IPC(send)
2つのページ・テーブルを 一致させるための追加機能 相手の同意なしに一方的にマップする機能 Linux process fpage_map()
2つのページ・テーブルを 一致させるための追加機能 Linux のページ・テーブルの内容を掃き出させる Scan Linux process fpage_map() mflush()
2つのページ・テーブルを 一致させるための追加機能 Linux のページ・テーブルの内容を掃き出させる Scan Linux process fpage_map() mflush()
2つのページ・テーブルを 一致させるための追加機能 Linux のページ・テーブルの内容を掃き出させる Scan Linux process fpage_map() mflush()
2つのページ・テーブルを 一致させるための追加機能 Linux のページ・テーブルの内容を掃き出させる Linux process mflush() return 0