この章の目次にもどる
前頁:第4章 時計にもどる
次頁:第6章 KB / PDにすすむ

Chapter 5 System Disk

5.1 対象デバイス

5.2 固有機能

5.3 タスク起動パラメータ

なし
OS 核に組み込まれて内部的に起動される。

5.4 属性データ ( 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 :
事象通知用メッセージバッファ ID (RW)
data :
ID

事象通知用メッセージバッファID を設定、または取り出す。

DN_DISKINFO :
ディスク情報 (R)
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 :
ディスクフォーマット (W)
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 :
ディスク初期化 (W)
data :
DiskInit
typedef enum {
    DISKINIT = 1,
} DiskInit;

DISKINIT の書き込みにより、 指定したデバイスのリセットを行いデバイスを再登録する。 ディスクに区画が存在する場合は、区画情報を読み込み、 区画ごとにサブユニットとして登録する。 通常、 このコマンドはディスクの区画情報を変更した時に使用する。

このコマンドをサブユニットに対しては使用した場合は何もしない。

DN_DISKCMD :
ディスクコマンド (W)
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 :
ディスク領域先頭アドレス (R)
data :
VP

ディスクとして使用するメモリの先頭アドレス(論理アドレス)を取り出す。
このアドレスから、DiskInfo で得られるディスク容量 ( blocksize * blockcont バイト ) 分の連続した物理メモリー空間がディスクとして使用されるメモリである。
任意にアクセスできるのは、デバイスをオープン ( DC_OPEN ) しているときのみである。 デバイスをクローズ ( DC_CLOSE / DC_CLOSEALL ) した後にはアクセスしてはいけない。 また、一旦クローズし、再度オープンした場合には、 ディスク領域の先頭アドレスも再度取り出し、 そのアドレスを使用してアクセスしなければいけない。

メモリへの直接アクセスを許さないデバイスの時は、 ER_NOSPT のエラーとなる。

DN_DISKPARTINFO :
ディスク区画情報 (R)
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 :
ディスク CHS 情報 (R)
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 :
ディスク識別情報 (R)
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

5.5 属性データ ( CTLfd のみ)

CTLfd のデバイスでは以下の属性データをサポートする。

R 読み込みのみ可
W 書き込みのみ可
RW読み込み / 書き込み可
/* FD / HD 制御特殊デバイス属性データ番号 */
typedef enum {
    DN_FDCHKPERIOD  = -200,
    DN_FDCHKREQ     = -201,
    DN_FDSPEC       = -210,
    DN_HDSPEC       = -310
} CtlFdDataNo;
DN_FDCHKPERIOD :
FD 挿入チェック周期 (RW)
data :
W period

FD 挿入チェック周期を設定、または取り出す。

period > 0: period ミリ秒周期で FD の挿入チェックを行う
period <= 0: 周期的な FD の挿入チェックは行わない

DN_FDCHKREQ :
FD 挿入チェック要求 (W)
data :
W req

FD 挿入チェックを要求する。

req = 1: 1 回だけ FD 挿入チェックを行う
req = 2: FD が挿入されるまで FD 挿入チェックを行う
req = 0: req = 2 で指定した FD 挿入チェックをやめる
req < 0: FD を排出したものとする(強制排出要求)

DN_FDSPEC :
FD 仕様 (RW)
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 :
HD 仕様 (RW)
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 サポート

5.6 固有データ

CTLfd のデバイスでは固有データはサポートされない。
CTLfd 以外のデバイスでは以下の固有データをサポートする。

データ番号 ( 0 〜 ):ディスクのブロック番号
データ数 :読み込み / 書き込みのブロック数

物理デバイス ( ユニット ) の場合、 ブロック番号は物理的なブロック番号に一致するが、 論理デバイス ( サブユニット ) の場合、 ブロック番号はパーティション内の相対的なブロック番号 ( 0 〜 ) になる。

5.7 事象通知

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〜)

事象通知は物理ユニットに対してのみ行なわれ、 サブユニットに対しては行なわれない。

事象通知の応答速度はドライバ依存とする。

5.8 エラーコード

デバイスドライバ共通仕様を参照のこと。

I/O エラーの詳細コードは以下の通り。

クラス詳細コード
EC_IO0 アボートした
EC_IO1 割り込みタイムアウト
EC_IO2 メディアエラー
EC_IO3 ハードエラー
EC_IO0x10コマンドビジーエラー
EC_IO0x11データビジーエラー
EC_IO0x12ノットレディエラー
EC_IO0x8*FD 操作エラー
0x80ステータスエラー
0x81リキャリブレートエラー
0x82シークエラー
0x83シリンダ番号エラー
0x84アドレスマーク不在エラー
0x85データ不在エラー
0x86シリンダ不在エラー
0x87オーバーランエラー
0x88CRC エラー
EC_IO0x8***IDE(ATA) / ATAPI ディスク 操作エラー
ATA :
1000 0000 SSSS SSSS
S : エラー状態 = DF UNC MC IDNF MCR ABRT TK0 AMNF
ATAPI :
1QQQ KKKK CCCC CCCC
K
: Sense Key (SK) != 0
C
: Additional Sense Code (ASC)
Q
: Additional Sense Code Qualifier (ASCQ)

5.9 区画情報

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;

5.10 インプリメント依存事項 (PC/AT 版)

5.10.1 サポートしているデバイス

実際にサポートしているデバイスは、以下の通り。

IDE ( ATA ) ディスク、ATAPI CD-ROM、ATAPI ハードディスク :
以下の最大 4 個のうち、実装されているもの。
デバイス名物理的位置/接続
hdaIDE Primary - Master
hdbIDE Primary - Slave
hdcIDE Secondary - Master
hddIDE Secondary - Slave
PC カード :
以下の最大 2 個のうち、実装されているもの。
デバイス名物理的位置/接続
pcaPC カードスロット#1
pcbPC カードスロット#2
サポートしている PC カード :
ATA / SRAM カード: 汎用 (機種限定なし)
ATAPI CD-ROM : 以下の 2 機種のみ
Panasonic CD-ROM KXL-808AN
Sony VAIO 用 PCGA-CD5
ATAPI ハードディスクカード: 汎用
FD カード : 以下のみ
Toshiba Librette 用 FD ドライブ FDDPCCM1
FD :
最大 2 ドライブで、2 ドライブ未満の時は、PC カードの FD ドライブを 1 つサポートする。
デバイス名物理的位置/接続
ケース 1 ケース 2 ケース 3
fdaFD カード本体 #1 本体 #1
fdb - FD カード本体 #2
RAM ディスク :
DEVCONF ファイルに "RAMDISK" のエントリがあるときのみ、 mda がサポートされる。
ROM ディスク :
未サポート
USB ストレージデバイス :
最大 4 個まで、接続された順番に、uda 〜 udd のデバイス名を割り当てる。USB storage device class の仕様に準拠した、フロッピーディスク、CD-ROM、カードリーダ/ライタなどをサポートする。

5.10.2 DEVCONF ファイルの関連するエントリ

FdChkPeriod 周期 (msec)
CTLfdDN_FDCHKPERIOD の初期値となる。[デフォールト: 0]
FdSpec FD 仕様
CTLfdDN_FDSPEC の初期値となる。[デフォールト: 0]
HdSpec HD 仕様
CTLfdDN_HDSPEC の初期値となる。[デフォールト: 0]
DiskChkPeriod 周期 (msec)
FD 以外のイジェクト可能ディスク ( CD-ROM も含む ) のチェック周期
[デフォールト: 3000]
RAMDISK バイトサイズ
RAM ディスク ( mda ) の指定。
バイトサイズが 0 または なしのときは、空の RAM ディスクとなる。
[デフォールト: RAM ディスクなし]

5.10.3 マスターブートレコードのアクセス機能

IDE ( ATA ) ディスクに対しては、マスターブートレコードのアクセスのための 特殊機能が用意されている ( 物理ユニットのみ )。

属性レコード番号: -999999 (R)
data :
UW magic
MasterBoot mboot
magic = CH4toW('M','B','R','R') : マスターブートレコードの読み込み
        CH4toW('M','B','R','W') : マスターブートレコードの書き込み
                                ( 読み込み処理で書き込む )

5.10.4 区画(サブユニット)に関して

IDE ( ATA ) ディスクに対しては、区画情報の動的変更に対応するため、 常に 4 つの区画(サブユニット)が登録され、 空の区画に対してオープンした場合は、ER_NOMDA のエラーとなる。

CD-ROM のときは、以下のように区画 ( サブユニット ) を固定的に割り当てる。 区画 2 と 3 は、存在しない場合もある。

区画 1CD-ROM 全体 ( 物理ユニットと同じ )
区画 2ブートレコード (2HD FD ブートイメージ)
区画 3BTRON ボリューム区画

5.10.5 CHS 情報に関して

CHS 情報は基本的に BIOS の設定と一致する情報を戻すようにしているため、 一般に CHS から計算した全体容量は、 本来のディスク全体の容量より小さくなる。

シリンダ(C)最大 1023
ヘッド(H) 最大 255
セクタ(S) 最大 63

CHS 情報は以下のように決定しており、できるだけ BIOS の設定と一致する ようにしているが、場合によっては一致しないこともある。

  1. 物理 CHS 情報から、上記制限に入るような CHS 情報を以下の 方式で計算する ( 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;
    
  2. 区画が設定済みのときは、区画情報から CHS 情報を計算する。
    S = 区画の終了セクタ;
    H = 区画の終了ヘッド + 1;
    C = T / H / S - 1;
    
  3. BIOS で設定している CHS 情報のうち、H, S が一致し、C が -4 〜 +1 の範囲に入っていれば、BIOS 設定の C を適用する。

この章の目次にもどる
前頁:第4章 時計にもどる
次頁:第6章 KB / PDにすすむ