雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。

IPLをへこへこと研究しているうちに、ふと余計な色気が出てきた。

カーネルを、単なるファイルとして読み込めないか???

たとえばIPLを書き込んだりする「起動ディスク」はまあ、最初は多少面倒でもかまわないのだが、そのカーネルを作り直したりした場合に、単にファイルの上書きだけでできたら楽なのは言うまでもない。そういうふうなIPLを作るのって面倒くさいものかな???

FAT12のファイル管理

IPLでは、基本的にはBIOS等を呼んでセクタをシコシコと読み込んでいるに過ぎない。で、その時は一個一個読んでいくわけだ。先の研究中のIPLやheboOSのIPLは、あくまでも「メンドクサイ」ので、仮ファイル&セクタ決め打ちでの読み込み。

FATの管理部分を読んで、それを一個一個拾っていっても理屈は同じではないのか???

FAT情報からセクタを拾いだす。 anchor.png Edit

各特殊なセクタの位置は、IPL(セクタ0)を読んだ時点で内蔵されているBPBの値から計算することが出来る。

ちょっと手順を考えてみよう。

  1. BIOSによりブート。IPL(セクタ0)が自動的に読み込まれる
  2. まず、BPBの値を計算して、各特殊セクタ(特殊領域・FAT領域・ルートディレクトリ領域等)の位置を割り出しておく
  3. ルートディレクトリ領域を読み込む。
  4. 読み込んだルートディレクトリ領域から、目的のファイル名領域を探す(じゃ、仮にthebbl.sysとでもしておこう)
  5. 探したthebbl.sysの情報を読み、このファイルがどことどこのセクタに書かれているのかを求める。
  6. 求めたセクタを順に読み込んでいく。
  7. 全部読んだらメモリの特定の場所にジャンプして終了
  8. 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ビットを一組にして、ずらーーーーっとこれが並んでいるわけね。

Page Top

プログラムを妄想 anchor.png Edit

そんなわけでファイルを探すプログラムを妄想してみる。

;==================================================
[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