但為什麼我們的程式經過記憶體空間最高端(0xffff***x~0xfffffff0)這一段reset code(冷啟動**),並跳轉到0x0000:7c00之後,卻能從記憶體位址640k~1m的一段空間裡看到諸如reset code等只有在bios rom空間裡才會存在的東東的蛛絲馬跡呢?理論上此時的640k~1m應該是ram空間啊?沒錯這一段現在的確是ram空間,但基於乙個這樣的事實,那就是一般rom的讀寫速度都比ram的讀寫速度慢,所以在執行bios rom中的冷啟動**時,該段**會將一些重要的與以前的bios rom相容的東西(如冷啟動**本身)拷貝到640k~1m的位址空間,以後要訪問這些內容時就直接到640k~1m的地方去拿,這同時還解決了乙個很重要的問題,那就是在實模式下預設是訪問不了1m以上的空間的,而bios rom又位於1m以上,那麼正好通過訪問640k~1m的bios rom副本達到訪問bios rom的目的,我們同時也可以看到,拷貝到640k~1m中來的原bios rom中的內容,也是與實模式緊密相關的內容(而那些與實模式關係不大的內容一般就不拷貝過來,也沒有地方容納得下),這個過程叫做bios位址對映,它不但達到了提高bios訪問速度的目的(因為實際上是訪問ram),又使ram的位址空間沒有被隔離開,同時還保持了與8086的相容性(因為8086預設保留640k~1m的空間給bios使用)。
但是現在又有乙個問題:通過什麼方法把處於接近4g實體地址處的bios中關於實模式的內容對映到實際實體地址640k~1m的地方?事情是這樣的:在剛加電或者reset時,cpu實際上處於一種特殊「保護模式」狀態。因此此時雖然 cs selector = 0xf000, 但是不能用實模式下的左移4位再加offset來確定實際位址。此時:cs base 就是 0xffff0000。而此時的eip就是cs段中偏移值。 而所有其他段暫存器(es,ds,es,fs,ss等)值都是0,基位址 base也為0。因此一開始除cs以外其他段暫存器都可以定址實體地址0--64kb範圍,而cs也只能定址64kb範圍,因為其段限長也是64kb。 因此可以看出,eprom中必定包含乙個使用大模式(這是我隨便起的名稱:))用來操作**和資料移動到低端(640kb-1mb)。即bios rom中應該有臨時在gdt中設定乙個長4gb大段的**。
宣告:以上主要參考
論壇的帖子;文章中很大一部分直接拷貝自herochen和redgrid(趙炯博士)的討論原文。
安裝啟動Sylix OS系統 X86
first grub引導啟動 開機長按delete bios介面 boot usb u盤啟動 showmount 命令檢視系統掛載硬碟情況,umount media hdd0 如果有硬碟,將硬碟解除安裝 ll dev blk 檢視 sylixos 識別的硬碟裝置名 fdsk f dev blk hd...
X86啟動過程分析
一直對計算機的啟動過程不甚清楚,總是一知半解。這幾天蒐集一些這方面的資料,通過學習對啟動過程有個更深入的了解。通常情況下,我們的系統裝在磁碟上。而cpu是不能夠直接訪問磁碟的,必須將磁碟上的內容讀入記憶體後才能被cpu訪問。那麼計算機是如何啟動並執行作業系統 的呢?這裡必定存在乙個將磁碟上的 載入到...
x86的啟動過程
1.上電,首先執行ljmp 0xf000,0xe05b 即位址0xffff0,調轉到bios,開始 執行bios bios負責pci,顯示卡之類裝置的初始化,並把可啟動裝置 軟盤,硬碟,光碟 的引導扇區boot loader 第乙個sector 拷貝到記憶體位址 0x7c00 0x7dff 之間,最...