リアルタイム Linux 上の「ユーザ空間デバイス・ドライバ」
小田切

KEKB 制御グループ
淳一、 山本 昇、 加藤

＠技術交流会直彦

平成 １４年 ２月 １５日

内容n

背景n

なぜ Linux はリアルタイムでないのかnLinux のリアルタイム 拡張にはどのようなものがあるか

nユーザ空間を使うデバイス・ドライバ

nまとめ背nEPICS iocCore
nnn

景VME 計算機（VxWorks リアルタイム OS）

EPICS 3.14 から Linux をサポート
n

POSIX 1003.1c (pthread)n

POSIX 1003.1b (real-time extension)

Linux にはリアルタイム応答性がない

EPICS のプラットフォーム
WorkStation
VME

VME

VME

VME

Input / Output Controllers (IOCs)
Field Buses ( CAMAC, GPIB, etc. )IOC ソフトウェア（iocCore）
Network
ChannelChannel Access
AccessRun-time
Run-time Database
Database
DeviceDevice Drivers
Drivers
VxWorks
VxWorks Real-time
Real-time OS
OSVMEbus
VMEbus背nEPICS iocCorennn

景VME 計算機（VxWorks リアルタイム OS）

EPICS 3.14 から Linux をサポート
n

POSIX 1003.1c (pthread)n

POSIX 1003.1b (real-time extension)

Linux にはリアルタイム応答性がない

OS インタフェース・ライブ
ラリ

EPICS iocCore
OS Interface Lib
VxWorks, Linux, …

一台の PC 上で EPICS
Emacs

Operator
InterfaceiocCore
X

背n

EPICS iocCorennn

景VME 計算機（VxWorks リアルタイム OS）

EPICS 3.14 から Linux をサポート
n

POSIX 1003.1c (pthread)nPOSIX 1003.1b (real-time extension)

Linux にはリアルタイム応答性がない

なぜリアルタイムでないか？
n

カーネルがプリエンプティブでないnn

割込みの禁止nn

数十ミリ秒

数百マイクロ秒

アドレス空間の切替
n

数十マイクロ秒

予測不能な遅延
カーネルがプリエンプティブでない

割込みの禁止アドレス空間の切替

プリエンプティブでないカー
ネル
割込み
カーネル
遅延時間
優先度の高いプロセス
優先度の低いプロセス

カーネル内での排他制御
NULL

3

NULL

1

2

3

排他制御の方法
nプロセスとプロセスnn

プロセスと割込みハンドラnn

プリエンプションしない
割込み禁止

割込みハンドラと割込みハンドラ
n

割込み禁止

割込みの禁止
unsigned long flags;
save_flags(flags);
cli();/* critical section */restore_flags(flags);

予測不能な遅延時間
プリエンプティブでない（排他制御）

割込みの禁止（排他制御）
アドレス空間の切替（仮想記憶）

アドレス空間n

多くのリアルタイム OS は全てをフラッ
トな物理アドレスで実行
nn

タスクはスレッドに対応

Linux は仮想記憶をサポート
n

仮想アドレスから物理アドレスへの変換n

カーネル空間n

ユーザ空間

仮想空間とページ・テーブル
仮想空間

物理メモリ

O GB 0x30000000
0x20000000
0x10000000

3 GB 0x00000000
4 GB

ページ・テーブルmmap() システム・コール
仮想空間

物理メモリ

O GB 0x30000000
0x20000000

2 GB0x50000000
0x10000000

ビデオ・メモリ
0x00000000

4 GB

ページ・テーブル２レベルのページング
ページ・ディレクトリ・
x86
テーブル
x86

User
Space

Kernel
Space

ページ・
テーブル

物理ページ

アドレス空間の切替
x86
x86

ページ・ディレクトリ・
テーブル

User
Space

ページ・
テーブル

KernelSpace

プロセス B
プロセス A

物理ページ

２つのアプローチn

カーネル空間のリアルタイム・タスクを使う
n

RTLinuxnn

リアルタイム・カーネルを Linux のローダブル・モジュールとして組み込む

ユーザ空間の Linux プロセスを使う
n

プリエンプティブな Linux カーネルn

プリエンプティブに改造された Linux の下でのユーザ・プロセスを利用する

RTLinux のアーキテクチャ

Process Process Process
FIFO
Linux kernel
RT task
RT kernel

ユーザ空間
カーネル空間RTLinuxn

リアルタイム応答性は抜群

n

３つの遅延要因の全てからフリーn

RT タスクは Linux の機能を利用しない

nLinux カーネルに割込みを禁止させないn

RT タスクの起動にアドレス空間の切替不要

RT タスクはカーネル空間にx86
x86

User
Space

KernelSpace

RT-task
RT-task
RT-task

全てのプロセスのアドレス空間にはカーネル空間がマッピング済み

RTLinux の問題点
nnn

RT タスクは Linux のシステム・コールを使えない（ポリシーとして使わない）
リアルタイム・アプリケーションのバ
グから Linux カーネルが保護されない
高レベル（複雑）なアプリケーションには不向き２つのアプローチn

カーネル空間のリアルタイム・タスクを使う
n

RTLinuxnn

リアルタイム・カーネルを Linux のローダブル・モジュールとして組み込む

ユーザ空間の Linux プロセスを使う
n

プリエンプティブな Linux カーネルn

プリエンプティブに改造された Linux の下でのユーザ・プロセスを利用する

プリエンプティブな Linuxnn

SMP に対応した Linux カーネルには、複数の CPU に割当てられたプロセスの間での排他制御機構（スピン・ロック）が備わっている
これをシングル・プロセッサ上で走る複数のプロセス間での排他制御に置き換えれば、プリエンプティブなカーネルができるプリエンプティブでないカー
ネル
割込み
カーネル
遅延時間
優先度の高いプロセス優先度の低いプロセスそれで本当に話は済むの？
nnnn

SMP は本質的にスループットを上げる技術
カーネル・コードの一部がスピン・ロックを「長持ち」しても、スルー・プットへの影響は少ない
が、遅延の最悪値には直接的な影響がある
そのような「問題児」がいないか、カーネル全体を検査する必要がある

第三の道
nn

ユーザ空間で実行nLinux カーネルをアプリケーションから保護

nLinux のシステム・コールを利用可能にする

リアルタイム・カーネルでスケジューリング
n

リアルタイム・タスクの起動に Linux カーネ
内の排他制御の問題を持ち込まない使えそうなものn

L4-Linuxnn

nLinux カーネルをリアルタイム・マイクロカーネ
ルの上にサーバ・タスクとして実現
Linux のプロセス自体はリアルタイムではない

LXRT
nn

RTAI （RTLinux から派生）のオプショナルな機能
ユーザ空間からカーネル内のリアルタイム API を呼べる

L4-Linux のアーキテクチャ

Linux“Kernel”
2

Linux
Process
3RealtimeApp.
1

L4 real-time micro-kernel

ユーザ空間
カーネル空間プロセスをリアルタイム処理にLinux“Kernel”
2

Linux
Process
1

RealtimeApp.

L4 real-time micro-kernel

ユーザ空間
カーネル空間プロセスが “Linux” から横取り
割込み
L4 カーネル
RT プロセス
Linuxプロセス割込みへの応答時間の測定
nnnn

VME CPU ボード (Celeron 300MHz)
ディスク I/O をバックグラウンドで実行
VME モジュールからの割込みによりリアルタイム・スレッドを起動
その遅延時間を繰り返し測定

遅延時間の測定結果
Thread Priority > Linux Server Priority

Number of Events

10000

1000

100

10

1

0.1

1

Latency ( Full Scale: 1 ms )

予測不能な遅延時間
カーネル（L4）がプリエンプティブ

割込みの禁止アドレス空間の切替I/O ドライバ・プロセス
I/O
Process

x86
x86

VME
SpaceLinux“kernel”
L4
Kernel
Space

L4

User
Space
Sleep &Wake up

mmap() Linuxシステム・コールL4-Linux の問題点
n

プロセスに高い優先度を与えるための変更は簡単
変更を要したファイルは３つn 追加したコードは数十行
nn

仮想記憶機構の扱いが特殊n

素朴な疑問
n

そもそも、ページ・ディレクトリやページ・テーブルはどこにある？

１つのプロセスに２セットある
ページ
テーブ
ル

Linux
x86
x86

L4
L4

ページ
テーブ
ル

物理ページ

スレッドを生成した場合３つのスレッドが共有
Linux
x86
x86

L4
L4
L4L4個別に持つ

できれば一元化したいが
ページ
テーブ
ル
L4

物理ページ

Linux

x86
x86

L4ページ
テーブ
ル

物理ページ

大きく改造するとnn

派生品の派生品になるn

メンテナンスが大変

n「市場」の信頼を得ることが困難

n

カレントからの後れが大きくなる

n

EPICS も Linux も猛烈な勢いで進化している

もう１つの可能性n

LXRT （RTAI のオプション）n

カーネルに手を加える必要はない

RTAI のアーキテクチャ

Process Process Process
FIFO
Linux kernel
RT task
RT kernel

ユーザ空間
カーネル空間LXRT （RTAI のオプション）

Process Process Process
ユーザ空間

Linux kernel
RT task
RT kernel

カーネル空間スレッドを使って役割分担

Process
Process
Process
Process Process Thread
ユーザ空間Linux kernel
RT kernel

RT tasktask
RTRT task
task
RTカーネル空間EPICS on Real-time LinuxOracle

Operator
Interface

ScannerCA

Process
GPIB
Process
CAMAC

Linux kernel
RT kernel

ユーザ空間

RT tasktask
RTRT task
task
RTカーネル空間まとめnn（１）

EPICS iocCore の移植のための要件
n

マルチ・スレッドをサポートすること

n

スレッドはユーザ空間で走ること

n

スレッドはリアルタイムであることLinux のスレッドにはリアルタイム性がないn

プリエンプティブでないn

割込みの禁止n

アドレス空間の切替まとめnnn（２）

RTLinux （RTAI）は複雑なアプリケーションには不向き
プリエンプティブなカーネルはソフト・リア
ルタイムのレベルを超えるのは困難
あくまでもユーザ空間の Linux プロセスでハード・リアルタイムを目指すn

L4-Linux ：大掛かりな改造が必要n

RTAI-LXRT ：期待が持てそう（？）

謝辞
nnn

L4-Linux 上で VME バスにアクセスするためのライブラリを開発するに当り、安 芳次氏には数々の有益なアドバイスを頂きました。
また、仲吉 一男 氏には、Linux のリアルタ
イム応答性に関する諸情報、およびその測定方法について色々と教えて頂きました。
両氏のご協力に感謝いたします。