2017-03-14 85 views
0

我正在開發一個簡約的操作系統。我創建了一個MBR,查看Master Partition Table中的活動分區。我面臨的問題是扇區加載到內存我可以更喜歡LBA在操作系統開發中使用CHS嗎?

對負載部門,我遇到了兩個方案,

  • CHS尋址
  • LBA尋址

我讀了CHS是幾乎所有的BIOS支持,但問題的關鍵在於它最多可以解決8GB這個事實,這個缺點已經被LBA解決了。

與那些雖這麼說,我想請教一些問題:

問題1:

什麼方案是最好的選擇呢?如果CHS,我有什麼辦法可以在8GB以上訪問?

問題2:

在LBA,我怎麼能夠加載從(比方說)分區4部門?

ie:如何才能找到第4個分區的起始塊號?


注:場景發生在16 bit real mode


謝謝。

OS:Ubuntu的

編譯器:CC

+0

但是這個問題至少與我提出的子問題是不同的。請回答這個問題。 –

+2

1.總之,忘記CHS。 2.要從分區4加載,您應該閱讀有關分區表並瞭解其工作原理。那麼你不會問這個問題。總而言之,你可以從MBR啓動分區4的LBA,以便能夠將分區中的相關扇區轉​​換爲絕對LBA,然後閱讀 –

+0

因此,我可以完全依賴LBA而不是CHS嗎? @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」來填充剩餘的比特嗎?將數據從分區表移動到磁盤地址數據包時,我是否應該考慮'endianess'? @rcgldr –

+1

將32位相對扇區存儲在qword塊編號的第一個(低位)dword中,並將qword塊編號的第二個(高位)dword中的值存儲爲零。這假定你正在使用一個普通的32位存儲,這將是小端。 – rcgldr

相關問題