一步步编写操作系统 10 cpu的实模式
cpu的實模式
由于mbr在實模式下工作……什么?什么是實模式?這時候有同學(xué)打斷了我。我心想,這下好辦了……哈哈,沒有啦,開個玩笑而已。我們這里所說的實模式其實就是8086 cpu的工作環(huán)境、工作方式、工作狀態(tài),這是一整套的內(nèi)容,并不是單指某一方面的設(shè)置。
實模式是指8086 cpu的尋址方式,寄存器大小,指令用法等,是用來反應(yīng)cpu在該環(huán)境下如何工作的概念。所以想了解實模式這種抽象的概念,主要就是了解在實模式下cpu能做什么。
大家都學(xué)過匯編語言吧,里面有講實模式、保護模式之類的,但鑒于太過久遠,為了讓后面的工作順利進行,我覺得還是有必要給大家介紹下cpu的工作模式。
cpu的工作原理
在介紹cpu的各種模式之前 ,先占用大家?guī)追昼姷臅r間 ,說點在兩種模式下公共的內(nèi)容,和大家聊聊cpu的工作原理。當(dāng)然這里所說工作原理可不像微機接口技術(shù)里那么細致,精確到邏輯門等電子電路。第一我也不會,想講也講不出來,吼吼^0^。第二我覺得沒必要懂到那么細致,如果懂的太細了,會為之所累,您想,每次執(zhí)行一條指令時,您的大腦總是聯(lián)想到各種元件的工作流程,本來一瞬間完成的工作您可能要給放大一千倍,非得強迫癥似的要求掌握每個步驟的細節(jié),萬一在哪個點上想不通了這就會讓人感到很沮喪,影響心情,甚至質(zhì)疑上層的編譯器,哈哈,我知道說的有點嚴重了,不夸張一點的話不容易表述問題,好了,下面在宏觀上介紹下cpu工作原理。
大家都知道,cpu的唯一的任務(wù)就是執(zhí)行指令,在它眼里,指令就是一串010101…,那它執(zhí)行每條指令的流程是怎樣的呢。cpu大體上可以劃分為3個部分,它們是控制單元、運算單元、存儲單元。控制單元是cpu的控制中心,cpu需要經(jīng)過它的幫忙才知道自己下一步要做什么。而控制單元大致是由指令寄存器IR(Instruction Register)、指令譯碼器ID(Instruction Decoder)、操作控制器OC(Operation Controller)組成。程序被加載到內(nèi)存后,也就是指令這時都在內(nèi)存中了,指令指針寄存器IP指向內(nèi)存中下一條待執(zhí)行指令的地址,控制單元根據(jù)IP寄存器的指向,將位于內(nèi)存中的指令逐個裝載到指令寄存器中,但它還是不知道這些指令是什么,在它眼里的0101串此時還沒有實際意義。然后指令譯碼器將位于指令寄存器中的指令按照指令格式來解碼,分析出操作碼是什么,操作數(shù)在哪里之類的。下面給出了一般的指令格式:
前綴 操作碼 尋址方式、操作數(shù)類型 立即數(shù) 偏移量看上去還是蠻復(fù)雜的,復(fù)雜的原因是必須用一種統(tǒng)一的格式去歸納所有形式的指令,因為cpu只能識別一種格式,萬物的源頭必須是最簡單的,cpu也一樣。這就好比要求用一句話表達出宇宙蒼生,似乎看上去不可能?能,一定能,只要這句話足夠長就行^_^。就像等待女朋友化妝一樣,她怕你等煩了,于是就安慰你一句:“還有一首歌的時間就好了”,其實你明白,這首歌是《黃河大合唱》,一共8個樂章且唱呢……^5^。
由于cpu支持的指令數(shù)量較多,一些指令還可以搭配一些輔助的東東,所以就需要在前綴部分記錄這些,如rep(用于重復(fù)執(zhí)行,匯編中經(jīng)常用)、段超越前綴。操作碼就是大家平時用的mov、jmp等等。尋址方式又有好多,如基址尋址、變址尋址等等,操作數(shù)類型中記錄的是用哪些寄存器之類的。如果在指令中用到了立即數(shù),就要將其記錄到指令格式中立即數(shù)部分,如果尋址方式中有到了偏移量,就要將此偏移量記錄到指令格式中的偏移量部分。
既然指令是存放在指令寄存器中,那指令中用到的數(shù)據(jù)存放到哪里呢,下面介紹存儲單元。
存儲單元是指cpu內(nèi)部的L1、L2緩存及寄存器,待處理的數(shù)據(jù)就存放在這些存儲單元中,這里的數(shù)據(jù)是說指令中的操作數(shù)。為什么數(shù)據(jù)已經(jīng)在內(nèi)存中了還非得在cpu內(nèi)部再整這么個存儲單元干嗎?原因是緩存基本上都是采用SRAM (Static RAM)存儲器,從名字上看就知道它是一種具有靜態(tài)存取功能的存儲器。這么一說,似乎還有動態(tài)存儲功能的存儲器?是啊,其實我們插在主板上的物理內(nèi)存就是DRAM(Dynamic Random Access Memory), DRAM內(nèi)存需要每隔一段時間就去刷新電路,刷新就是指給DRAM充電,否則存儲的數(shù)據(jù)就會丟失。而SRAM不需要刷新電路即能保存它內(nèi)部存儲的數(shù)據(jù),這就是靜態(tài)的含義,因此SRAM性能較強勁。但SRAM也不是完美無缺的,它的集成度較低,相同容量之下,SRAM的體積比DRAM要大很多。所以二級緩存都不大,目前來說頂多4兆左右,所以現(xiàn)代cpu用二級緩存的數(shù)量取勝,如L1、L2、L3共三級。寄存器可分為兩大類,程序員可以使用的寄存器稱為程序可見寄存器,如通用寄存器,段寄存器。程序不可見寄存器是指程序員不可使用,也無法訪問到它們,系統(tǒng)運行期間可能要用到的寄存器,如ALU算術(shù)邏輯單元在求和時,會將結(jié)果先送到數(shù)據(jù)暫存寄存器。操作碼有了,操作數(shù)有了,就差執(zhí)行指令了,隨后“操作控制器”給相關(guān)部件發(fā)信號,會給哪些部件發(fā)信號呢?如下面要介紹的運算單元。
運算單元是負責(zé)算術(shù)運算(加減乘除)和邏輯運算(比較、移位),它從控制單元那里接收命令(信號)并執(zhí)行,它沒有自主意識,只是個執(zhí)行部件。它們之間的關(guān)系如圖:
?
好啦,文字描述過了,圖也看過了,總結(jié)下cpu的工作原理:控制單元要取下一條待運行的指令,該指令的地址是在程序計數(shù)器PC中,在x86cpu上,程序計數(shù)器就是cs:ip。于是讀取ip寄存器后,將此地址送上地址總線,cpu根據(jù)此地址便得到了指令,并將其存入到指令寄存器IR中。這時候輪到指令譯碼器上場了,它根據(jù)指令格式檢查指令寄存器中的指令,先確定操作碼是什么,再檢查操作數(shù)類型,若是在內(nèi)存中,就將相應(yīng)操作數(shù)從內(nèi)存中取回放入自己的存儲單元,若操作數(shù)是在寄存器中就直接用了,免了取操作數(shù)這一過程。操作碼有了,操作數(shù)也齊了,操作控制器給運算單元下令,開工,于是運算單元便真正開始執(zhí)行指令了。ip寄存器的值被加上當(dāng)前指令的大小,于是ip又指向了下一條指令的地址。接著控制單元又要取下一條指令了,流程回到了本段開頭,cpu便開始了日復(fù)一日的循環(huán),由于cpu特別不容易壞,所以唯一它停下來的條件就是停電。
以上是cpu的工作原理,無論cpu在哪種模式下工作,這一核心原理是不變的。有了這一思想武裝起來后再講模式就簡單多了,兄弟們加油,下一節(jié),不見不散。
總結(jié)
以上是生活随笔為你收集整理的一步步编写操作系统 10 cpu的实模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 公共财政恶化,美国主权信用惨遭下调,以后
- 下一篇: 磁条信用卡可以换成芯片的吗