2012-01-12 20 views
3

現在、オープンソースコードを勉強してブートローダーを作成する方法、そして最終的には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 

答えて

0

簡単な答えはということです論理セクタ19は20番目のセクタです(番号付けは0から始まります) )。 を1トラックあたり18セクタで割った結果、残りの2になります。セクタ番号は1から始まり、セクタ番号は2です。フロッピーディスクに物理ディスクが1つしかないため、2つのサイドヘッド0とヘッド1があります。セクタはシリンダ0(ナンバリングは0から始まる)であり、第2のサイドはヘッド1(ナンバリングは0から始まる)である。 ヘッド1(DL)、シリンダ0(CH)、セクター2(CL)

幸せな答えがMikeOSの最新バージョンが起動し、USBフラッシュドライブから実行するということです。フロッピーディスクにお別れを言いなさい(見つけられれば)。

+0

ありがとう。とても有難い。 – ElectroJunkie

+1

私は重要な事実を見逃していたことが判明しました。ディスクが書き込まれたとき、私はデータが最初にヘッド0を満たし、ヘッド1に移動したと考えました。つまり、トラック1がヘッド0にあり、実際にヘッド1にあると思いました。私と同じ質問をしているか、それを理解していない人。 – ElectroJunkie

+0

トラックはディスクの端から内側に向​​かって0から上に番号が付けられます。次に、ヘッド0(ディスクの上面)をヘッド1(ディスクの「反対側」)に変更し、トラックの数を0から再び開始します。上部トラック0(ヘッド0によって読み取られる)と下部トラック0(ヘッド1によって読み取られている)は、同じ*シリンダー*内にあるものを上に置きます。したがって、同じシリンダ内のすべてのトラックは同じ番号を持ちますが、ビルディング内のフロアとして「レイヤー」を作成します。 – SasQ

0

CHSのものはフロッピー専用です。今日では、HDDまたはUSBデバイスを使用しており、ドライブはFAT32でフォーマットされている可能性が高いです。

C = LBA÷(SPT×HPC)

H =(LBA÷SPT)MOD:

その時点で

、あなたのINT 13hの値を計算するためにLBAを使用する必要がありますHPC

S =(LBA MOD SPT)+例えば1

、セクタ2048(第1パーティションが最も可能性が高いであろう場合、例えばQEMU-IMGを使用する)であろうCX = 0x0221(C = 2 、S = 21、H = 0)

悲しいことに、これを理解するにはちょっと時間がかかりました。私はCHSの計算をしていましたが、私は間違った値を得ていました...

関連する問題