注意:由于虛擬內存技術,在經典32位桌面操作系統中,有32條地址線(特殊情況下可能36條),那么CPU可直接尋址到的內存空間為2^32字節,也就是4GB,雖說內存尋址可以到4G,但是常常在單板機上 并不會有這么大的物理內存。
根據實際情況而不同,可能是512M或者更少,但是由于虛擬內存機制的存在,程序看起來可操作的內存就是4GB,因為MMU總會找到與程序中的虛擬地址相對應的物理地址,在內存不夠用時,它就會征用硬盤中的空間,在linux下安裝系統時會讓你分出一片swap分區,顧名思義,swap分區就是用來內存交換的。
處理機字長是指處理機能同時處理(或運算)的位數,即同時處理多少位(bit)數據。比如Intel 4處理器字長為32位,它能同時處理32位的數據,也即它的數據總線為32位。以前的處理器比如8086,則為16位處理器,現在新興的64位處理器,它的數據吞吐能力更強,即能同時對64位數據進行運算。處理器的字長越大,說明它的運算能力越強。如果講處理器的尋址范圍,則要看處理器的地址總線的位數,而不是它的字長!這個要明白!比如Intel 4處理器的數據總線為32位,地址總線也是32位。8086的數據總線為16位,地址總線為20位。新興的64位處理器的數據總線為64位,地址總線大部分是32位。這個清楚之后,再看地址總線與尋址范圍的關系。存儲單元是以字節(byte)為單位,N根地址總線能訪問2的N次方個存儲單元。于是有32位地址總線可以訪問2的32次方個存儲單元,即4GB。 8086處理器字長是16位,它的地址總線是20位,所以能訪問2的20次方個存儲單元,即1MB。另外一點需要注意的就是,如果有些題目說:按“字”尋址,就說明是存儲單元大小為字長的位數,按“字節”尋址,說明存儲單元式字節的大小(個人理解,沒有考證)
下面通過舉幾個例子,來說明這些關系
1、某計算機字長32位,存儲容量8MB。按字編址,其尋址范圍為(0~2M-1) 計算步驟:8MB字節=8*1024*1024*8位。所以8MB/32位=2M.
2、某計算機字長32位,其存儲容量為4MB,若按半字編址,它的尋址范圍是(0-2M-1)計算步驟:若按半字就是16位了 4MB=4*1024*1024*8位,所以4MB/16 = 2M;
3、字長為32位.存儲器容量為64KB.按字編址的尋址范圍是多少計算步驟:64K字節=64*1024*8位. 所以64KB/32位=(64*1024*8)/32=16*1024=16K 故尋址范圍為: 0-16K-1
4、某機字長32位,存儲容量1MB,若按字編址,它的尋址范圍是什么?
解釋:容量1M=2*1024*1024 位一個字長是32 位
所以,尋址范圍是二者相除=256K
5、對于存儲器的容量擴展,有位擴展,字擴展,字位擴展三種形式。對于字位擴展,一個存儲器的容量為M*N位,若使用L*K位存儲器芯片,那么,這個存儲器共需(M*N)/(L*K)個存儲器芯片。
下面分析一下字位擴展的習題:設有一個具有14位地址和8位字長的存儲器,問該存儲器容量有多大?如果存儲器由 1K*1靜態存儲器組成,需多少芯片?多少位地址作芯片選擇?
分析:位擴展指的是用多個存儲器對字長進行擴充。本題中所用的存儲器芯片字長是1位,要擴展到8位,就得用8片。原題中說, “存儲器由 1K*1靜態存儲器組成”,其中,1K指的是存儲單元個數,它決定地址的位數,因為2的10次方是1K,所以它用10根地址線,4位地址線用來作芯片選擇。
字擴展指的是增加存儲器中字的數量。
解:該存儲器的地址線有14位,它的可尋址范圍是:2^14=2^4*2^10=16K,因為它是8位字長,所以可存儲16K個字節的信息,即16K*8位;所需芯片總數為(16K*8)/(1K*1)=16*8=128個芯片; 芯片選擇線為14-10=4。
地址總線寬度決定了CPU可以訪問的物理地址空間,簡單地說就是CPU到底能夠使用多大容量的內存。16位的微機我們就不用說了,但是對于386以上的微機系統,地址線的寬度為32位,最多可以直接訪問4096 MB(4GB)的物理空間。而今天能夠用上1GB內存的人還沒有多少個呢(服務器除外)。
?? 數據總線負責整個系統的數據流量的大小,而數據總線寬度則決定了CPU與二級高速緩存、內存以及輸入/輸出設備之間一次數據傳輸的信息量。
???? CPU做一次加法是多少位的。確切地說,CPU的位數,指的是CPU內ALU的數據字寬度。外部的數據總線也可以是16條,數據分高半字和低半字兩次傳輸。可參Intel8088與8086之區別。
??? CPU位數與地址字長無關。地址總線條數不一定等于地址字長。或許有人喜歡在一根地址總線上做32位串行傳輸,只要他有本事使地址傳輸能適應RAM芯片的速率。如果CPU內的ALU(算術邏輯單元)字長仍是32位,CPU就還是32位。
CPU和內存之間的信息交換是通過數據總線和地址總線進行的
內存儲器的基本存儲單位稱為存儲單元,今天的計算機內存小存儲器單元的結構模式,每個單元正好存儲一個字節的信息(8位二進制代碼)。每個單元對應了一個唯一的編號,由此形成的單元編號稱為存儲單元的地址。計算機中央處理單元中的各部件通過一條公共信息通路連接,這條信息通路稱為系統總線。CPU和內存之間的信息交換是通過數據總線和地址總線進行的。內存是按照地址訪問的,給出即可得到存儲在具有這個地址的內存單元里的信息。CPU可以隨即訪問任何內存單元的信息。且訪問時間的長短不依賴所訪問的地址。
一、字長
字長是計算機內部一次可以處理的二進制數的位數。一般計算機的字長取決于它的通用寄存器、內存儲器、ALU的位數和數據總線的寬度。微型計算機字長有4位、8位、16位,高檔微機字長為32位或64位。
二、主頻
主頻是指微型計算機中CPU的時鐘頻率(CPU Clock Speed),也就是CPU運算時的工作頻率。一般來說,主頻越高,一個時鐘周期里完成的指令數也越多,當然CPU的速度就越快。
三、存儲容量
存儲容量是衡量微型計算機中存儲能力的一個指標,它包括內存容量和外存容量。內存容量以字節為單位,分最大容量和裝機容量。最大容量由CPU的地址總線的位數決定,而裝機容量按所使用軟件環境來定。外存容量是指磁盤機和光盤機等容量,應根據實際應用的需要來配置。
四、外設擴展能力
一臺微型計算機可配置外部設備的數量以及配置外部設備的類型,對整個系統的性能有重大影響。如顯示器的分辨率、多媒體接口功能和打印機型號等,都是外部設備選擇中要考慮的問題。
五、軟件配置情況
軟件配置情況直接影響微型計算機系統的使用和性能的發揮。通常應配置的軟件有:操作系統、計算機語言以及工具軟件等,另外還可配置數據庫管理系統和各種應用軟件。
解決方案:根據情況硬軟選高配置。
??????????????影響計算機性能的因素和解決方案
影響計算機工作性能的因素有什么
A.電磁干擾 B、溫度 C、濕度 D、靜電干擾
應該是AB,靜電干擾不了計算機工作! 客觀的說就我們所生活的空間濕度來講對計算機產生不了什么影響..而溫度是指計算機的散熱優良而言..物理溫度也影響不了計算機工作!
-------------------
計算機的字長為什么取決于數據總線的寬度
字長是指計算機內部參與運算的數的位數。它決定著計算機內部寄存器、ALU和數據總線的位數,直接影響著機器的硬件規模和造價。字長直接反映了一臺計算機的計算精度,為適應不同的要求及協調運算精度和硬件造價間的關系,大多數計算機均支持變字長運算,即機內可實現半字長、全字長(或單字長)和雙倍字長運算。
微型機的字長通常為4位、8位、16位和32位,64位字長的高性能微型計算機也已推出。
字長對計算機計算精度的影響:
4 位字長:24 = 16; 16 位字長:216 = 65,536 = 64K
32 位字長:232 =4, 294, 967, 296 = 4G; 64 位字長:264 ≈ 1 .8445×10 19
數據總線DB用于傳送數據信息。數據總線是雙向三態形式的總線,即他既可以把CPU的數據傳送到存儲器或I/O接口等其它部件,也可以將其它部件的數據傳送到CPU。數據總線的位數是微型計算機的一個重要指標,通常與微處理的字長相一致。例如Intel 8086微處理器字長16位,其數據總線寬度也是16位。需要指出的是,數據的含義是廣義的,它可以是真正的數據,也可以指令代碼或狀態信息,有時甚至是一個控制信息,因此,在實際工作中,數據總線上傳送的并不一定僅僅是真正意義上的數據。
地址總線AB是專門用來傳送地址的,由于地址只能從CPU傳向外部存儲器或I/O端口,所以地址總線總是單向三態的,這與數據總線不同。地址總線的位數決定了CPU可直接尋址的內存空間大小,比如8位微機的地址總線為16位,則其最大可尋址空間為216=64KB,16位微型機的地址總線為20位,其可尋址空間為220=1MB。一般來說,若地址總線為n位,則可尋址空間為2n字節。
控制總線CB用來傳送控制信號和時序信號。控制信號中,有的是微處理器送往存儲器和I/O接口電路的,如讀/寫信號,片選信號、中斷響應信號等;也有是其它部件反饋給CPU的,比如:中斷申請信號、復位信號、總線請求信號、限備就緒信號等。因此,控制總線的傳送方向由具體控制信號而定,一般是雙向的,控制總線的位數要根據系統的實際控制需要而定。實際上控制總線的具體情況主要取決于CPU。
計算機的字長為什么取決于數據總線的寬度
--------------------------------------------------------------------------------------
按總線的功能(傳遞信息的內容)分類,計算機中有三種類型的總線,即傳送數據信息的數據總線、傳送地址信息的地址總線和傳送各種控制信息的控制總線。
1.數據總線
數據總線是CPU與存儲器、CPU與I/O接口設備之間傳送數據信息(各種指令數據信息)的總線,這些信號通過數據總線往返于CPU與存儲器、CPU與I/O接口設備之間,因此,數據總線上的信息是雙向傳輸的。
2.地址總線
地址總線上傳送的是CPU向存儲器、I/O接口設備發出的地址信息,尋址能力是CPU特有的功能,地址總線上傳送的地址信息僅由CPU發出,因此,地址總線上的信息是單向傳輸的。
3.控制總線
控制總線傳送的是各種控制信號,有CPU至存儲器、I/O接口設備的控制信號,有I/O接口送向CPU的應答信號、請求信號,因此,控制總線是上的信息是雙向傳輸的。控制信號包括時序信號、狀態信號和命令信號(如讀寫信號、忙信號、中斷信號)等。
例如向內存中寫入數據是通過內存總線(包括數據總線、地址總線和控制總線)進行的,數據信息需通過數據總線傳遞至內存中,具體將這些數據信息寫入內存的哪些單元則必須向地址總線傳送地址信息確定,而哪個時刻開始向內存中寫入數據則由控制總線獲得的控制信號決定。
是64字1位靜態存儲器C850邏輯框圖,向該存儲器某一單元寫入(或讀出)數據時,一是需向由A0、A1、A2、A3、A4、A5構成的地址總線傳送地址信息以確定對哪一存儲器單元寫入(或讀出);二是需要向CE端傳送片選控制信號使該存儲器芯片處于工作狀態;三是需要在R/W端傳送讀寫控制信號確定進行寫入(或讀出)操作;這樣才能從數據輸入端Din(或數據輸出端Dout)寫入(或讀出)數據。上述操作向地址線、控制線和數據線均傳送了信息。
有些特殊的總線雖然也需要傳遞數據信息、地址信息和控制信號,但由于結構簡單,沒有單獨提供數據總線、地址總線和控制總線。如通用串行總線USB,包括電源線、接地線在內總共只提供了四條連線,只能以串行輸送方式分時傳送數據信息、地址信息和控制信息。
/*****************************************
淺談操作系統與內存
對于計算機的發明,相信大家都有耳聞那個占地面積按平米算的第一臺計算機。在那個時候,CPU的資源是極其珍貴的,隨著這些年突飛猛進的發展,一片指甲蓋大小的民用級CPU一秒鐘能執行的指令數可以達到上億級別。
隨著計算能力的增長,芯片外圍的硬件和配套的軟件也是一路高歌,發生了天翻地覆的變化,今天我們簡單回顧歷史,來看一看操作系統和內存機制的演變,不僅要了解它們是怎樣,同時也看看它們為什么會是這樣。
CPU的運行
一說到CPU( unit),大家都覺得這是非常了不起的東西,我們的手機電腦都是由它進行核心控制,擁有掌管一切的能力,但是,它真的有傳說中那么聰明么?
事實并非如此,CPU唯一的能力其實就是處理二進制數據,CPU的組成是這樣的:
這三個就是早期CPU的主要部件了,那它是怎么處理數據的呢?
系統總線負責與外部的數據交換,將交換的數據暫時放在寄存器中,然后CPU再從寄存器中獲取數據使用算數邏輯運算單元進行運算,必要時將數據寫回。
是的,僅此而已,CPU不能直接播放音樂,它也不能生成游戲界面,只是孜孜不倦地拿數據,處理數據,寫回數據,像個一刻也不停的流水線工人。
系統的存儲
上文中我們提到CPU的內部寄存器,因為是集成在CPU內部,所以速度非常快,但是同時也因為集成度的問題,CPU中一般只有幾十字節的寄存器,這對于數據處理是遠遠不夠的,所以當運行時存儲空間不夠的時候我們必須有另一個地方進行存儲,這就是系統內存。
即使都是數據,也分別有不同的屬性,比如是否需要掉電保存,數據處理的速率要求。
在程序執行時,需要在存儲設備中保存一些運行參數,這部分存儲數據的速率直接決定了程序運行速率,所以對這部分存儲的要求是速度快,同時因為是存儲運行時參數,所以不需要掉電保存。
在程序執行之外,需要保存大量的靜態數據,比如用戶數據,文件,這部分數據需要掉電能夠保存,且要求可存儲數據量大,由于訪問并不頻繁,所以對速率要求可以降低以節省成本。
由此,存儲設備分化出了ram和rom兩大類,ram有速率快,掉電不保存的特性,而rom是速率慢,存儲量大,掉電保存。
ram和rom只是分別對應易失性存儲器和非易失性存儲器的統稱,事實上ram有sram,sdram等等,而rom有,flash,硬盤等等。
微控制器和單板機
上面說到CPU的作用32位程序最大尋址空間,可能你開始有疑問了,既然CPU只能處理簡單的數據,那么它是怎么處理復雜軟件的運行的呢?
這就是很多人的一個常見誤區,將CPU和MCU,還有單板機搞混了。
MCU( unit):微控制器,又被稱為單片微型計算機,常被直接稱為單片機。它通常集成了CPU,rom,ram以及硬件控制器、外圍電路等等,ram和rom的容量有限,接口電路也有限。
單板機:單板機是把微型計算機的整個功能體系電路(CPU、ROM、RAM、輸入/輸出接口電路以及其他輔助電路)全部組裝在一塊印制電板上,再用印制電路將各個功能芯片連接起來,一般來說資源比如主頻、ram&rom容量要比MCU高出一大截。
事實上,在我們常見的手機電腦中,用戶常說的CPU,事實上指的是單板機。而在嵌入式設備上,經常會使用到單片機。
常見的第二個誤區就是:認為整個單板機(或者MCU)上只有CPU是可編程元件,其他部分都是硬件搭建起來的。
事實上,除了CPU,像各種硬件控制器比如gpio、i2c、dma或者硬盤控制器,這些都是可編程器件,只是這些控制器所扮演的都是一個從機角色,而主控是CPU。
CPU通過系統總線與各個控制器之間進行數據交互,通過特定的預定義的指令來控制控制器的行為:
比如控制gpio的操作,將某個引腳的電平從0設置成1,這樣再配合上繼電器等硬件上的電路,就可以實現220V電路的控制。
再者是通過控制gpio以通過預定義的控制協議與連接在另一端的設備進行通信。
又或者是告訴硬盤控制器,CPU需要訪問某些數據,硬盤控制器將數據傳遞給CPU。
CPU就是這樣通過將指令一級級地將數據傳遞給外設,通過在外設處理器中預定義了一些指令字段,外設接收CPU的數據相當于接收到控制指令,以此實現外設的控制。
而CPU本身則只是孜孜不倦地處理數據,反饋數據。
單片機到操作系統
在早期的CPU上,CPU都是順序執行,一個CPU只運行一個程序,這樣造成的問題就是:當程序在等待某個資源或者讀寫磁盤的時候,CPU就處于空閑狀態,這對CPU來說是非常浪費的。由于CPU的資源非常珍貴,人們不得不想辦法解決這個問題,所以就有人編寫多任務程序:
一個CPU中可以存在多個任務,一個時刻只允許一個任務運行,當檢測程序檢測到某個任務處于空閑狀態,就切換下一個任務運行。或者是當前任務主動放棄運行權,切換下一個任務運行。
這就是操作系統的原型,檢測程序一般被稱為調度器,遵循某種調度算法。
任務調度算法
調度算法又常被稱為調度策略,目前的操作系統常用的調度策略有兩種:
事實上,操作系統往往在基于上述調度算法的基礎上,運行著更復雜的調度算法,比如以優先級為權重分配時間片,比如任務分組,不同的分組有不同的調度策略等等....
任務調度的執行原理
上文說到,操作系統的的最早雛形就是允許CPU中存在多個任務,通過某種調度算法來使每個任務交替運行。
那么,CPU到底是怎么做到這件事的呢?
首先我們要了解以下概念:時鐘、中斷,程序執行流的切換。
在發生中斷的時候,因為需要跳轉去執行中斷服務函數,肯定需要更改程序執行流,在單片機上,CPU將會去查中斷向量表,找到需要執行的函數地址裝載到PC指針處,然后保存一些當前運行參數,比如寄存器數據,棧數據,下一個指令周期將會跳轉執行中斷服務函數。
既然程序的執行流可以由程序員自由控制,只要控制PC指針指向就可以,那么我們也可以預先定義兩個任務,當一個任務空閑時,直接跳轉執行到另一個任務,每個任務的運行參數比如寄存器數據,棧數據,使用的資源等等進行保存,在切換到某個任務時,只要將保存的信息恢復到原來的狀態就可以繼續運行任務,這種操作方式當然可以從兩個延伸到多個,這就是操作系統的模型。
通常,保存信息的部分一般使用結構體鏈表,一般被稱為任務控制塊(每個操作系統的叫法不一樣,但實現的思想是一樣的),每個線程都有獨立的棧空間以保存每個線程的運行時狀態。
那么,我們怎么知道什么時候執行另一個任務呢?這就需要借助時鐘中斷提供一個時間的概念,任務的運行時間就以這個時鐘中斷作為度量,具體的做法就是每隔一個周期(通常非常短,1ms、10ms等)產生一次中斷,在中斷程序中檢查是否需要切換任務運行,而切換的原因就比較多了,比如運行時間到了、等待某項資源自主休眠等等。
事實上,到這里,你已經了解了嵌入式實時系統的運行原理了,比如ucos,之類的,建議去看看相關源代碼,尤其是ucos,代碼量少且易懂,麻雀雖小五臟俱全。
嵌入式實時操作系統的內存限制
在早期的單片機上,程序運行在物理內存中,也就是說,程序在運行時直接訪問到物理地址,在程序運行開始,將全部程序加載到內存中,所有的數據地址和程序地址就此固定。
在運行多任務系統時,比較直接的辦法也是直接為每個任務分配各自需要的內存空間,比如總內存為100M,task1需要40M,task2需要50M,task3需要20M,那么最簡單的辦法是給task1分配40M,給task2分配50M,而task3,不好意思,內存不夠了,不允許運行,這樣簡單的分配方式有以下問題:
虛擬內存機制
那么怎么解決這個問題呢?曾經有人說過一句名言:
計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決。
在這里這個道理同樣適用,后來的操作系統設計者設計了一種新的模型,在內存中增加一層虛擬地址。
面對開發者而言,程序中使用的地址都是虛擬地址,這樣,只要我們能妥善處理好虛擬地址到物理地址的映射過程,而這個映射過程被當作獨立的一部分存在,就可以解決上述提到的三個問題:
既然增加了一個中間層,那么這個中間層最好是由獨立的部分進行管理,實現這個功能的器件就是MMU,它接管了程序中虛擬地址和物理地址的轉換,MMU一般直接集成在CPU中,不會以獨立的器件存在。
內存分段分頁機制
在經典32位桌面操作系統中,有32條地址線(特殊情況下可能36條),那么CPU可直接尋址到的內存空間為2^32字節,也就是4GB,雖說內存尋址可以到4G,但是常常在單板機上 并不會有這么大的物理內存。
根據實際情況而不同,可能是512M或者更少,但是由于虛擬內存機制的存在,程序看起來可操作的內存就是4GB,因為MMU總會找到與程序中的虛擬地址相對應的物理地址,在內存不夠用時,它就會征用硬盤中的空間,在linux下安裝系統時會讓你分出一片swap分區,顧名思義,swap分區就是用來內存交換的。
那4GB這么大的內存,如果不進行組織,在CPU讀寫數據時將會是一場災難,因為要找到一個數據在最壞的情況下需要遍歷整個內存。
就像一個部隊,總要按照軍、師、旅、團、營、連、排、班來劃分,如果全由總司令管理所有人,那也會是一場災難。
因此,對于內存而言,衍生了分段和分頁機制,根據功能劃分段,然后再細分成頁,一般一頁是4K,當然,這其中會有根據不同業務的差別做一些特別的定制。
它的問題就是即使是只存儲一個字節,也要用掉一頁的內存,造成一定的浪費。
但是如果將分頁粒度定得過細,將會造成訪問成本的增加,因為在很多時候,進行訪問都是直接使用輪詢機制。而且,就像每本書都有目錄和前言,段和頁的信息都要在系統中進行記錄,分頁更細則代表頁數更多,這部分的開銷也就更多。這也是一種浪費。
就像程序中時間與空間的拉鋸戰,計算機中充滿了妥協。
單片機與單板機程序執行的不同
處理器是否攜帶MMU幾乎完全成了劃分單片機和單板機的分界線。
帶MMU的處理器直接運行桌面系統,如linux、之類的,與不帶MMU的單片機相比,體現在用戶眼前的最大區別就是進程的概念,一個進程就是一個程序的運行實體,使得桌面系統中可以同時運行多個程序,而每個程序由于虛擬機制的存在,看起來是獨占了整個內存空間。
而不帶MMU的處理器,一般是嵌入式設備,程序直接在物理地址上運行,支持多線程。
從程序的加載執行來說,桌面系統中程序編譯完成之后存儲在文件系統中,在程序被調用執行時由加載器加載到內存中執行。而在單片機中,程序編譯生成的可執行文件一般是直接下載到片上flash(rom的一種)中。
32位單片機的尋址范圍為4G,由于不支持虛擬內存技術,一般在總線上連接的ram不會太大,所以可以直接將rom也掛載在總線上32位程序最大尋址空間,CPU可以直接通過總線訪問flash上的數據,所以程序可以直接在片上flash中執行,在運行時只是將數據部分加載到ram中運行。
無系統單線程,嵌入式實時操作系統和桌面操作系統
可以在單板機上運行桌面操作系統,是不是運行單線程的單片機和嵌入式實時操作系統就可以拋棄了呢?
從功能實現上來說,單板機確實比單片機強很多,但是資源的增加同時帶來成本的增加,所以在一些成本敏感的應用場合下反而是單片機的天下。
而對于操作系統而言,嵌入式實時操作系統由于沒有一些臃腫的系統服務,有時反而有著比桌面系統更好的實時性,在實時性要求高的場合更是風生水起,比如無人機、車載系統。而且運行在單片機上,成本上更有優勢。
對于嵌入式開發而言,很有必要了解這三種程序運行方式:無系統單線程,嵌入式實時操作系統,桌面操作系統。
在單片機上,無系統單線程模式可以很簡單地切換到嵌入式實時操作系統,進行相應的移植即可。
但是是否能在其上運行桌面操作系統,是否集成MMU是一個決定性的因素。