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