2: 2005-07-21 (木) 19:05:26 |
3: 2005-07-22 (金) 07:28:09 |
| | | |
| -予約領域 | | -予約領域 |
- | --おそらくなにか特別な用途に使うために用意されたものでしょう。ファイルとしては絶対にアクセスできない領域になるようです。算出は、「FATがどこから格納されているか」の数字で求めます。IPLはセクター1。で、この数字を例えば10にすると、FAT領域はセクター11からとなります。そうすると必然的に、セクター2〜セクター10が予約領域となり、通常は使うことができない特殊な領域となります。 | + | --おそらくなにか特別な用途に使うために用意されたものでしょう。ファイルとしては絶対にアクセスできない領域になるようです。算出は、「FATがどこから格納されているか」の数字で求めます。IPLはセクター0。で、この数字を例えば10にすると、FAT領域はセクター10からとなります。そうすると必然的に、セクター1〜セクター9が予約領域となり、通常は使うことができない特殊な領域となります。 |
- | --上記の例では「1」ですね。つまり、FAT領域はセクター1の次から(セクター1から)ということになり、事実上予約領域は0となります。 | + | --上記の例では「1」ですね。つまり、FAT領域はセクター0の次から(セクター1から)ということになり、事実上予約領域は0となります。 |
| | | |
| -FAT領域 | | -FAT領域 |
| | | |
| *論理セクタと物理セクタ [#gcd8fb39] | | *論理セクタと物理セクタ [#gcd8fb39] |
| + | 上記のFAT構造などで、「セクター0」とか「セクター161」とか書いてますね。でも、実はこれは「論理セクター」といい、単なる概念なのです。 |
| | | |
| + | IPLの段階では、各セクターをBIOSの命令などで読み出すことになりますが、これらの命令では、「セクター140を読め」という指定はできません。もっと物理的。すなわち、実際にFDの状態に合わせた指定が必要になります。 |
| | | |
| + | 実際(物理的)のFDは、まず丸く仕切られています。ちょうど、木の年輪・あるいは輪切りにしたたまねぎのような状態です。この輪を「シリンダ」といいます。(本当はシリンダとはトラックの集まりのことですが、FDの場合はとりあえずシリンダ=トラックでいいでしょう。) |
| | | |
| + | シリンダは内側から「シリンダ0、シリンダ1・・・・シリンダ79」という番号が振られており、0〜79まで。すなわち80本あります。 |
| | | |
| + | シリンダはさらに孤の状態に仕切られています。輪切りにしたたまねぎを、さらにケーキを切るように切っていったと考えてください。こうして切られた1つひとつを「セクタ」と呼びます。 |
| + | |
| + | ※シリンダは0から数えますが、なぜかセクタは1から数えます。 |
| + | |
| + | セクタは1〜18まで。つまり、1つの輪(シリンダ)が18個のセクタに仕切られます。 |
| + | |
| + | さらに、通常のFDは、これが裏表にあります。 |
| + | |
| + | なので、通常のFDには、80(シリンダ) × 18(セクタ) × 2(裏表)= 2880。2,880個のセクタがあるというわけです。 |
| + | |
| + | ・・・カンのいい人はもうおかしいと思いますね。 |
| + | |
| + | 「セクター161ってのは、じゃどこのことなんだよ?」と。 |
| + | |
| + | |
| + | これまで書いてきた「セクター0」とか「セクター161」という書き方は、「論理セクタ」といい、話を簡単にするための概念なのです。 |
| + | |
| + | で、上記の説明が実際のFD上での状態。すなわち、「物理セクタ」です。 |
| + | |
| + | |
| + | 「論理セクタ」で言うと、セクターは0〜2879まで。 |
| + | |
| + | しかし、「物理セクタ」は、最大で18番までしかありません。また、BIOSなどで実際に指定する場合は、この「物理セクタ」で指定してやらないといけないのです。 |
| + | |
| + | ***論理セクター0を物理セクタに換算する [#q28b6739] |
| + | 論理セクター0。(IPLですね)これを、物理セクタに換算すると、こうなります。 |
| + | |
| + | |シリンダ| 0| (一番内側)| |
| + | |セクタ| 1 | (詳しいことは省略。FDはちゃんとスタート位置があります。)| |
| + | |ヘッド| 0 | (表面のこと)| |
| + | |
| + | では、論理セクター1はっていうと、 |
| + | |
| + | |シリンダ| 0| (一番内側)| |
| + | |セクタ| 2 | (詳しいことは省略。FDはちゃんとスタート位置があります。)| |
| + | |ヘッド| 0 | (表面のこと)| |
| + | |
| + | |
| + | 論理セクター2は |
| + | |
| + | |シリンダ| 0| (一番内側)| |
| + | |セクタ| 3 | (詳しいことは省略。FDはちゃんとスタート位置があります。)| |
| + | |ヘッド| 0 | (表面のこと)| |
| + | |
| + | と、こう続いていきます。 |
| + | |
| + | で、そうなると、論理セクター17は |
| + | |
| + | |シリンダ| 0| (一番内側)| |
| + | |セクタ| 18 | (詳しいことは省略。FDはちゃんとスタート位置があります。)| |
| + | |ヘッド| 0 | (表面のこと)| |
| + | |
| + | となります。・・・じゃ、論理セクター18は?っていうと、 |
| + | |
| + | |シリンダ| 1| (一番内側から2つ目)| |
| + | |セクタ| 1 | (詳しいことは省略。FDはちゃんとスタート位置があります。)| |
| + | |ヘッド| 0 | (表面のこと)| |
| + | |
| + | と、こう続いていくわけです。もうお解りですね? (^^) |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | *コードを考えてみる [#we928a72] |
| + | [[OS-WikiのBIOS一覧:http://community.osdev.info/index.php?cmd=read&page=%28AT%29BIOS]]で調べてみると、ディスクを読むためのBIOSコールは「INT 13H」であることが解る。すこし具体的にコードを考えてみよう。 |
| + | |
| + | |
| + | これまでの考察や調査(パクリとも言う・・・ :P)を元に、以下を仮定してみる。 |
| + | |
| + | -OS本体を、とりあえず最大64KBと仮定しておく |
| + | -FAT上でも仮ファイルとして成り立つようにしておきたい。 |
| + | |
| + | --FAT上でファイルとして成り立たせるためには当然FAT領域やルートディレクトリ領域にも情報を書かなくてはならないが、それはちょっとあとで・・・ |
| + | |
| + | --FAT上でファイルとして成り立たせるためには、当然「データ領域」にデータを置かなくてはいけない。データ領域の開始位置は、論理セクタで33番から。OSが64KBなら、161番までとなる。つまり、BIOSで論理セクタ33〜161までを連続で読み込み、メモリに格納すればいい。 |
| + | |
| + | --ただし、BIOSコールの詳細を見れば解るが、実際の指定は「物理セクタ」で行わなくてはいけない。 |
| + | |
| + | --実際には読み込んだデータを格納するメモリのアドレスが必要だが、これはちょっと一旦はしょっておく・・・(^^;) |
| + | |
| + | そんなわけで、まず論理セクタ33を読み込んでみる。論理セクタ33は、シリンダ2・セクタ14・ヘッド0となるので、こういうコードになるはず。 |
| + | |
| + | 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 |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | |
| + | ---- |
| | | |
| | | |