2013-10-08 78 views
1

我試圖實現簡單的操作系統,現在必須實現內存管理。爲什麼我的內存檢查代碼不能正常工作

首先,我們輸入簡單的代碼來檢查內存大小如下。

我遇到的問題是這個函數的結果取決於增量大小。

如果我將增量​​設置爲1024,則此函數返回640Kb。
但是,如果我將增量​​設置爲1024 * 1024,則此函數返回120Mb。
(我的系統(bochs)的內存設置爲120MB。)

我檢查了優化選項和A20門。

任何知道爲什麼我的功能無法正常工作的人?

unsigned int memtest_sub(unsigned int start, unsigned int end) 
{ 
    unsigned int i; 
    unsigned int* ptr; 
    unsigned int orgValue; 
    const unsigned int testValue = 0xbfbfbfbf; 

    for (i = start; i <= end; i += 1024*1024) { 
     ptr = (unsigned int*) i; 
     orgValue = *ptr; 
     *ptr = testValue; 
     if (*ptr != testValue) { 
      break; 
     } 
     *ptr = orgValue; 
    } 
    return i; 
} 
+2

不要探測內存。在實模式下使用BIOS(因爲它看起來像你在x86上)以獲得內存佈局。見int 15h。 – Macmade

回答

1

下列賦值車:

ptr = (unsigned int*) i; 
    orgValue = *ptr; 
    *ptr = testValue; 

ptr不指向任何有效的存儲,你不能把i的值作爲地址,在這裏你可以進行一些讀寫操作 - 未定義行爲

+1

請注意,作爲內核,您可以在任何內存位置讀取/寫入,特別是禁用中斷時。 – Macmade

+0

@Macmade嗯興趣!我明白,但給我一些鏈接在這.. –

+0

@Macmade雖然技術上是真實的(即使訪問一些內存將只是NMI你死亡中斷啓用或禁用),這是一個可怕的想法,因爲硬件登錄到處。 – Art

5

你不能做那樣的探針。

首先,內存不一定像您已經發現的那樣連續。它幾乎從來沒有。 640k的漏洞是出於傳統原因,但通常情況下,內存中的進一步分裂。你必須問你的固件的內存佈局。

其次,一些內存條可能會雙重映射到物理空間,如果您開始使用它們,最終會遇到麻煩。這不是很常見,但處理它是一個真正的痛苦。

第三,也許最重要的是,有設備映射到該空間。通過寫入隨機地址,您可能會寫入重要硬件的寄存器。回寫你所讀的內容對你來說不會有好處,因爲一旦你寫入硬件寄存器就會有副作用。事實上,一些硬件寄存器在讀取時會產生副作用。某些硬件未必受到保護,您可能會造成永久性損壞。由於EEPROM /閃存是未受保護的,因此在1:1映射內核中存在指針錯誤,因此我過去已經制造了以太網硬件。您寫入的其他位置實際上可能會更改內存本身的佈局。

既然你是最有可能在i386閱讀:http://wiki.osdev.org/Detecting_Memory_(x86)

此外,考慮使用檢測內存爲你傳達,你需要一個定義良好的API中瞭解其他重要信息的引導裝載程序。對於所有奇怪的硬件變體,引導加載程序更好地進行調試。

+0

謝謝你的回覆。這對我非常有幫助。一直以來,我覺得需要更多的研究。 ^^〜! – joejo

+0

@joejo只要不斷學習。這是一個無盡的領域,尤其是因爲硬件製造商會以比您可以全面瞭解的方式更快地製造新奇怪的設計和錯誤。操作系統是迄今爲止最令人滿意的軟件。 – Art

相關問題