單片機、CPU、指令集和操做系統的關係

鄭重聲明:轉載自http://blog.csdn.net/zhongjin616/article/details/18765301linux

1> 首先討論各類單片機與操做系統的關係編程

說到單片機,你們第一時間想到的應該是51單片機,對吧。不錯,更高級一點的AVR,把他稱爲單片機,咱們也還以爲能夠接受。那麼再高級一點的ARM7,8086,80386,Core i3,Athlon 等等咱們更習慣稱他們爲CPU,由於學習計算機原理的時候都是這麼叫的,但按照單片機的定義,他們也是歸屬於單片機。這也不怪你們,中國的教育都是這樣,只注重告訴你是什麼,而不告訴你他們之間的聯繫。上述幾種單片機或者芯片(若是你仍是以爲把core i3叫作單片機你不習慣的話)在原理上都是同樣,即都是有運算器 控制器 寄存器構成的,不一樣之處在於它們的硬件電路實現不一樣,個數不一樣,功耗不一樣,計算能力不一樣,但都提供相同的基本功。OK,終於讓cpu找到了組織,那麼就介紹爲何有的單片機要操做系統,有的在咱們學習的過程當中壓根就跟操做系統不挨邊。架構

51/AVR單片機  在學習他們的時候,都是先介紹它們有哪些資源——有幾個寄存器,有幾個時鐘等,而後就是怎麼用匯編,用C或者是C與彙編混合編程。這裏咱們用的語言都是能夠直接操做硬件資源的,所以咱們能夠本身決定何時使用哪一個寄存器,何時將寄存器內容寫到輔存儲器中。性能

ARM單片機 在學習它的時候,咱們能夠給他搭載操做系統,如MicroC/OS,iOS X, Android或者其餘定製的linux操做系統,但有時咱們也常常不讓它搭載操做系統,而是直接像使用51單片機那樣來操做它。學習

Core i3 / Athlon單片機(或者CPU,若是你仍是不喜歡用單片機來形容這麼牛逼的硬件) 你幾乎沒有據說過身邊誰會在這種單片機上開發應用(若是有,必定要引薦我認識一下哦)。由於在這種單片機上開發的應用有一個很牛逼的名字——操做系統! 因爲這種單片機提供的資源太多,能幹的活太多,咱們須要有一個專門的程序來負責管理它,從而避免對相同的功能重複開發。這樣咱們就能夠從對硬件編程中解放出來,更專一於應用層面的開發。從某種意義上來講,操做系統也就是一個應用程序而已,只不過他有點特別。網站

通常這種狀況下,打個比方會比較好——單車和汽車。單車很簡單,咱們對它的構成及零部件也很熟悉,鏈條掉了,咱們也徹底可以應付。這就比如51單片機,資源很少,咱們徹底可以hold住。相較而言,汽車則複雜不少,有減速系統,剎車系統,電子系統,空調系統等等,可是咱們並不須要清楚他們的硬件工做原理,咱們之須要知道按那個開關,踩那個踏板就行了。這就比如單片機上的操做系統,它不須要咱們清楚硬件的構造,想要實現功能,直接調用系統提供的API就能夠了。 在咱們雙腳不停的蹬着踏板,自行車就前進這個動做中,咱們是清楚的知道這其中各個部件的運行原理過程的;但若是你是踏着油門,汽車就跑起來,我以爲大部分人都不瞭解其中涉及到了哪些部件,以及各個部件的原理的。但這不妨礙咱們使用,不是嗎。操作系統


2> cpu與指令集的關係.net

cpu依靠指令來計算和控制系統,每款CPU在設計時就規定了一些列與其硬件電路相配合的指令系統,或者說某款cpu的硬件設計其實就是針對某個指令集的一種硬件實現。指令集也就是所謂的目標代碼(或稱爲機器代碼,是能夠直接在CPU上運行的代碼)能夠看做是要求cpu對外提供的功能,某款CPU的設計確定是朝着某個指令集來的。因此,不一樣的cpu架構,也表示這他的指令集要麼較以前的指令集有所拓展或者就是實現了一種全新的指令集。指令集中的一條指令,就是讓cpu完成一系列的動做,而該動做的完成則代表了某種運算的完成。一個功能可能須要一條或幾條指令來實現。好比彙編的MOV或者LD語句就可能對應着幾條cpu指令。
設計

下面介紹幾種常見的CPU架構與指令集的對應關係(所謂架構是指硬件電路的實現):blog

intel X86架構CPU可能實現了多個指令集x86,x86-64,MMX,SSE,SSE2,SSE3,SSSE3 ,而這些指令集中的指令讓cpu完成的動做都比較複雜,因此也稱爲CISC

AMD amd64架構的cpu 兼容了x86指令集還拓增了3D-Now!指令集,用於增強對3D顯示的支持。

ARM ARMv1~ARMv7架構的cpu實現了Thumb指令集和ARM指令集。這些指令集中的一條指令讓cpu完成的動做都比較簡單,因此也稱爲RISC指令集


3> 指令集與操做系統的關係

這裏要從新說起一下以前講到的兩個概念:指令集——就是機器代碼;操做系統——就是應用程序

首先咱們要知道計算機之父馮-諾伊曼說計算機只能運行在二進制上。因此不管是操做系統仍是普通的應用程序最終都得轉化到二進制代碼纔可以被cpu所處理。而用高級語言編寫的普通應用程序都必須通過編譯器編譯後成爲二進制代碼(指令)才能運行。而不一樣的cpu所實現的指令集不一樣,因此不一樣的指令集對應的編譯器也不盡相同,編譯器不一樣,相同的高級語言程序通過編譯後所獲得的二進制代碼也不一樣。這就引出了「移植」和「跨平臺」兩個概念。OK,從新捋一下:cpu架構-指令集-編譯器-程序 環環相扣,緊密聯繫。因此你就會聽到說Windows操做系統只可以運行在X86架構的CPU上,不能運行在Power 或 ARM 上,由於指令集不一樣,又因此就有了「Wintel」聯盟。因此你也能夠看到有的編譯器是有硬件廠家提供的,好比Intel就提供C和C++的編譯器,這樣編譯出來的程序就能更好的利用硬件的性能。那爲何又會聽到linux能夠運行在不一樣架構的CPU上呢?那是由於linux是開源的,所以就能夠將它移植到不一樣的CPU平臺上,而後在用相應的編譯器編譯,就獲得了能夠在該CPU上運行的二進制代碼了。而Windows是封閉的,得不到源代碼,而MS本身又沒有移植到別的CPU平臺上的打算,因此固然就只能在X86上運行了。(BTW,X86也是性能最好的CPU之一,而Windows對性能要求較高,因此MS固然也就不肯意移植了)

相關文章
相關標籤/搜索