現在、オープンソースコードを勉強してブートローダーを作成する方法、そして最終的にはOSを学習しようとしています。私が選択したプロジェクトはMikeOSです:http://mikeos.berlios.de/BIOS割り込みのヘッド、シリンダ(トラック)とセクタの計算13h
私はブートローダのコードを読んでいたが、私はコードは、ディスクからのルートディレクトリを読み取ろうと、BIOS INT 13h
通話用のヘッド/シリンダー/セクターを計算部分に捕まってしまいました。
私が正しく理解していれば、ルートディレクトリはセクタ19で始まります。(セクタ0:ブートレコード、セクタ1〜9:FAT12コピー1、セクタ10〜18:FAT12コピー2) (DL)、トラック0(CH)、セクタ2(CL)を対応するレジスタで取得します。このルーチンの出力は次のとおりです。Head 0、Track 1、Sector 19
ただし、 。
私は間違っているかもしれませんが、私はこれらの数字を取得するはずですか?私はコードを疑問に思っていません、それは作業コードなので。どうやら、私はパーティションテーブル、またはディスクアドレッシングに関するいくつかのコンセプトを見逃しています。
誰かが私が間違っている可能性があり、それを修正する方法を誰に見てもらえますか?
ルーチンは以下の通りである:(コメントは、設計者によって書かれている)の呼び出し前に
:
mov ax, 19 ; Root dir starts at logical sector 19
12hts: ; Calculate head, track and sector settings for int 13h
; IN: logical sector in AX, OUT: correct registers for int 13h
push bx
push ax
mov bx, ax ; Save logical sector
mov dx, 0
div word [SectorsPerTrack] ; First the sector
add dl, 01h ; Physical sectors start at 1
mov cl, dl ; Sectors belong in CL for int 13h
mov ax, bx
mov dx, 0 ; Now calculate the head
div word [SectorsPerTrack]
mov dx, 0
div word [Sides]
mov dh, dl ; Head/side
mov ch, al ; Track
pop ax
pop bx
mov dl, byte [bootdev] ; Set correct device
ret
bootdev db 0 ; Boot device number
SectorPerTrack dw 18 ; Sectors per track (36/cylinder)
Sides dw 2 ; Number of sides/heads
ありがとう。とても有難い。 – ElectroJunkie
私は重要な事実を見逃していたことが判明しました。ディスクが書き込まれたとき、私はデータが最初にヘッド0を満たし、ヘッド1に移動したと考えました。つまり、トラック1がヘッド0にあり、実際にヘッド1にあると思いました。私と同じ質問をしているか、それを理解していない人。 – ElectroJunkie
トラックはディスクの端から内側に向かって0から上に番号が付けられます。次に、ヘッド0(ディスクの上面)をヘッド1(ディスクの「反対側」)に変更し、トラックの数を0から再び開始します。上部トラック0(ヘッド0によって読み取られる)と下部トラック0(ヘッド1によって読み取られている)は、同じ*シリンダー*内にあるものを上に置きます。したがって、同じシリンダ内のすべてのトラックは同じ番号を持ちますが、ビルディング内のフロアとして「レイヤー」を作成します。 – SasQ