2017-03-14 5 views
0

私は最小限のオペレーティングシステムを開発しています。アクティブなパーティションのためにMaster Partition TableにあるMBRを作成しました。私が直面している問題は、のセクタのロードであるです。積載部門に関してはオペレーティングシステム開発でLBAからCHSへのアドレッシングを優先することはできますか?

は、私はCHSは、ほぼすべてのBIOSでサポートされていることを読みますが、問題がである2つのスキーム、

に対処

  • LBAに対処

    • CHSに出くわしましたそれが最大で8GBに対処できるという事実とこの欠点はLBAで修正されます。言われているものと

      、私はいくつかの質問をしたいと思います:

      質問1:

      何スキームを選択するのが最善でしょうか? CHSの場合、私が8GBマークを超えてアクセスできる方法はありますか?

      質問2:LBAで

      、どのように私は、パーティション4(例えば)からのセクターを読み込むことができるのだろうか?

      ie: 4番目のパーティションの開始ブロック番号をどのように見つけることができますか?


      注:シナリオが16 bit real modeで起こります。


      ありがとうございます。

      OS:Ubuntuの

      コンパイラ:CC

  • +0

    しかし、この質問は少なくとも私が尋ねたサブ質問とは異なります。親切に質問に答えてください。 –

    +2

    1.要するに、CHSを忘れてしまいます。 2.パーティション4からロードするには、パーティションテーブルについて読み、それがどのように機能するかを理解する必要があります。それからあなたはこの質問をしません。つまり、パーティションの相対セクタを絶対LBAに変換できるように、MBRからパーティション4のLBAを開始してから、 –

    +0

    を読み込みます。CHAではなくLBAを完全に信頼できますか? @Alexander Zhak –

    答えて

    2

    使用BIOSが読み出さ拡張機能、64ビットLBAを使用(SATAドライブは、LBAの下位48ビットを使用します)。

    INT 13 - IBM/MS INT 13 Extensions - EXTENDED READ 
         AH = 42h 
         DL = drive number 
         DS:SI -> disk address packet 
    Return: CF clear if successful 
          AH = 00h 
         CF set on error 
          AH = error code 
          disk address packet's block count field set to number of blocks 
          successfully transferred 
    
    Format of disk address packet: 
    Offset Size  Description 
    00h BYTE  10h (size of packet) 
    01h BYTE  reserved (0) 
    02h WORD  number of blocks to transfer 
    04h DWORD -> transfer buffer 
    08h QWORD starting absolute block number (LBA) 
    

    質問にはMBRが記載されています。通常、ハードドライブの最初のセクタは、パーティションのテーブル(通常は4つ)とアクティブなパーティションのテーブルを含むパーティションセクタです。パーティションブートコードは通常、自身を再配置し(Microsoftは00000h:00600hに再配置します)、アクティブパーティションからMBRを00000h:07c00hに読み込んだ後、MBRコードにジャンプします。

    +0

    開始絶対ブロックアドレスは、64ビット長のQWORDです。この価値をどこから得るのですか? MBRパーティションテーブルは、パーティションの開始セクタと同じであるが32ビット長の相対セクタフィールドを有する。だから、残りのビットを '0'で埋めるべきですか?また、パーティションテーブルからディスクアドレスパケットにデータを移動する際に、「エンディアン」を考慮する必要がありますか? @rcgldr –

    +1

    qwordブロック番号の最初(下位)のdwordに32ビットの相対セクタを格納し、qwordブロック番号の2番目(上位)のdwordに0を格納します。これは、リトルエンディアンになる通常の32ビットストアを使用していることを前提としています。 – rcgldr

    関連する問題