雑多な覚え書き
[Up]
- ITRON/h の lowlib.h を修正して,lowlib のデータ部
分を修正したときには,kernel/POSIX/libc/call_posix.S もあ
せて修正する必要がある.この場合,errno.c の後半のコードを
アセンブルすると良い.
- key 入力が NOWAITMODE になっているときにキー入力が無い状態で read
を実行すると数値の 0 が読み出される.
- 拡張パーティションは最大 5 つまでをサポートしている.また,拡張パー
ティションを示すパーティション番号としては,現在は 0x05,
0x0F, 0x85 のみをサポートしている.
- gcc version 2.96-20000731 で EOTA をコンパイルする場合には,
sfsboot/2nd と kernel/BTRON/device/fd765a の
Makefile の CFLAGS から,最適化のレベルを指定して
いる -O オプションを取り除く必要がある (情報提供 tetsu さ
ん).
- newlib の libc とリンクしたバイナリは,
scanf で実数値を読み込んで演算するようなプログラムであれば
ちゃんと浮動少数点を用いた計算が実行できる.
- ITRON/h/misc.h や POSIX/manager/posix.h などで定
義されている ROUNDUP は,2 の冪乗の数を切り上げるためのマ
クロであり,任意の基底に対しては正しく動作しないので注意が必要であ
る.
- 固有のアドレス空間をもつマネージャを作成するときには,ダミーの main
関数を作っておかないとリンク時にエラーが表示される場合がある.
- 空きメモリの管理を byte map から bit map に変更した.最大のメモリ
サイズは 128 MB としている.
- RAMDISK ドライバは名称は driver.ramdisk になっているが,内部で
malloc を呼び出している関係で実質は独自の仮想記憶空間を持つマネージャ
扱いになっている.RAMDISK のデフォルトのサイズは 2 MByte.起動時に
KB 単位で大きさを指定できる.
- ユーザーアプリケーションにも ITRON kernel の機能の呼び出しを許可す
ることにする.といっても,現在の EOTA に手を加える必要は全く無く,
単にポリシーを変更しただけのことだったりする.実際にアプリケーショ
ンから μITRON の機能を呼び出せるようにするには,libitron.a をリン
クすれば良い.
- POSIX の libc と浮動少数点演算を行うプログラムを組み合わせると,fpu
命令でページフォルトが発生する.newlib と組み合わせた場合(i-scheme,
apl)には特に問題は発生していない.
- POSIX の TIME システムコールの中身を gettimeofday に作り替えた.も
ともとの time は gettimeofday の結果から秒を返すような関数とした.
gettimeofday を使用すれば更に 1/100 秒精度の時計が取得できる.
- 時間の取得には BIOS の int 1Ah, AH=02h のシステムコールが利用できる.
その結果,CH に時間が,CL に分が,DH に秒が,DL に1/100秒が,それぞ
れ BCD で保存される.
- 日付の取得には BIOS の int 1Ah, AH=04h のシステムコールが利用できる.
その結果,CH に世紀が,CL に年が,DH に月が,DL に日が,それぞれ
BCD で保存される.
- POISX manager で,printk は wconsole の console window 出力するよう
なものとした.通常のデバッグには dbg_printf を使用する.
- POSIX の mount システムコールは,special_file, dirname, rwflag,
fstype の順で引数を受け取る.これは Linux の mount システムコールは
引数の順序が異なっているため注意が必要である.現在指定できる fstype
は "sfs" のみである.
- mountroot は init からしか発行できないので,libc や POSIX lowlib か
らは取り除いた.また,root directory (/) は umount できない.
- fd driver のコンパイル時に最適化オプション -O2 を指定するとうまく動
作しない.-O なら問題ない.これは,モーター停止用の割込みルーチンと
関係しているようだ.
- アプリケーションがスタックへのアクセスでページフォルトを発生した場
合に,ページを割り当ててアプリケーションの再開させる処理を実装した.
アプリケーションの初期のスタックのサイズは 40KB.
- 一般保護フォルトとスタックフォルトの処理ルーチンでアプリケーション
を終了させる処理には,ページフォルトの処理ルーチンを使い回している.
- 一般保護フォルトとスタックフォルトは同一の割込みルーチンで処理して
いる.
- パーティション 3, 4 のアクセスには LBA を使うようにすることで,古い
IDE disk との済み分けが可能になるかも知れない.
- EOTA の起動用パーティションは,ディスクの先頭から 528 MB 以内に基本
パーティションとして作成する必要がある.
- IDE driver の BIOS と生 IDE の違いだが,これを吸収する仕組みに
Logical Block Addressing (LBA) 方式がある.LBA モードで使用する場合,
セクタ・ナンバ・レジスタに LBA の bit 7-0 を,シリンダ・ロー/ハイ・
レジスタに bit 23-8 (高位ビットをハイ・レジスタに入れる) を,デバ
イス/ヘッド・レジスタのヘッド部に LBA の bit 27-24 を保存する.ま
た,デバイス/ヘッド・レジスタのデバイス部では LBA モード選択するた
めに bit 6 を 1 にセットする.
- console driver で -O が指定できないのは,VRAM の内容をラッチに読み
込むためにダミーの変数に代入する部分が最適化のために削除されること
による.この部分だけ最適化を止めるか,必ず VRAM の内容を読み出すよ
うなコードにすれば良い.
- EOTA のμITRON kernel 部ではシステムコールの呼び出し時に %eax と
%edx の内容を書き換える.タスクスイッチ時は %edx も保護される.これ
らのレジスタを特定の目的で使っているコードは正しく動作しない.ちな
みに,gcc の -O で生成されるコードはこれらのレジスタの値は使い捨て
にしているようだ.
- Linux の fdisk は BIOS を使っているせいか,IDE の CHS をそれぞれ
10/8/6 bit で表現するが,EOTA は IDE の生の表現を使っているので
16/4/8 bit で表している.パーティションの書き込みに BIOS の表現を
使用しているため,EOTA で使用できるディスクサイズは上記の bit 長の
最短から決まる約 528 MB に制限されるようだ.
- POSIX システム・コールの lseek で EOF を越える場所に移動すると,新
規にファイルを書き込む時点で offset の位置まで 0 を連続して書き込むよう
にした.
- HD のパーティション/ドライブ・サイズとして認識できるのは最大 4GB.
- ブロック・デバイスは DEV_OPN に対して,デバイスのサイズを返答する.
これは,POSIX manager 内でデバイスの大きさを越えたアクセスの制限に
利用される.キャラクタ・デバイスはサイズとしては 0 を返せば良い.
- EOTA の起動用のプログラムは sfsboot に統一した.fdboot も利用できる.
- sash の dd で dd if=/dev/ide0 of=head.bin count=1 を実行し
ても,データの読み取りが 1 ブロックで終了しないが,これは EOTA 側の
bug ではなく,sash-3.4 の dd の仕様の問題だった.
- POSIX libc に含まれる rename 関数は現時点ではシステムコールではなく,
単に link を呼び出した後で unlink を呼び出している.そのため,リン
ク先のファイルが既に存在する場合にはエラーを返す.
- EOTA の BTRON 環境は内藤さんの BTRON386 を移植する形で整備する.
- Linux でも使用している ax = 0xe801, int 0x15 の BIOS コールだけでは,
実メモリーのサイズを正しく取得できないマシンがある.
- ITRON 部で,実行中のタスクもレディーキュー上に残すようにした.レディー
キューから取り除くと,rot_rdq やchg_pri の実装が
やっかいになる.
- カーネルモジュールでは,静的外部変数は 0 に初期化される保証がない.
ローダーの責任か? アプリケーションに物理メモリを割り当てるときには,
そのメモリ領域全体を 0 で初期化する.
- POSIX 環境の kill システムコールは,メッセージの送り先が
KERNEL_TASK の場合には返事を返さない.他のタスクの場合は通常通り返
事を返す.
- POSIX 環境の kill システムコールは,プロセスを強制終了させるための
システムコールとして実装した.本来は任意のシグナルを生成するためのシス
テムコールなのだが,当面は強制終了用に使うことにする.
- page fault の発生時には割込み許可関係の処理は全く行っていないが,
timer 割込みは発生し続ける.
- POSIX 環境でデバイスファイルを open/close すると,対応するデバイス
ドライバタスクに DEV_OPN/DEV_CLS メッセージが毎回送信される.このための
関数は sfs_device.c に作成した.
- newlib とリンクしたバイナリーに strip をかけるとサイズがかなり小
さくなる.strip をかけたバイナリーも今のところは特に問題なく動いている
ようだ.
- context switch の後で cr0 の TS フラグを clts でクリアしておかな
いと,FPU 命令で障害の #7 が発生する.
- kernel/BTRON/driver/console の vga.c で定義され
ている描画命令で,ラスターオペレーションに VGA_XOR を指定して
も XOR の動作は行ってくれないようだ.
- newlib-1.8.1 用の patch は 1.8.2 には当たらない.
- POSIX FS でエラーが発生したときの動作を見直す必要がある.
- SFS の cache では super block の cache は行っていない.
- UNIX の getdents はそれぞれのエントリーのアラインメント
を行っている様だが,ここではアラインメントは行っていない.ただし,
sizeof(struct dirent) でファイル名以外の部分の大きさを計算し
ているところで 1 byte 分余計に計上されている.
- struct dirent の定義は kenrle/POSIX/manager/posix.h
にある.
- message buffer の中では bcopy を用いて message の本体の
コピーをおこなっているが,run_task の buffer からコピーする場
合には vget_reg/vput_reg を使う必要はない.
- ITRON 部の rsm_tsk, frsm_tsk では SUSPEND から
回復したタスクはレディキューの先頭に置かれる.これは μITRON 3.0 でも
実装依存とされている.
- ITRON の task ID など,MIN_ を定義しているものの扱いには
注意が必要.task.c の task は MIN_TSKID が
1 になっているので task = &task_buffer[-1]; と初期化され
る.message.c では単純に配列のサイズを大きくすることで対応し
た.
- FDD の中で eventflag を使用すると,機種によって動作が定まらないよ
うだ.特に,clr_flg を FDC へのコマンドの書き込みの直前に置く
と,486DX2 のシステムで FD の mount が終わらず, stop_motor
もコールされない.同じバイナリーが PII の GW2K SOLO だとちゃんと動作す
る.wai_flg の直前で clr_flg しているものは ThinkPad
で動作しないという報告があった.
- POSIX 環境の misc システム・コールを作成したが,
cmd に負の数を与えた場合には ITRON vsys_msc を呼び出
すようにした.
- fcntl の第2引数の request の上位 16 bit には
device driver に送る control command を,下位 16 bit には,第3引数の
argp が指す引数のバイト数を入れる.これに対応して,device
driver を作成する場合には control code を 16 bit 以下に納めることを推
奨する.
- fcntl の第2引数の下位 16 bit が 0 の場合,第3引数が直接
int 型で与えられると解釈する.しかし,
kernel/ITRON/kernlib/device.h の DEV_REL_CTL で
UB param[0] となっているので問題があるかもしれない.しかし,
UB である必要はあるのだろうか?
- libkernel の malloc を利用する場合に,
init_mallocに与えるアドレスの作り方に注意しなければならない.
静的変数のアドレスを与えても,ページの最後を指す保証はない.この部分は
POSIX manager の posix.c の中に実際に存在していた.
- libkernel の malloc はライブラリーとして周辺核に組み込ま
れて使うことが前提となっている.サーバーとして動くわけではないので注意.
- FDD の読み込みエラーのチェックは厳密にしないといけない.
- graphic 用の関数を libc.a に含めるようにしたが,別のライ
ブラリを作ったほうが良いかも知れない.API も現在の BASIC 風のものから
変更する余地はある.
- μITRON の def_alm は ITRON 部もしくは,デバイス・タスク
でのみ利用可能.固有の仮想空間をもつタスク(周辺核?)では利用できない.
- kon が利用している minix-V 形式のフォント (pubfont.a, pubfont.k)
のフォーマットは単純で,容量も小さいので漢字フォントも on memory で処
理できるだろう.pubfont.k は非圧縮で約 250KB.ただし,これらは 16x16
のビットマップとして作成されているようだ.xbm とはビットの左右が反転し
ている.
- xbm 形式になっていれば,一行が複数バイトに渡る bitmap も正しく表
示できる.
- ioctl に渡すリクエスト中に,続くポインター引数のバイト数
をエンコードすることが Linux の man ページに書いてあった.