**出處
《計算機原理》課本說,啟動時,主引導記錄會存入記憶體位址0x7c00。
這個奇怪的位址,是怎麼來的,課本就不解釋了。我一直有疑問,為什麼不存入記憶體的頭部、尾部、或者其他位置,而偏偏存入這個比 32kb 小1024位元組的地方?
昨天,我讀到一篇文章,終於解開了這個謎。
首先,如果你不知道,主引導記錄(master boot record,縮寫為mbr)是什麼,可以先讀《計算機是如何啟動的?》。
簡單說,計算機啟動是這樣乙個過程。
通電所以,主引導記錄就是引導"作業系統"進入記憶體的一段小程式,大小不超過1個扇區(512位元組)。讀取rom裡面的bios,用來檢查硬體
硬體檢查通過
bios根據指定的順序,檢查引導裝置的第乙個扇區(即主引導記錄),載入在記憶體位址 0x7c00主引導記錄把操作權交給作業系統
0x7c00這個位址來自intel的第一代個人電腦晶元8088,以後的cpu為了保持相容,一直使用這個位址。
2023年8月,ibm公司最早的個人電腦ibm pc 5150上市,就用了這個晶元。
當時,搭配的作業系統是86-dos。這個作業系統需要的記憶體最少是32kb。我們知道,記憶體位址從0x0000開始編號,32kb的記憶體就是0x0000~0x7fff
。
8088晶元本身需要占用0x0000~0x03ff
,用來儲存各種中斷處理程式的儲存位置。(主引導記錄本身就是中斷訊號int 19h的處理程式。)所以,記憶體只剩下0x0400~0x7fff
可以使用。
為了把盡量多的連續記憶體留給作業系統,主引導記錄就被放到了記憶體位址的尾部。由於乙個扇區是512位元組,主引導記錄本身也會產生資料,需要另外留出512位元組儲存。所以,它的預留位置就變成了:
0x7c00就是這樣來的。0x7fff
-512
-512+1
=0x7c00
計算機啟動後,32kb記憶體的使用情況如下。
(完)+-
----
----
----
----
----
0x0| interrupts vectors
+---
----
----
----
----
--0x400
| bios data area
+---
----
----
----
----
--0x5??
| os load area
+---
----
----
----
----
--0x7c00
| boot sector
+---
----
----
----
----
--0x7e00
| boot data/stack
+---
----
----
----
----
--0x7fff
|(not used)
+---
----
----
----
------(
...)
為什麼C語言訪問記憶體位址需要指標?
1 當記憶體收到這一串訊號時,電路中的某8個儲存單元就會響應,這8個儲存單元會記住代表 123 的開 on 或關 off 的電訊號。為什麼是8位呢?這是因為指令裡指定了 byte 如果將byte換成word,那麼123將會被解釋成乙個16位的數值。mov byte 678 1232 mov指令有乙個...
為什麼顯示卡在記憶體中的對映是0b8000H
視訊記憶體基位址雖然是人為確定的,但真要追究原因的話,還是可以找到一些原因的。首先,16位時代8086的定址範圍是0000 0000 ffff 000f,最早劃給ram的區域是640kb,範圍0000 0000 9fff 000f,這在第一代ibm x86 pc時代基本就定下來了。剩下的區域要划給b...
為什麼C語言中使用的位址是假的
在c語言中,指標變數的值就是乙個記憶體位址,運算子的作用也是取變數的記憶體位址,請看下面的 include include int a 1,b 255 int main 在 c free 5.0 下執行,結果為 pa 0x402000,b 0x402004 中的 a b 是全域性變數,它們的記憶體位...