雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。
IPLをへこへこと研究しているうちに、ふと余計な色気が出てきた。
カーネルを、単なるファイルとして読み込めないか???
たとえばIPLを書き込んだりする「起動ディスク」はまあ、最初は多少面倒でもかまわないのだが、そのカーネルを作り直したりした場合に、単にファイルの上書きだけでできたら楽なのは言うまでもない。そういうふうなIPLを作るのって面倒くさいものかな???
FAT12のファイル管理
IPLでは、基本的にはBIOS等を呼んでセクタをシコシコと読み込んでいるに過ぎない。で、その時は一個一個読んでいくわけだ。先の研究中のIPLやheboOSのIPLは、あくまでも「メンドクサイ」ので、仮ファイル&セクタ決め打ちでの読み込み。
FATの管理部分を読んで、それを一個一個拾っていっても理屈は同じではないのか???
FAT情報からセクタを拾いだす。
各特殊なセクタの位置は、IPL(セクタ0)を読んだ時点で内蔵されているBPBの値から計算することが出来る。
ちょっと手順を考えてみよう。
- BIOSによりブート。IPL(セクタ0)が自動的に読み込まれる
- まず、BPBの値を計算して、各特殊セクタ(特殊領域・FAT領域・ルートディレクトリ領域等)の位置を割り出しておく
- ルートディレクトリ領域を読み込む。
- 読み込んだルートディレクトリ領域から、目的のファイル名領域を探す(じゃ、仮にthebbl.sysとでもしておこう)
- 探したthebbl.sysの情報を読み、このファイルがどことどこのセクタに書かれているのかを求める。
- 求めたセクタを順に読み込んでいく。
- 全部読んだらメモリの特定の場所にジャンプして終了
- OS本体が起動を開始
・・・っとまあ、こういう感じかな???
FAT12は、ルートディレクトリ領域にファイルの情報が書かれている。また、FAT12では1つのファイルに32バイトの情報を持っている。どういう情報かというと
0 | ファイル名。(thebbl.sysだったら、「thebbl」が入る |
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | 拡張子。(thebbl.sysだったら、「sys」が入る) |
9 | |
10 | |
11 | ファイルの属性の情報 |
12 | 予約領域(将来用に用意された部分。FAT12では使わない) |
13 | ファイル作成時刻(秒の部分?) |
14 | ファイル作成時刻(何時何分) |
15 | |
16 | ファイル作成時刻(何年何月何日) |
17 | |
18 | ファイルアクセス日付(???よくわからんな・・・) |
19 | |
20 | ファイルが格納されているセクタの番号。(上位2バイト。FAT12では使用しないらしい・・・) |
21 | |
22 | ファイル更新時刻(何時何分何秒) |
23 | |
24 | ファイル更新時刻(何年何月何日) |
25 | |
26 | ファイルが格納されているセクタの番号。(下位2バイト。FAT12ではここだけ使用すればいいらしい・・・) |
27 | |
28 | ファイルのサイズ |
29 | |
30 | |
31 |
なるほどなるほど。じゃ、この「26」の部分を見れば、このファイルがセクタ何番からスタートしているかわかるわけか。
「ルートディレクトリ領域」には、上記32ビットを一組にして、ずらーーーーっとこれが並んでいるわけね。
プログラムを妄想
そんなわけでファイルを探すプログラムを妄想してみる。
;================================================== [BITS 16] [OPTIMIZE 1] [OPTION 1] [INSTRSET "8086"] [FORMAT "BIN"] ORG 0x100 ;---------------------------------------------- ;==とりあえず一個のルートディレクトリ領域を読み込み、そこで指定のファイルを ;探してみる MOV AH,02H ;モード指定。(読み込みを指定) MOV AL,01H ;連続処理するセクタ数(とりあえず1) MOV CH,01H ;シリンダ番号(シリンダ1を指定) MOV CL,14 ;セクタ番号(セクター14を指定) MOV DH,0 ;ヘッド番号(0すなわち表を指定) MOV DL,0 ;ドライブ番号(0すなわちAドライブを指定) MOV ES,xxx ;データを読み込むアドレスのセグメント値 MOV BX,xxx ;データを読み込むアドレスのオフセット値 INT 13H
;--end--- ;---------------------------------------------- MOV AX,0x4c00 INT 0x21 ;===============================================
最終更新: 2024-01-06 (土) 22:39:10 (JST) (108d) by