0

私はbrokenthornのOS Devチュートリアルを読んでいます

http://www.brokenthorn.com/Resources/OSDev6.html

私はこれに数日間立ち往生しました。;

「stage2.sys」を読み込み、

ルートディレクトリ「stage2 sys」を検索します。

ルート ディレクトリには、ファイル名と開始クラスタ アドレスが含まれます (つまり、0x002)。

0x002 番目のクラスターをロードし、FAT を検索して次にロードするクラスターを探します。

FAT は 12bit 配列と

配列サイズは 4077 です

今のところ、ファイルの最初のクラスターによって次のヒントをロードするものを FAT が教えてくれる方法がわかりません。

問題はこれです。

  1. 不足している点や間違っている点はありますか?

  2. ファイルの最初のクラスターによって、次のクラスターのヒントを読み込むものを FAT がどのように通知するのですか?

FAT は 12 ビット配列だけで構成されています。

ありがとう。

4

3 に答える 3

3

FAT クラスター リストは単なる配列であり、配列内のエントリは、ファイルのクラスター チェーン内の次のインデックスです。ディレクトリ内のファイル エントリは、最初のクラスタの場所を示しています (この例では、クラスタ 0x002)。次のクラスターを見つけるには、FAT 配列のインデックス 0x002 を調べます。

next_cluster = FAT[0x002];

たとえば、FAT[0x002]0x014 が保持されている場合、それがファイルの次のデータ セットを保持するクラスターでFAT[0x014]あり、3 番目のクラスターなどを探します。

12 ビットの FAT を扱っている場合、配列のインデックス作成が少し複雑になることを意味します。インデックス作成は次のようになると思います

// find the 16-bit word that contains the 12-bit FAT entry
uint16_t tmp = ((uint16_t*)(((char*)FAT) + index + (index / 2)));

// keep either the high 12-bits or low 12-bits depending on if the 
// index is even or odd.
next_cluster = (tmp >> ((index % 2) ? 4 : 0)) & 0x0fff;

もちろん、これはインメモリ FAT に基づいています。FAT がメディアから読み取られている場合は、読み取るセクタ (およびセクタへのオフセット) に適切に変換する必要があります。

于 2011-04-24T04:54:28.093 に答える
1

ファイルのディレクトリ エントリには、最初のクラスタ番号が含まれています。これを使用して、ディスクの「データ」部分から実際のクラスターを取得し、さらにFAT から次のクラスター番号を取得できます。

FAT 内のエントリには、ファイル内ののクラスターのクラスター番号が含まれています。

したがって、最初のクラスタ番号が 22 であることを示すディレクトリ エントリが作成されます。次に、クラスタ 22 のデータを取得し、クラスタ番号 22 の FAT エントリを検索します。たとえば、76 を保持しているとします。

したがって、ファイル内の次のクラスタは番号 76 であり、同じプロセスに従います。データを取得し、FAT エントリ 76 で次のクラスタ番号も検索します。

次のクラスター番号の特別な値は、チェーンが終了し、それ以上利用できないことを示していました。(記憶から) FAT12 では 0xFFF だったと思いますが、高い値の範囲だった可能性があります。

于 2011-04-24T04:53:39.940 に答える
1

FAT は基本的にリンクされたリストです。ファイルの先頭がクラスタ 2 にある場合、次のクラスタを見つけるには、FAT のエントリ 2 を調べます。これには、そのファイルの次のクラスターのクラスター番号が含まれます。ファイルの終わりを示す (メモリからの) 0ff8h よりも大きい数字を含むものに到達するまで、それらをたどります。

余談ですが、本当に12 ビット FAT を使いたいと思っているのでない限り、16 ビット FAT のほうがかなり簡単に扱えます。

于 2011-04-24T04:54:23.337 に答える