L4-Linux のメモリ管理における問題点とその解決策

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