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
© Copyright 2025 ExpyDoc