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. スタックオーバーフローが発生した場合の処理の実装.

□ 制限事項
  ・ 一般保護フォルトとスタックフォルトは同一の割込みルーチンで処理して
     いる.
  ・ これらの処理ルーチンでアプリケーションを終了させる処理には,ページ
     フォルトの処理ルーチンを使い回している.