入手方法と使い方モニタプログラムの入手方法と設定モニタプログラム使用時の注意事項FDTの入手と使い方ハードウェア情報TFTに描画する画像について連絡先FATファイルシステム(その1)ファイルシステムとはコンピュータの補助記憶装置(ハードディスクなど)にデータを記録する場合、データの集合を一つのファイルとして記録している。このファイルを管理する仕組みとして考案されたものがファイルシステムである。次のような場合を考える。初期状態では、ある大きさの空き領域が存在しているFile-Aを削除したことにより、空き領域が増えた(二つになった)File-Cは一つの空き領域では入らないため、二つの領域を使って記録したこのように、ハードディスクなどの容量を効率的に使うためには、一つのファイルを分割して記録したほうが良い場合がある。ファイルシステムのルールに従って記録することにより、上の例のFile-Cが、二つの領域に分かれて記録されていることを意識せず、使うことができるようになる。この例はファイルシステムの必要性をわかりやすく説明したものであるが、その他にもディレクトリ構造の実現や、ファイルの追記、削除などの機能を提供してくれる。ファイルシステムにはいくつかの種類がある。MS-DOSを起源にMicrosoft社のOSで使われているFATファイルシステム、Windowsで使われるNTFSファイルシステム、Linuxで使われるextファイルシステムなどがある。Tableの略であり、ディスク内でのファイルの位置を記録したテーブルのことである。このFATを使用したファイルシステムをFATファイルシステムと呼んでいる。MS-DOSの時代のFAT12から進化し、FAT16、FAT32がある。FAT12は12bitのFATを持ち、フロッピーディスクの時代に使われていたものである。現在でもフロッピーディスクや、小容量のメモリカードに使われることがある。FAT16は16bitに拡張されたFATを持ち、以前はハードディスクなどでも使用されていた。現在では小容量のメモリカードに使われることが多い。FAT32は32bit化されたFATであり、大容量のディスクのディスクにも使用できる。本テキストでは小容量のSDカードをターゲットとしているので、以降、特に断りがない限りFAT16について説明をする。FATファイルシステムの構造FATファイルシステムにおいて、情報が記録されている場所は「セクタ番号」で表す。「セクタ」とは、数バイトの情報をひとまとめにしたもので、FATファイルシステムでは通常1セクタ=512バイトである。ここから推測できるように、1バイト単位のリード/ライトはできない。最小でも1セクタ(=512バイト)のリード/ライトになる。一般のメモリの場合は「物理アドレス」を用いたが、ファイルシステムの場合は「セクタ番号」を用いるので注意が必要である。セクタ0はSDカードのアドレス0x00000000、セクタ1はアドレス0x00000200であるFATファイルシステムでは、下図のように様々な領域が並んでいる。マスターブートレコード。パーティション情報などが書かれている。ルートディレクトリの情報。ルートに存在するファイルのファイル名など。各々は、上のような機能を持っている。以下の説明では、次のワークスペースをダウンロード・ビルドし、実際にSDカードのセクタを読み出して、確認しながら進める。Record)MBRはディスクやSDカードの先頭に位置する(セクタ番号0)。ブートストラップローダ部は、その名が示すように、ディスクから起動するためのプログラムを格納しておくことが主な目的であるが、ここでは詳しく説明をしない。MBR内で重要なものは、パーティションテーブルである。MBR内のオフセット446以降に存在している。ここには16バイトのパーティション情報が4組格納されている(合計64バイト)。sector情報が二つ存在するが、ここではLBA方式を使用する。...のように情報が書き込まれている。454となり、454~457の4バイトが、1st_sector(LBA)である。この値はリトルエンディアン表記になるので、注意が必要である。このパーティションテーブルは4組あるので、パーティションは最大4つ持つことができる。—MBRをリードし、1st_sector(LBA)を計算せよ。この値の示すセクタが、次に説明するBPBのセクタである。Block)BPBは、MBRのパーティションテーブルから得られた1st_sector(パーティションの最初のセクタ)に存在する。BPBの例BPBには、BPB自身のサイズ、FATのサイズと数、などの情報が記録されている。1つのFATが占めるセクタ数BPB先頭部分の抜粋BPB_BytesPerSecは1セクタあたりのバイト数であり、通常512である。BPB_SecPerClusは、1クラスタあたりのセクタ数である。「クラスタ」とは、いくつかのセクタをまとめたもので、ユーザデータはクラスタ単位で管理されている。1クラスタ=2セクタであれば、ユーザのデータ(ファイル)には、最小でも1クラスタ(=2セクタ)が使われる。この値は1クラスタ=2^nセクタとしたときのnである。BPB_RsvdSecCntは、BPBを含む予約エリアが占めるセクタ数である。この値を用いることにより、BPB領域に続くFATの先頭セクタを計算することができる。BPB_NumFATsは、FATが何組あるのかを示している。BPB_RootEntCntは、ルートディレクトリのエントリ数(≒ファイル数)を示している。この値と、1エントリあたりのサイズ(=32バイト)を用いることにより、RDEのサイズを計算することができる(ユーザ領域の先頭セクタを計算することができる)。BPB_FATSz16は、1つのFATが占めるセクタ数である。これとBPB_NumFATsを用いることにより、FAT領域の合計セクタ数を求めることができる(RDEの先頭セクタを計算できる)。このように、BPBに記録されている各種パラメータは、FATファイルシステムで非常に重要な役割を持っている。BPB_FATSz16を計算せよ。Entry)RDEの位置は、次のように計算することができる。BPB_FATSz16)RDEの例RDEには、ルートディレクトリ(例えばC:)に存在するファイルやディレクトリの情報が記録されている。上図の赤色の四角ひとつが、一つのファイルやディレクトリの情報を持っている。ルートディレクトリに存在できるファイルやディレクトリの数(エントリ数)はBPB_RootEntCntで得られる。BPB_RootEntCntである。ファイルサイズ(バイト)ディレクトリエントリーの例NameとExtは、ファイル名と拡張子である。FAT16ではファイル名に8文字、拡張子に3文字が割り当てられている。これより長いファイル名は、別の方法で管理されている。Attr(属性)は、ファイルとしてのエントリーなのか、ディレクトリとしてのエントリーなのか、等を示している。属性が0x20の場合はファイル、0x10の場合はディレクトリとなる。CrtTimeはファイル作成時刻、WrtTimeは最終書き込み時刻を示している。2バイトのデータで、次のようなフォーマットになっている。秒のフィールドは、60秒をカウントするにはビット数が不足するので、秒/2の値となっている。このフィールドだけでは30秒と31秒は区別できない。実際の時刻データの解読CrtDateは作成日、LstAccDateは最終アクセス日、WrtDateは最終更新日である。これらは2バイトのデータで、フォーマットは次のようになっている。日:1~31実際の年月日データの解読FstClusLOは、ファイルの中身が実際に記録されているクラスタ番号を示している。「クラスタ」とは「セクタ」をいくつかまとめたもので、ユーザのデータ(ファイル)はクラスタ単位で記録・管理されている。1クラスタあたりのセクタ数は、BPBのBPB_SecPerClusである。FileSizeはファイルサイズを示している。BuyNowShop.com.。