デバイス名 | デバイス |
---|---|
fda 〜 | フロッピーディスク |
hda 〜 | IDE(ATA) ハードディスク / ATAPI CD-ROM ドライブ / ATAPI ハードディスク |
pca | PC カードスロット#1 |
pcb | PC カードスロット#2 |
mda 〜 | RAM ディスク |
rda 〜 | ROM ディスク |
uda 〜 | USB ストレージデバイス |
CTLfd
の特殊デバイスをサポートする。
nowait
モードはサポートしていないため、無視する。
format
コマンド等)で行う。
なし
OS 核に組み込まれて内部的に起動される。
CTLfd
以外)
CTLfd
以外のデバイスでは以下の属性データをサポートする。
R | 読み込みのみ可 |
W | 書き込みのみ可 |
RW | 読み込み / 書き込み可 |
/* ディスク属性データ番号 */ typedef enum { /* 共通属性 */ DN_DISKEVENT = DN_EVENT, DN_DISKINFO = DN_DISKINFO, /* 個別属性 */ DN_DISKFORMAT = -100, DN_DISKINIT = -101, DN_DISKCMD = -102, DN_DISKMEMADR = -103, DN_DISKPARTINFO = -104, DN_DISKCHSINFO = -105, DN_DISKIDINFO = -106 } DiskDataNo;
DN_DISKEVENT :
data :
ID
事象通知用メッセージバッファID を設定、または取り出す。
DN_DISKINFO :
data :
DiskInfo
typedef struct { DiskFormat format; /* フォーマット形式 */ Bool protect:1; /* プロテクト状態 */ Bool removable:1; /* 取り外し可否 */ UW rsv:30; /* 予約 (0) */ W blocksize; /* ブロックバイト数 */ W blockcont; /* 総ブロック数 */ } DiskInfo;
format | フォーマット形式 |
protect | ハード的に書き込みが禁止されている状態 |
removable | 取り外し可否 |
blocksize | 物理ブロックサイズ(バイト数) 通常は、512 バイト |
blockcont | 総ブロック数 サブユニットの時は、その区画の総ブロック数 |
ディスク情報を取り出す。
DN_DISKFORMAT :
data :
DiskFormat
typedef enum { DiskFmt_MEMINIT = -2, /* メモリーディスク初期化 */ DiskFmt_MEM = -1, /* メモリーディスク */ DiskFmt_STD = 0, /* 標準 */ DiskFmt_2DD = 1, /* 2DD 720KB */ DiskFmt_2HD = 2, /* 2HD 1.44MB */ DiskFmt_VHD = 3, /* フロプチカル 20MB */ DiskFmt_CDROM = 4, /* CD-ROM 640MB */ DiskFmt_2HD12 = 0x12 /* 2HD 1.2MB */ } DiskFormat;
正しいフォーマット種別を書き込むことにより物理フォーマットを開始する。
RAM ディスクの場合は、全ブロックを一定の値で埋め、ディスク上の情報を完全に消す。
このコマンドはデバイスによってはサブユニットに対しては、使用できない場合もある。
物理デバイスのフォーマット後は、サブユニットが存在しなくなるので、 ディスク初期化が行われてサブユニットが再登録されるまでサブユニットに対する処理要求はエラーとなる。
DiskFmt_MEMINIT
は、RAM ディスクのサイズを変更するための特殊な指定であり、
以下のデータを直後に追加して指定することにより、
指定したサイズの RAM ディスクとして初期化を行う。
ブロックバイト数は、512 〜 8192 で、512 の倍数でなくてはいけない。
W blocksize; /* ブロックバイト数 */ W blockcont; /* 総ブロック数 */
DN_DISKINIT :
data :
DiskInit
typedef enum { DISKINIT = 1, } DiskInit;
DISKINIT
の書き込みにより、
指定したデバイスのリセットを行いデバイスを再登録する。
ディスクに区画が存在する場合は、区画情報を読み込み、
区画ごとにサブユニットとして登録する。
通常、
このコマンドはディスクの区画情報を変更した時に使用する。
このコマンドをサブユニットに対しては使用した場合は何もしない。
DN_DISKCMD :
data :
DiskCmd
typedef struct { B clen; /* ATAPI コマンド長さ + R/W フラグ */ UB cdb[12]; /* ATAPI コマンド */ W dlen; /* データ長さ */ UB *data; /* データアドレス */ } DiskCmd;
書き込まれた ATAPI コマンドを実行する。ATAPI コマンド長さは 12 バイト固定であり、clen が 12 のときは読み込みコマンド、12 + 0x80 のときは書き込みコマンドであることを示す。
DN_DISKMEMADR :
data :
VP
ディスクとして使用するメモリの先頭アドレス(論理アドレス)を取り出す。
このアドレスから、DiskInfo
で得られるディスク容量
( blocksize * blockcont
バイト )
分の連続した物理メモリー空間がディスクとして使用されるメモリである。
任意にアクセスできるのは、デバイスをオープン ( DC_OPEN
)
しているときのみである。
デバイスをクローズ ( DC_CLOSE / DC_CLOSEALL
)
した後にはアクセスしてはいけない。
また、一旦クローズし、再度オープンした場合には、
ディスク領域の先頭アドレスも再度取り出し、
そのアドレスを使用してアクセスしなければいけない。
メモリへの直接アクセスを許さないデバイスの時は、
ER_NOSPT
のエラーとなる。
DN_DISKPARTINFO :
data :
DiskPartInfo
typedef enum { /* ディスクシステム ID */ DSID_NONE = 0x00, DSID_DOS1 = 0x01, DSID_BTRON_X = 0x03, /* XENIX */ DSID_DOS2 = 0x04, DSID_DOSE = 0x05, DSID_DOS3 = 0x06, DSID_HPFS = 0x07, DSID_FS = 0x08, DSID_AIX = 0x09, DSID_OS2 = 0x0A, DSID_WIN95 = 0x0B, DSID_WIN95L = 0x0C, DSID_DOS3L = 0x0E, DSID_DOS3E = 0x0F, DSID_BTRON = 0x13, DSID_VENIX = 0x40, DSID_CPM1 = 0x52, DSID_UNIX = 0x63, DSID_NOVELL1 = 0x64, DSID_NOVELL2 = 0x65, DSID_PCIX = 0x75, DSID_MINIX1 = 0x80, DSID_MINIX2 = 0x81, DSID_LINUX1 = 0x82, DSID_LINUX2 = 0x83, DSID_AMOEBA = 0x93, DSID_BSDI = 0x9F, DSID_386BSD = 0xA5, DSID_CPM2 = 0xDB, DSID_DOSSEC = 0xF2 } DiskSystemId; typedef struct { DiskSystemId systemid; /* システム ID */ W startblock; /* 開始ブロック番号 */ W endblock; /* 終了ブロック番号 */ } DiskPartInfo;
systemid | 区画のシステム ID |
startblock | 区画の先頭の絶対ブロック番号 |
endblock | 区画の最後の絶対ブロック番号 |
= startblock + DiskInfo.blockcont - 1 |
サブユニットの区画の情報を取り出す。
物理デバイスを指定した場合はエラーとなる。
DN_DISKCHSINFO :
data :
DiskCHSInfo
typedef struct { W cylinder; /* 総シリンダ数 */ W head; /* シリンダ当たりのヘッド数 */ W sector; /* ヘッド当たりのセクタ数 */ } DiskCHSInfo;
ディスクのシリンダ(C)、ヘッド(H)、セクタ(S) 情報を取り出す。
フロッピーディスクのときは、シリンダはトラックを意味する。 RAM ディスクのときは、C = 1, H = 1, S = 総ブロック数 となる。
通常は、C * H * S = DiskInfo.blockcont
となるが、C、H、S の
値のの制限により、C * H * S < DiskInfo.blockcont
となる場合
もある。
DN_DISKIDINFO :
data :
UB[]
ディスクの識別情報を取り出す。内容はディスクの種類に依存する。
IDE、および ATA ディスクのときは、ディスクからの IDENTIFY
コマンドで得られたデータを以下の順 ( H 単位 ) で並べた 48 H ( 96 バイト)のデータとなる。
位置 | 元の位置 | 内容 |
---|---|---|
0: | [ 0] | General configuration bit |
1: | [ 1] | Number of logical cylinders |
2: | [49] | Capabilities |
3: | [ 3] | Number of logical heads |
4: | [80] | Major version numbe |
5: | [53] | 7-0:Validity 12: DMA support, 15: MSN support |
6: | [ 6] | Number of logical sectors per logical track |
7: | [54] | Number of current logical cylinders |
8: | [55] | Number of current logical heads |
9: | [56] | Number of current logical sectors per track |
10-19: | [10-19] | Serial number (20 ASCII characters) |
20-21: | [60-61] | Total number of user addressable sectors |
22: | [63,88] | 7-0: Multiword DMA Mode Supported 15-8: Ultra DMA Mode Supported |
23-26: | [23-26] | Firmware revision (8 ASCII characters) |
27-46: | [27-46] | Model number (40 ASCII characters) |
47: | [47] | Maximum number of sectors on R/W MULTIPLE cmds |
CTLfd
のみ)
CTLfd
のデバイスでは以下の属性データをサポートする。
R | 読み込みのみ可 |
W | 書き込みのみ可 |
RW | 読み込み / 書き込み可 |
/* FD / HD 制御特殊デバイス属性データ番号 */ typedef enum { DN_FDCHKPERIOD = -200, DN_FDCHKREQ = -201, DN_FDSPEC = -210, DN_HDSPEC = -310 } CtlFdDataNo;
DN_FDCHKPERIOD :
data :
W period
FD 挿入チェック周期を設定、または取り出す。
period > 0 | : period ミリ秒周期で FD の挿入チェックを行う |
period <= 0 | : 周期的な FD の挿入チェックは行わない |
DN_FDCHKREQ :
data :
W req
FD 挿入チェックを要求する。
req = 1 | : 1 回だけ FD 挿入チェックを行う |
req = 2 | : FD が挿入されるまで FD 挿入チェックを行う |
req = 0 | : req = 2 で指定した FD 挿入チェックをやめる |
req < 0 | : FD を排出したものとする(強制排出要求) |
DN_FDSPEC :
data :
W spec
FD 仕様を設定、または取り出す。
spec = xxxN 3xxx RSDD
N | : FD ドライブなし |
3 | : 3 モード ( 2HD 1.2 M ) サポート |
R | : FD 交換状態を反転 |
S | : データレートを DRR に設定 |
D | : 2DD データレート設定 ( 0 〜 3 ) |
DN_HDSPEC :
data :
W spec
HD 仕様を設定、または取り出す。
spec = xExx xxxx xxxx xxNI xxxx xxxx DDDD dddd
d | : DMA 使用 (hdd, c, b, a の順にビット対応) |
D | : DMA 使用可 (hdd, c, b, a の順にビット対応) |
I | : HD / CD-ROM 挿入自動チェック |
N | : HD / CD-ROM 自動イジェクト禁止 |
E | : HD EBIOS サポート |
CTLfd
のデバイスでは固有データはサポートされない。
CTLfd
以外のデバイスでは以下の固有データをサポートする。
データ番号 ( 0 〜 ) | :ディスクのブロック番号 |
データ数 | :読み込み / 書き込みのブロック数 |
物理デバイス ( ユニット ) の場合、 ブロック番号は物理的なブロック番号に一致するが、 論理デバイス ( サブユニット ) の場合、 ブロック番号はパーティション内の相対的なブロック番号 ( 0 〜 ) になる。
typedef struct { DevEvtKind kind; /* 事象種別 */ ID devid; /* デバイス ID */ VW info; /* 付加情報 */ } DiskEvt;
kind: DE_MOUNT ディスク/カードの挿入 DE_EJECT ディスク/カードの排出 DE_ILLEJECT ディスク/カードの不正排出 DE_ILLMOUNT ディスク/カードの不正挿入 DE_REMOUNT ディスク/カードの再挿入 DE_CARDBATLOW カードのバッテリ残量警告 DE_CARDBATFAIL カードのバッテリ残量なし
ディスクの挿入、排出、および、PC カードのバッテリ残量警告、 残量なしの事象を通知する。
DE_ILEJECT
はディスクのオープン中に不正に排出されたことを通知する。
DE_ILLMOUNT
は、不正排出のあとに、
再挿入されたディスクが排出されたディスクと異なっていることを通知する。
DE_REMOUNT
は、不正排出のあとに、
再挿入されたディスクが排出されたディスク同じであり、
正常状態に戻ったことを通知する。
info
は、
イベントが発生した時点の物理ユニットおよびサブユニットのオープン状態をビット対応で示す。
(info & (1 << N)) != 0 の時、 物理ユニットまたはサブユニット N はオープンされている。 ここで、N = 0 物理ユニット(例:pca) = 1 〜 サブユニット(例:pca0〜)
DE_MOUNT
、および DE_EJECT
の時は、
何もオープンされていないため、info
は常に 0 となる。
事象通知は物理ユニットに対してのみ行なわれ、 サブユニットに対しては行なわれない。
事象通知の応答速度はドライバ依存とする。
デバイスドライバ共通仕様を参照のこと。
I/O エラーの詳細コードは以下の通り。
クラス | 詳細コード | |
---|---|---|
EC_IO | 0 | アボートした |
EC_IO | 1 | 割り込みタイムアウト |
EC_IO | 2 | メディアエラー |
EC_IO | 3 | ハードエラー |
EC_IO | 0x10 | コマンドビジーエラー |
EC_IO | 0x11 | データビジーエラー |
EC_IO | 0x12 | ノットレディエラー |
EC_IO | 0x8* | FD 操作エラー |
0x80 | ステータスエラー | |
0x81 | リキャリブレートエラー | |
0x82 | シークエラー | |
0x83 | シリンダ番号エラー | |
0x84 | アドレスマーク不在エラー | |
0x85 | データ不在エラー | |
0x86 | シリンダ不在エラー | |
0x87 | オーバーランエラー | |
0x88 | CRC エラー | |
EC_IO | 0x8*** | IDE(ATA) / ATAPI ディスク 操作エラー |
1000 0000 SSSS SSSS
DF UNC MC IDNF MCR ABRT TK0 AMNF
1QQQ KKKK CCCC CCCC
: Sense Key (SK) != 0
: Additional Sense Code (ASC)
: Additional Sense Code Qualifier (ASCQ)
ATA 仕様に従い、 先頭のディスクブロック ( マスターブートレコード ) に以下の区画情報が入っているものとする。
typedef struct { UB BootInd; /* ブートインジケータ */ UB StartHead; /* 開始ヘッド番号 */ UB StartSec; /* 開始セクタ番号 */ UB StartCyl; /* 開始シリンダ番号 */ UB SysInd; /* システムインジケータ */ UB EndHead; /* 終了ヘッド番号 */ UB EndSec; /* 終了セクタ番号 */ UB EndCyl; /* 終了シリンダ番号 */ UW StartBlock; /* 相対開始セクタ番号(*) */ UW BlockCnt; /* セクタ数(*) */ } PartInfo; typedef struct { UB BootCode[446]; /* ブート用コード */ PartInfo Part[4]; /* パーティション情報 */ UH Sign; /* 署名 = 0xAAx55 */ } MasterBoot;
DiskSystemId
となる。
Part[].StartBlock
はワード境界とならないため、マシンによっては注意が必要となる。
実際にサポートしているデバイスは、以下の通り。
デバイス名 | 物理的位置/接続 |
---|---|
hda | IDE Primary - Master |
hdb | IDE Primary - Slave |
hdc | IDE Secondary - Master |
hdd | IDE Secondary - Slave |
デバイス名 | 物理的位置/接続 |
---|---|
pca | PC カードスロット#1 |
pcb | PC カードスロット#2 |
ATA / SRAM カード | : 汎用 (機種限定なし) |
ATAPI CD-ROM | : 以下の 2 機種のみ Panasonic CD-ROM KXL-808AN Sony VAIO 用 PCGA-CD5 |
ATAPI ハードディスクカード | : 汎用 |
FD カード | : 以下のみ Toshiba Librette 用 FD ドライブ FDDPCCM1 |
pca(b)
のデバイス名ではなく、
fda(b)
のデバイス名となる。
デバイス名 | 物理的位置/接続 | ||
---|---|---|---|
ケース 1 | ケース 2 | ケース 3 | |
fda | FD カード | 本体 #1 | 本体 #1 |
fdb | - | FD カード | 本体 #2 |
DEVCONF
ファイルに "RAMDISK" のエントリがあるときのみ、
mda
がサポートされる。
FdChkPeriod
周期 (msec)
CTLfd
の DN_FDCHKPERIOD
の初期値となる。[デフォールト: 0]
FdSpec
FD 仕様
CTLfd
の DN_FDSPEC
の初期値となる。[デフォールト: 0]
HdSpec
HD 仕様
CTLfd
の DN_HDSPEC
の初期値となる。[デフォールト: 0]
DiskChkPeriod
周期 (msec)
RAMDISK
バイトサイズ
mda
) の指定。IDE ( ATA ) ディスクに対しては、マスターブートレコードのアクセスのための 特殊機能が用意されている ( 物理ユニットのみ )。
data :
UW magic
MasterBoot mboot
magic = CH4toW('M','B','R','R') : マスターブートレコードの読み込み CH4toW('M','B','R','W') : マスターブートレコードの書き込み ( 読み込み処理で書き込む )
IDE ( ATA ) ディスクに対しては、区画情報の動的変更に対応するため、
常に 4 つの区画(サブユニット)が登録され、
空の区画に対してオープンした場合は、ER_NOMDA
のエラーとなる。
CD-ROM のときは、以下のように区画 ( サブユニット ) を固定的に割り当てる。 区画 2 と 3 は、存在しない場合もある。
区画 1 | CD-ROM 全体 ( 物理ユニットと同じ ) |
区画 2 | ブートレコード (2HD FD ブートイメージ) |
区画 3 | BTRON ボリューム区画 |
include/kernel/cdrom_b.h
参照)
CHS 情報は基本的に BIOS の設定と一致する情報を戻すようにしているため、 一般に CHS から計算した全体容量は、 本来のディスク全体の容量より小さくなる。
シリンダ(C) | 最大 1023 |
ヘッド(H) | 最大 255 |
セクタ(S) | 最大 63 |
CHS 情報は以下のように決定しており、できるだけ BIOS の設定と一致する ようにしているが、場合によっては一致しないこともある。
pC, pH, pS :
物理 CHS 情報)。
T = pC * pH * pS; C = pC; H = pH; S = pS; while (C > 1024) {C >>= 1; H <<= 1;} if (S > 63) S = 63; if (H > 255) H = 255; C = T / H / S; if (C > 1023) C = 1023;
S = 区画の終了セクタ; H = 区画の終了ヘッド + 1; C = T / H / S - 1;