INT 13hは、 x86ベース (IBM PC 系) のコンピュータ システムの20 番目の割り込みベクターであるBIOS 割り込み呼び出し13 hexの省略形です。BIOSは通常、このベクターにリアル モード割り込みハンドラーを設定し、シリンダー ヘッド セクター(CHS) アドレス指定を使用してセクター ベースのハード ディスクおよびフロッピー ディスクの読み取りおよび書き込みサービスを提供します。最新の PC BIOS には、1992 年に IBM と Microsoft によって考案された INT 13h 拡張機能も含まれており、64 ビットLBAアドレス指定を使用して同じディスク アクセス サービスを提供します。これらは、わずかな追加を経て、Phoenix Technologies などによって EDD ( Enhanced Disk Drive ) BIOS 拡張機能として準標準化されました。
INT はソフトウェア割り込みをトリガーするx86命令であり、13 hex は呼び出される 割り込み番号 ( 16 進数値) です。
最近のコンピュータには、BIOS INT 13h とUEFI機能の両方が搭載されており、同じサービスやそれ以上のサービスを提供します。ただし、UEFI クラス 3 はCSM を完全に削除しているため、INT 13h やその他の割り込みがありません。通常、UEFI ドライバーは CHS アドレス指定ではなくLBAアドレス指定を使用します。
概要
DOSなどのリアルモードオペレーティング システムでは、 INT 13h を呼び出すと、コンピュータの ROM-BIOS コードにジャンプして低レベル ディスク サービスが実行され、プログラムに対して物理セクター ベースのディスク読み取りまたは書き込み操作が実行されます。 DOS では、これはハード ディスクとフロッピー ディスクの組み込みブロック デバイス ドライバーの低レベル インターフェイスとして機能します。 これにより、 INT 25h と INT 26h は、DOS カーネルのFATファイル システムドライバーに論理セクターの絶対ディスク読み取り/書き込み機能を提供できます。これにより、 DOS API ( INT 21h ) 関数を通じてファイル関連の要求が処理されます。
Microsoft Windows NT派生製品 (NT4、2000、XP、Server 2003 など) やdosemuを使用するLinuxなどの保護モードのオペレーティング システムでは、OS が呼び出しをインターセプトし、それをオペレーティング システムのネイティブ ディスク I/O メカニズムに渡します。Windows 9xおよびWindows for Workgroups 3.11も、 32 ビット ディスク アクセスを使用する場合は BIOS ルーチンをバイパスします。低レベルのディスク アクセスを実行するほかに、INT 13h 呼び出しと関連する BIOS データ構造は、システムに接続されているディスク (またはその他のDASDデバイス)の種類と容量に関する情報も提供します。保護モードの OS が起動すると、BIOS からのその情報を使用してディスク ハードウェアを列挙し、OS が適切なディスク I/O ドライバーをロードして構成できるようにします。
オリジナルの BIOS リアルモード INT 13h インターフェイスは、一般に物理 CHS アドレス指定と呼ばれるものを使用して、最大約 8 GB のサイズのドライブをサポートします。この制限は、IBM PC/XTディスク ハードウェアのハードウェア インターフェイスに由来します。BIOS は、INT 13h 呼び出しで指定されたシリンダ ヘッド セクター(CHS) アドレスを使用し、それをハードウェア インターフェイスに直接転送しました。約 504 MB というより小さい制限は、BIOS で使用される CHS アドレス指定制限と ATA ハード ディスクで使用される CHS アドレス指定制限 (これらは異なります) の組み合わせによって課せられました。BIOS と ATA の両方の CHS アドレス指定制限を組み合わせると (つまり、同時に適用すると)、アドレス指定できる 512 バイト セクターの数は合計で約 504 MB になります。
504 MB の制限は、 CHS 変換を使用して克服されました。これは、BIOS が INT 13h インターフェイスで架空の CHS ジオメトリをシミュレートする一方で、ネイティブの論理 CHS ジオメトリを使用して ATA ドライブと通信する手法です。(504 MB の壁に近づいた頃には、ATA ディスクは、外部 ATA インターフェイスで実際の物理ジオメトリ パラメータを表示しなくなっていました。) 変換により、依然として CHS アドレス指定を使用している BIOS は、最大 8064 MB (BIOS CHS インターフェイスのみのネイティブ容量) の ATA ディスクを効果的にアドレス指定できます。(ATA インターフェイスのネイティブ CHS アドレス指定容量ははるかに大きいため、BIOS と ATA の CHS 制限の「干渉」がアドレス指定によって解決されると、BIOS のより小さな制限のみが重要になります。) CHS 変換は論理 CHS アドレス指定と呼ばれることもありますが、これは実際には誤った名称です。この BIOS 開発の時点では、ATA CHS アドレスは既に物理ではなく論理的だったためです。 8064 MBの制限は、INT 13hインターフェースで使用されるレジスタ値ベースの呼び出し規約と、後方互換性を維持するという目標の組み合わせから生じています。つまり、INT 13hに渡されるCHSアドレスの形式またはサイズを変更して、フィールドの1つ(たとえばシリンダ番号フィールド)にビットを追加することはできません。この制限では、1024シリンダ、256ヘッド、63セクター、512バイトブロックが使用され、正確に7.875 GiBのアドレス指定が可能になります(1024 × 256 × 63 × 512 バイト)。このインターフェイスの互換性のないバージョンを提供する BIOS が一時的にいくつかありました。たとえば、AWARD AT BIOS と AMI 386sx BIOS は、シリンダ番号のビット 10 と 11 をレジスタ DH のビット 6 と 7 に配置することで、最大 4096 シリンダを処理できるように拡張されました。
MS-DOSのすべてのバージョン(MS-DOS 7とWindows 95を含む)には、256ヘッド(レジスタ値0xFF)のディスクドライブを起動できないバグがあるため、多くの最近のBIOSは最大255(0xFE)のヘッドでCHS変換マッピングを提供しており、[1] [2] 、アドレス指定可能な合計空間がちょうど8032.5 MiB(約7.844 GiB)に減少しています。[3]
さらに大容量のディスクのアドレス指定をサポートするために、 INT 13h 拡張と呼ばれるインターフェースがIBM と Microsoft によって導入され、その後Phoenix TechnologiesによってBIOS 拡張ディスク ドライブ サービス(EDD)の一部として再公開され、若干拡張されました。 [4] [5]このインターフェースは、INT 13h サービス内で、64 ビットの論理ブロック アドレス指定(LBA) を使用する新しい関数を定義します。これにより、最大 8 ZiBのアドレス指定が可能になります。(ATA ドライブは、512 バイトのセクター/ブロック サイズを想定すると、それぞれ最大 128 GiBまたは 128 PiBを可能にする 28 ビットまたは 48 ビットの LBA もサポートできます)。これは、元の INT 13h インターフェースのレジスタ ベースの呼び出し規則ではなく、情報パケットへのポインタを使用するため、「パケット」インターフェースと呼ばれます。このパケットは、インターフェース バージョン、データ サイズ、および LBA を含む非常に単純なデータ構造です。ソフトウェアの下位互換性のために、拡張機能は元の CHS 関数と並行して実装されており、同じドライブであっても両方のセットからの関数の呼び出しを混在させることができます。ただし、CHS 関数はディスクの最初の 8064 MB を超えてアクセスできないという注意点があります。
一部のキャッシュドライバは、アプリケーションから直接INT 13hを発行することでDOSがバイパスされたことを検出すると、バッファをフラッシュします。INT 13hを介したダミー読み取りは、未知のキャッシュ(再起動前など)のキャッシュフラッシュを強制するいくつかの方法の1つとして使用できます。[1] [2]
1990年から1991年頃のAMI BIOSは、ワード非整列バッファを破棄します。一部のDOSおよび常駐プログラムは割り込み有効化とレジスタを破壊してしまうため、PC DOSおよびMS-DOSはこれを防ぐために独自のフィルタをインストールします。[6]
リスト13時間前サービス
2 番目の列が空の場合、この機能はフロッピー ディスクとハード ディスクの両方に使用できます。
- FD: フロッピーディスクのみ。
- HD: ハードディスクのみ。
- PS/2: PS/2 システム上のハードディスクのみ。
- EXT: 8 GBを超えるハード ドライブをサポートするために 1990 年代に作成されたINT 13h拡張の一部です。
INT 13h AH=00h: ディスクシステムをリセット
INT 13h AH=01h: 最後のドライブ操作のステータスを取得
フロッピードライブの場合はビット 7=0、固定ドライブの場合はビット 7=1
INT 13h AH=02h: ドライブからセクターを読み取る
備考
レジスタ CX には、シリンダ番号 (10ビット、可能な値は 0 ~ 1023) とセクター番号 (6 ビット、可能な値は 1 ~ 63) の両方が含まれます。シリンダ ビットとセクター ビットは以下のように番号が付けられます。
CX = ---CH--- ---CL--- シリンダー:76543210 98 セクター: 543210
翻訳例:
CX := ( (シリンダおよび255 ) shl 8 )または( (シリンダおよび768 ) shr 2 )またはセクター;シリンダ:= ( ( CXおよび$FF00 ) shr 8 )または( ( CXおよび$C0 ) shl 2 )セクター:= CXおよび63 ;
バッファのアドレス指定では、バッファ全体が指定されたセグメント内にあることを保証する必要があります。そう( BX + size_of_buffer ) <= 10000hでない場合、一部の BIOS またはハードウェア バージョンでは割り込みが失敗する可能性があります。
例
16 セクター (= 2000hバイト)を読み取りたいとします。バッファはメモリ アドレス 4FF00h から開始します。メモリ セグメンテーションを利用すると、レジスタ値を計算するさまざまな方法があります。例:
ES = セグメント = 4F00h BX = オフセット = 0F00h 合計 = メモリアドレス = 4FF00h 0F00h + 2000h = 2F00h <= 10000hなので、これは良い選択です。 ES = セグメント = 4000h BX = オフセット = FF00h 合計 = メモリアドレス = 4FF00hFF00h + 2000h = 11F00h > 10000hなので、良い選択では ない でしょう。
割り込み 13h の機能 02h は、ハード ドライブの最初の 16,450,560 セクターのセクターのみを読み取ることができます。8 GB の制限を超えるセクターを読み取るには、INT 13h拡張の機能 42h を使用する必要があります。別の代替手段としては、パーティション 内のセクターを読み取る DOS 割り込み 25h があります 。
コード例
[ ORG 7c00h ] ; コードは 7c00h から始まりますxor ax , ax ; ds が 0 に設定されていることを確認しますmov ds , ax cld ; 値の入力を開始します: mov ah , 2h ; int13h 関数 2 mov al , 63 ; 63 セクターを読み取りますmov ch , 0 ; シリンダー番号 0 からmov cl , 2 ; セクター番号 2 - 2 番目のセクター (0 ではなく 1 から開始) mov dh , 0 ; ヘッド番号 0 xor bx , bx mov es , bx ; es は 0 である必要がありますmov bx , 7e00h ; 起点アドレス 7c00h から 512 バイトint 13h jmp 7e00h ; 次のセクターにジャンプします;このセクターを埋めて起動可能にするには、510 - ( $ - $$ ) db 0 dw 0AA55h を掛けます。
このコード セクション (asm ファイルはここから始まる必要があります) の後にコードを記述すると、メモリにロードされて実行されます。
dl (ドライブ) を変更していないことに注意してください。これは、コンピューターが最初に起動したときに、dl が起動したドライブの番号に設定されるためです。したがって、起動したドライブから読み取りたい場合、dl を変更する必要はありません。
INT 13h AH=03h: ドライブにセクターを書き込む
INT 13h AH=04h: ドライブからセクターを検証
INT 13h AH=05h: トラックのフォーマット
INT 13h AH=06h: トラックをフォーマットし、不良セクタフラグを設定する
INT 13h AH=07h: トラックからドライブをフォーマット
INT 13h AH=08h: ドライブパラメータの読み取り
備考
- 機能 08h の論理値は、機能 48h の物理 CHS 値と異なる場合があります。
- 結果レジスタ CX にはシリンダとセクター/トラックの両方の値が含まれます。機能 02h の注釈を参照してください。
INT 13h AH=09h: ドライブペア特性の初期化
13時間前AH=0Ah: ドライブから長いセクターを読み取る
この関数と関数 02h (上記参照) の唯一の違いは、関数 0Ah はセクターあたり 512 バイトではなく 516 バイトを読み取ることです。最後の 4 バイトには、セクター データのチェックサムであるエラー訂正コード (ECC) が含まれます。
INT 13h AH=41h: 拡張機能の有無を確認
INT 13h AH=42h: ドライブからの拡張読み取りセクター
int 13h AH=02hで既に述べたように、完全なバッファが指定されたセグメント内にあることを確認する必要があります。つまり、(BX + size_of_buffer) <= 10000hです。
INT 13h AH=43h: ドライブへの拡張書き込みセクター
INT 13h AH=48h: 拡張読み取りドライブパラメータ
述べる
機能 48h の物理 CHS 値は、機能 08h の論理値と異なる場合があります。
INT 13h AH=4Bh: ドライブエミュレーションタイプを取得
参照
- 10時間
- BIOS割り込み呼び出し
- シリンダーヘッドセクター
- INT (x86 命令)
- DPMI (DOS 保護モード インターフェース)
- ラルフ・ブラウンの割り込みリスト
- BIOS 拡張ディスクドライブ仕様
参考文献
- ^ ab Brown, Ralf D. (2000-07-16). 「Ralf Browns Interrupt List (v61 html)」。2016年11月3日閲覧。
- ^ ab Brown, Ralf D. (2000-07-16). 「x86 割り込みリスト (v61 オリジナル テキスト) アーカイブ: "inter61a.zip"、サブファイル: "INTERRUP.B"、見出し: "B-1302" (INT13, 02 Read)、注記」 。2016年 11 月 3 日閲覧。
- ^ ディスク サイズの制限、8.4 GB の制限 (およびその他)
- ^ Stevens, Curtis (1995-01-26). 「Enhanced Disk Drive Specific 1.1 -DRAFT- Phoenix Technologies、3.0 BIOS Extensions を参照 (登録が必要)」(PDF) 。2016-11-03に取得。
- ^ Landis, Hale (1995-02-11). 「BIOS タイプ、CHS 変換、LBA およびその他の便利な情報については、BIOS タイプ 6 Phoenix 拡張ディスク ドライブ仕様を参照してください。(登録が必要)」(PDF) 。2016 年 11 月 3 日閲覧。
- ^ ctyme.com - Ralf Browns 割り込みリスト、インデックス付き html、ディスク - セクターをメモリに読み込む
- ^ abcdef ctyme.com - ディスク - ドライブパラメータの取得 (PC、XT286、CONV、PS、ESDI、SCSI)
- ^ ctyme.com - IBM/MS INT 13 拡張機能 - インストール チェック
- ^ - 拡張モードの LBA
外部リンク
- BIOS 割り込み 13h 拡張は 2006-02-06 にWayback Machineにアーカイブされました
- ラルフ・ブラウンの包括的な割り込みリスト
- int 13h, ah = 00h .. 1ah に関する Norton ガイド 2008-06-27 にWayback Machineでアーカイブ
