IA32 固有の処理についての覚え書き
[Up]
IA32 固有の処理についての覚え書き
Feb. 13, 2002 T. Naniwa
・ EOTA では,特権レベルは 0 と 3 の 2 つのレベルを使用する.
レベル 0: μITRON kernel, device driver task
レベル 3: manager task, user application
とする.
・ EFLAGS の IOPL を特権レベル 3 にセットしておけば,ユーザーアプリケー
ションの TSS に I/O 許可ビットマップを用意しなくとも I/O ポートを直接
操作することが出来る.
・ GDT の昔(ver. 0.2.8)の設定.
Entry:
0x0000 0 Unused
0x0008 1 kernel code (DPL = 0)
0x0010 2 kernel data (DPL = 0)
0x0018 3 application code (DPL = 3)
0x0020 4 application data (DPL = 3)
0x0028 5 idt (?)
0x0030...0x03F8 6...127 unused
0x0400 128 unused
0x0408 129...256 TSS
・ GDT の現在の設定.
アプリケーションのスタック用のセグメントを用意する.
システムコール用のコールゲートを用意する.
Entry:
0x0000 0 Unused
0x0008 1 kernel code (DPL = 0)
0x0010 2 kernel data (DPL = 0)
0x0018 3 application code (DPL = 3)
0x0020 4 application data (DPL = 3)
0x0028 5 application stack (DPL = 3)
0x0030 6 ITRON call gate (DPL = 3)
0x0038 7 POSIX call gate (DPL = 3)
0x0040 8 BTRON call gate (DPL = 3)
0x0048...0x03F8 9...127 unused
0x0400 128 unused
0x0408 129...256 TSS (DPL = 0)
・ コンベンショナルメモリ領域では下記のアドレスが固定的に使用されている.
Addres:
0x01000 GDT
0x02000 IDT
0x03000 Task 1 で使用する Page directory table
0x04000 Page table entry (0x08000 までで 16 MB 分)
0x08000 sfsboot の 2nd boot の start 読み込み位置
0x08F00 sfsboot の start32 の読み込み位置
0x09000 sfsboot の mode32 の読み込み位置
0x20000 ITRON kernel image
0x80000 port manager
0x9FFF0 Task 1 の stack
・ ITORN システムコールと POSIX システムコールの呼び出しを,ソフトウェア
割込み(INT)からコールゲートを使った呼び出しに変更した.
・ μITRON kernel 部で最初に割り当てたスタック領域は,特権レベル 0 用のス
タックとして使用する.スタックの開放はタスクの終了時に行う.
・ ページテーブルやページディレクトリテーブルのエントリの,U/S ビットで
カーネル領域を保護するようにする.
・ TSS を設定するときには,CS と SS レジスタの下位 2 bit にアプリケーショ
ンの特権レベル 3 を反映させておく.
・ gcc/gas でのコールゲートの呼び出しは
lcall $SECTION,$OFFSET
と指定する.スタック調節付の far return は
lret $STACK-ADJUST
と指定する.これらの指定は asm を使うことで C プログラム中に含めるこ
ともできる.
・ IDT に登録するハードウェア割込みに対するゲートは,特権レベル 0 として
おいても良さそうだ.ソフトウェア割込みに対応するゲートは,アプリケー
ションの特権レベルと揃える必要がある.
ソフトウェア割込みは現時点では使用しない.
・ 作業手順
1. GDT の変更.
2. POSIX system call を call gate 呼び出しに変更.
3. ITRON system call を call gate 呼び出しに変更.
4. page/directory table entry のフラグの変更.
5. EFLAGS の IOPL の変更.(TSS の初期値に反映)
6. application/manager task の特権レベルを 3 に変更.
IDT の設定の確認.
カーネル領域に割り当てたスタックの扱いの変更.
7. 一般保護フォルトが発生した場合の処理の実装.
8. スタックオーバーフローが発生した場合の処理の実装.
□ 制限事項
・ 一般保護フォルトとスタックフォルトは同一の割込みルーチンで処理して
いる.
・ これらの処理ルーチンでアプリケーションを終了させる処理には,ページ
フォルトの処理ルーチンを使い回している.