このページは「24環境」の情報です

いろいろあって公開停止しています(後述)2007.12.11

sh-linux-rt

linux-shの割込みレイテンシを少なくしたカーネルソースです。高速な割り込みを取りこぼさないようにする実装です。

素のsh-linuxカーネルでは、ide周り等に割込み禁止区間が2msec〜3msecくらいあります。これはファイルの読み書きをしている間に、3msecより短い周期で発生している割り込みは取りこぼしてしまう可能性があることを示しています。LinuxはRTOSではありませんのでこの辺の性能が弱いところです。

LinuxはPCアーキテクチャ向けのOSですから、SHプロセッサに移植したときに『SHにしかない』の機能は互換性のために使っていません。このようにアーキテクチャ固有の機能を使ってしまうと他アーキテクチャに移植できなくないソフトになってしまいます。しかしながら今回はSH→PC向きの互換性は犠牲にしてSHプロセッサの機能を使ってみようという実験をしました。SHプロセッサには割込みコントローラに『優先度レベル付き多重割込み』という機能が内蔵されています。この機能を活用してLinuxOSが割込み禁止にとしても、実際には高優先度の割り込みは受け付け可能なようにLinuxKernelを改造しました。この結果、割込みレイテンシ(遅延時間)が素のLinuxでは最悪値として3msec近くあるものを、平時7マイクロ秒程度、最悪値として20〜30マイクロ秒程度に下げることができました。

現状のカーネルで10KHz程度の割り込みは取りこぼすことなく取れています。
今回のバージョンはCAT709向けで開発しました。

改定履歴

  • 2004-09-26 初版

使い方

コンパイル

通常のlinuxカーネルソースと同じく

$ make menucoonfig  (make xconfig)
$ make dep
$ make zImage
$ make modules

としてください。ヘッダーファイルも書き換えているので通常のlinuxのドライバモジュールとは互換性がありません。

高優先度割込み

SHプロセッサの割込みレベル

15 ... 最高優先度
1  ... 最低優先度
0  ... 割込みマスク状態

の15段階のレベルのうち、1〜7をLinuxKernelに割り当て、8〜15を高優先度割込みに割り当てています。Linuxカーネルがcli(割込み禁止)操作を行っても、高優先度割込みはマスクされず常に割込み受付可能状態となります。

ドライバの書き方

include/asm-sh/io.h に割込みレベルの定義がありますからこれを編集して割込みレベルを決めます。

#define TIMER1_PRIORITY 10

#define IRQ0_PRIORITY   1
#define IRQ1_PRIORITY   1
#define IRQ2_PRIORITY   1
#define IRQ3_PRIORITY   1

前述したようにレベル8〜15が高優先度割込みです。あとは普通のドライバの割込みルーチンの書き方と同じです。ただし、linuxカーネルは割り込まれては困るので割込みマスク状態を作っていて、それを無視して高優先度割り込みは受け付けられますので高優先度割込みのサービスルーチンからlinuxの機能を呼び出してはいけません。printk()ももちろん、wakeup_interruptible()も呼び出してはいけません。ボトムハーフを作成してボトムハーフ側で実装すれば安全です。

ライセンス、保障

linuxカーネルですので当然GPLです。 現在のところ、本改造(低レイテンシパッチ)は工業製品への組込み利用ができるレベルには達していません。あくまでも実験的に利用してください。

公開停止

当初GPLとしてバイナリー、ソースコード共に公開していましたが、バイナリー、ソースコード共に公開を停止しました。このパッチは私が技術的な実験のために作り、アイディアの周知と皆様の追試目的として公開していました。製品への組み込みが出来るレベルではないと注意書きをしておいたのですが、動作原理やプログラム上のご法度行為をあまり理解せずに組み込み製品に応用されて結果として不安定な製品を出荷されている向きをお見受けしたために、この危険なパッチを公開していたら世の中が安全でなくなると判断して公開をやめました。

Linuxカーネルは無意味に割り込み禁止モードを使っているわけではありません。割り込まれたら困るタイミングがあるからこそ割り込み禁止になっています。一例として構造体に {データ、長さ}といったメンバがあるとして、データと長さを書き換える時に、その間に割り込まれたら構造体が不完全な状態で参照されてしまい、不具合が発生しますから割り込み禁止にして占有状態で{データ、長さ}をあわせて書き換えています。

私が実験で作ったパッチはそれを無視して割り込みルーチンに飛ぶように出来る強力なものなので、本パッチで作った割り込みルーチンの中では、Linuxカーネルのデータ構造は全部不完全な状態で、何一つ信用できない状態である考えなければいけません。全部のデータ構造が不完全であるということは、Linuxカーネルのファンクションが呼び出せないだけではなく、タスク管理テーブルもメモリ管理テーブルも不完全な状態であり、ページフォルト処理も出来ないということです。ということはP3エリアにロードされるカーネルモジュールで本パッチのISRを作るのは自殺行為ということです。SH3,SH4の場合、カーネル(vmlinux)本体のテキストコードはP1領域にストレートマップされるので大丈夫なのですが、変数がどこにロードされるのか、スタックはどこに配置されるかといった事を深く理解しなければなりません。こういった技術的な背景を完全に理解していただきたく、また危険性を十分お伝えできなかった責任を感じています。

本ページを作ったのは2004年頃で、ここで公開していたパッチも linux-2.4向けのものでしたが、2007年の夏頃にイベント向けに linux-2.6用の同様な実験を行い、不完全ながら一応の成果物もあります。ただ公開できるようなものではありません。もし公開のリクエストが高まり、またスポンサーが見つかれば、カーネル2.6向けに再始動できるかもしれません。(2007.12.11)

関連リンク

Last-modified: 2007-12-11 (火) 12:59:59 (5978d)