注,該博客采用8086CPU作為詳述,和別的可以類比,大部分都是相同的。
一台計算機的大概結構:

最底層是CPU,中間層是操作系統,最上面的就是應用程序了。比如:CPU采用intel的,然后操作系統采用Windows,然后應用程序我使用QQ。就是這樣的一個大概的邏輯結構。
所以這里的CPU的流程和計算機的流程其實是一樣的,因為計算機的核心就是CPU。也就是計算機的啟動過程≈CPU的啟動過程。
預先知識:
計算機的加電和復位
電子計算機也就是我們平常用的普通計算機。都是得通電后才可以使用的。
當CPU通電啟動后,CPU會執行一個硬件初始化和內部的一個自測試來檢測是否有問題,然后再把寄存器賦值到一個預先定好的狀態。
而復位就和CPU加電啟動的功能是一樣的。

對於8086CPU來說,進行硬件初始化,會把所有的CPU置為0,除了代碼段寄存器CS會置為FFFF。注,這里只針對8086CPU
CPU的主要功能就是拿來取指令和執行指令,再加點或者復位后就會立刻去執行工作。
而8086只有實模式這一個CPU運行模式,所以它會自動去取CS:IP地址的指令。也就是位於FFFF:0000(FFFF0)地址的指令。

8086CPU地址分配情況

在計算機中8086CPU可以訪問00000~FFFFF的內存地址空間,但是並不意味着這段內存就是一個整體了。
事實上這塊00000~FFFFF的地址范圍會被地址分配電路分配到三個部分里面去:

這三個部分分別是:
DRAM
00000~9FFFF對於的可讀寫內存,也就是平常我們常說的內存條。

內存由字節組成(通常的內存單位就是一個字節,也就是八位),而字節又由比特(bit組成)。為了節約成本,並提高容量和集成度,在內存中,每個比特的存儲都靠一個極其微小的晶體管和一個同樣極其微小的電容來完成的。電容可以充放電,可以通過充電和放電來表示比特的1和0但是這么微小的電容它的泄漏電荷的速度當然也非常快。所以,個人計算機中使用的內存需要定期補充電荷,這稱為刷新在刷新期間肯定就是不能訪問的,但是沒關系刷新的時間非常短,完全可以錯開。
這種存儲器又叫動態隨機訪問存儲器(Dynamic Random Access Memory,DRAM),所謂的動態隨機訪問的意思就是訪問任何一個地址所花費的時間一樣。
由於這個存儲器的構成原理,所以它斷電關機后內容就沒了。所以開機后是不能直接讀取里面的內容的,因為里面啥也沒有。
外部設備接口電路或接口卡
A0000-EFFFF 這一段地址空間來自於外部設備接口電路或接口卡。比如聲卡,網卡和顯卡。
計算機可以連接各種設備,但是設備是不能直接接入的,它們需要通過各自的接口電路或者接口卡才行。
比如顯卡:

左邊這個是電腦主板,中間這個是顯卡,右邊這個是顯示器。
顯卡通過電纜連接顯示器,給顯示器發送視頻信號,另外顯卡還需要插在計算機的主板上才行,都連接好了就行了。
顯卡上也有存儲器,CPU可以把要顯示的文本內容寫入顯卡上的存儲器然后顯卡將其轉化為視頻信號傳輸給顯示器,然后顯示器就可以顯示文本了。
ROM BIOS
F0000~FFFFF 這一段地址訪問的是一個特殊的存儲芯片叫做ROM BIOS。

這種存儲器只能用來讀取不能寫入,叫做只讀存儲器(Read Only Memory,ROM)簡稱為ROM。
和DRAM內存條不同,ROM的內容是不會刷新的,內部已經寫好了。
所以整體的8086地址分配情況其實是這樣:

所以8086在FFFF0地址得到的第一條指令,其實是在ROM BIOS里面的。
這個ROM BIOS里面就固化了開機指令通常是一個跳轉指令,它通過改變CS 和IP的內容,使處理器從ROM 中的較低地址處開始 取指令執行。
這塊ROM 芯片中的內容包括很多部分,主要是進行硬件的診斷、檢測和初始化。
它還負責提供一套軟件例程,讓人們在不必了解硬件細節的情況下從外圍設備(比如鍵盤)獲取輸入數據,或者向外圍設備(比如 顯示器)輸出數據。
這塊ROM 芯片只針對那些最基本的、對於使用計算機而言最重要的設備,而它所提供的軟件例程,也只包含最基本、最常規的功能。正因為如此,這塊芯片又叫基本輸入輸出系統(Base Input & Output System,BIOS)ROM
ROM-BIOS 的容量是有限的,當它完成自己的使命后,最后所要做的,就是從輔助存儲設備讀取指令數據,然后轉到那里開始執行。
輔助存儲設備
歷史上,有多種輔助存儲設備,比如軟盤、光盤、硬盤、U 盤等, 相對於內存,它們就是人們常說的“外存”,即外存儲器(設備)。
CPU從內存中讀取指令和操作數,外部存儲設備是內存的后部存儲設備,外部存儲設備的內容只有加載到內存之后才能通過cpu來訪問。

HDD是傳統的機電式硬盤(Hard Disk Drive),是機械和電子技術的混合體。
SSD是最近興起的集成電路硬盤也叫固態硬盤(Solid State Drive),是純粹的集成電路硬盤存儲速度很快。
HDD硬盤:

硬盤 是多盤片、密封、高轉速的,采用鋁合金作為基片,並在表面塗上磁性 物質來記錄二進制位。這就使得它的盤片具有較高的硬度,故稱為硬 盤。
硬盤的內部構造:

硬盤可以只 有一個盤 片(這稱為單碟),也可能有好幾個盤片。但無論如何, 它們都串在同一個軸上,由電動機帶動着一 起高速旋轉。一般來說,轉速可以達到每分鍾3600 轉或者7200轉,有的 能達到一萬多轉,這個參數就是我們常說的“轉/分鍾”(Round Per Minute,RPM)。
每個盤片都有兩個磁頭(Head),上面一個,下面一個,所以經常用磁頭來指代盤面。磁頭都有編號,第1 個盤片,上面的磁頭編號為0, 下面的磁頭編號為1;第2 個盤片,上面的磁頭編號為2,下面的磁頭編 號為3,以此類推。
每個磁頭不是單獨移動的。相反,它們都通過磁頭臂固定在同一個 支架上,由步進電動機帶動着一起在盤片的中心和邊緣之間來回移動。 也就是說,它們是同進退的。步進電動機由脈沖驅動,每次可以旋轉一 個固定的角度,即可以步進一次。就好比旋轉木馬,必須通過中間那個啟動來一起移動。
當盤片高速旋轉時,磁頭每步進一次,都會從它所在的位置開始,繞着圓心“畫”出一個看不見的圓圈,這就是磁道(Track):

磁道是數據記錄的軌跡。因為所有磁頭都是聯動的(參考前面那個旋轉木馬),故每個盤面上的同 一條磁道又可以形成一個虛擬的圓柱,稱為柱面(Cylinder)。

磁道,或者柱面,也要編號。編號是從盤面最外面的那條磁道開始,向着圓心的方向,從0開始編號。
為了加速數據在硬盤上的讀寫,最好的辦法就是盡量不移動磁頭。當0 面的磁道不足以容納要寫入的數據時,應當把剩余的部分寫在1 面的同一磁道上。如果還寫不下,那就繼續把剩余的部分寫在2 面 的同一磁道上,以此類推。換句話說,在硬盤上,數據的訪問是以柱面來組織的。也就是豎着記錄的,這里的面就是柱面的意思,一層一層的像千層餅一樣。
前面的描述就是相當於一個柱子然后分好幾層,並且是豎着分和通過圓面來分是由上至下,由外之內來區分和讀取,最后讀取的可以抽象成一個圓面。
然而你以為到這里就完了嗎?其實並沒有。
磁道還不是硬盤數據讀寫的最小單位,磁道還要划分為扇區(Sector)。磁道很窄,也看不見,但在想象中,它是一個空心圓,占有一定的寬度。將它划分許多分段之后,每一部分都呈扇形,也就是扇區:

每條磁道能夠划分為幾個扇區,取決於磁盤的制造者,通常為63 個。個扇區都有一個編號,但是與磁頭和磁道不同,扇區的編號是 從1 開始的,最后通常是63結尾。
扇區與扇區之間以(空白)間隔開來,每個扇區以扇區頭開 始,然后是512 個字節的數據區。扇區頭包含了每個扇區自己的信息, 主要有本扇區的磁道號、磁頭號和扇區號,用來供硬盤定位機構使用。 現代的硬盤還會在扇區頭部包括一個指示扇區是否健康的標志因為在反復讀寫后很有可能對扇區進行一個破壞,以及用來替換該扇區的扇區地址。用於替換扇區的,是一些保留和隱藏的磁道。
啟動過程
有了前面的預備知識,這個啟動過程就很好理解了。
首先8086CPU加點啟動后,指向的地址為 FFFF:0000,這條指令是屬於BIOS的。

這里8086對應的BIOS中的指令為jmp F000:E05B(FE05B),也是屬於BIOS的地址空間里面容納了硬件的診斷、檢測和初始化程序。
但是ROM BIOS的內存是不大的肯定容納不下像Windows操作系統這樣的東西,只能作為一個媒介來使用。所以在ROM BIOS里還寫好了一些指令,用來從外部存儲設備里面讀取內容到內存,然后讓CPU來執行。就像你平時用的Windows,肯定是存放在硬盤里面的,然后系統先執行自己的初始化,然后把外部設備里的系統再加載到內存讓后CPU來執行。
前面的內容可以歸咎與ROM BIOS了,其實里面干啥了我們也不知道,因為這個是人家寫好的。但是后面ROM BIOS的執行完了的我們是知道的:

(這一坨黃色的是CPU在離開ROM BIOS前執行的最后的代碼)
這里需要補充一個知識,主引導扇區:硬盤的第一個扇區是0 面0 道1 扇區,或者說是0 頭0 柱1 扇區,這 個扇區稱為主引導扇區。
如果計算機的設置是從硬盤啟動(大多數是這樣),那么,ROMBIOS 將 讀 取 硬 盤 主 引 導 扇 區 的 內 容 , 將 它 加 載 到 內 存 地 址 0x0000:0x7c00 處(也就是物理地址0x07C00),然后用一個jmp 指令 跳到那里接着執行:
jmp 0x0000:7C00
通常,主引導扇區的功能是繼續從硬盤的其他部分讀取更多的內容 加以執行。像Windows 這樣的操作系統,就是采用這種接力的方法一步 一步把自己運行起來的。然后就電腦正常運行了。
