以前手寫了一個很是簡單的Hello OS操做系統,再開始後面的學習以前,咱們先思考一個問題——代碼究竟是怎麼運行起來的? 下面就將從0和1,二極管,數字電路,模擬電路入手,講一講代碼內部的祕密。html
如今能夠開始一個問題了:一個代碼究竟是怎麼執行起來的?CPU內部究竟是怎麼工做的?java
咱們先來看看計算機內部的基本元素「0」和「1」。電影片斷裏黑客出場時通常都少不了以下圖所示的「數字雨」特效:python
那麼,計算機中的「0」和「1」究竟是什麼?程序員
簡單,就是低電平和高電平的意思。編程
啥意思?緩存
0其實就表明低電平,1表明高電平。這裏所說的電平,意指電壓的大小(單位,福特,用符號V表示),而高低實際上是一種對比。微信
好比0.2V是低電平的話,那麼5V可能就是高電平了。注意,我說的是「可能」,難道單憑電壓大小還不能肯定是否是高電平了?markdown
是的,沒錯。高低電平的數值是由具體的電路來肯定的,通常二者都有一個閾值,當電壓大於某個閾值時,便是高電平;當電平小於某個閾值時,便是低電平。編程語言
計算機中的0和1是人類爲了理解方便,給低/高電平取的別名。其實兩種稱呼分別表明了數字電路和模擬電路。工具
數字電路是電路是以「0」和「1」即相應的邏輯符號來表示的,以下圖:
模擬電路是電路中以電壓高低和電流等參數來表示的,以下圖所示:
那麼數字電路和模擬電路有啥聯繫?
唔···其實能夠看作建築施工圖和建築實物圖的關係:數字電路主要是表現其邏輯和功能,模擬電路是搞定採用什麼材料什麼方式來實現數字電路想要達到的結果!
如今能夠開始考慮:高低電平如何實現的?
二極管是用半導體材料(硅、硒、鍺等)製成的一種電子器件,具備單向導電性。
什麼是單向導電性?先看下圖,左圖是一個二極管的實物圖,右圖是邏輯電路圖(即抽象的):
注:二極管還能夠分爲整流二極管、穩壓二極管、發光二極管等等,這裏只介紹普通二極管。
電流能夠從正(+)極流向負(-)極,此時處於導通狀態;但反過來卻不行,此時處於截止狀態。這就是所謂的單向導電性!
附一張二極管的伏安特性圖,看不懂也不要緊,眼熟就好:
因爲單向導電性,二極管就像是一個開關:
當處於導通狀態時,開關打開,兩邊的電壓大小一致。
如正極(+)電壓爲5.2V,那麼負極(-)也爲5.2V。
注:這裏並不許確,由於還涉及正負極的電壓大小、閾值電壓等等,只考慮理想狀況下,其餘的可自行百度探索。
若是咱們進一步把5.2V定義爲高電平,那麼此時正負極都是「1」!
當處於截止狀態時,開關關閉,兩邊電壓大小不一致。
若是正極只有0.2V,那麼此時正負很可能都是低電平,也就是「0」!
咱們經過二極管能夠得到「0」和「1」,可是光有「0」和「1」還不夠,計算機怎麼進行億萬級別的運算的?
這得慢慢來,要進行運算離不開邏輯運算,也就是門電路,常見的邏輯運算有與、或、非、異或、同或。它們的真值表與邏輯符號以下。
不用管邏輯符號,重點是真值表。
先以「與」來說解:
「與」,即當且僅當全部的輸入都爲「1」時,輸出才爲「1」,不然輸出爲「0」。如今看真值表,是否是這個意思?
等等,好像咱們是從二極管過渡到這的吧?這個與門能夠用二極管實現?
固然啦!下圖就是一個利用二極管和電阻(不用管)實現的簡單與門!
其中,A、B爲輸入,Y爲輸出。
咱們來分析一下:
若A爲高電平「1」,B爲低電平「0」,此時,D1截止狀態,D2處於導通狀態,Y就和B電壓一致,也爲低電平「0」,因此輸出爲「0」;
若A爲低電平「0」,B爲高電平「1」,此時,D1處於導通狀態,D2截止狀態,Y就和A電壓一致,也爲低電平「0」,因此輸出爲「0」;
若A爲高電平「1」,B爲高電平「1」,此時,D1和D2都處於截止狀態,Y就和VCC電壓基本一致,便是高電平「1」,因此輸出爲「1」;
注:判斷電壓的大小涉及電路中電流和電壓的關係,簡單來講,在一個電路中,電阻越大,那麼該電阻所佔據的電壓也就越大,當二極管處於截止狀態時,電阻能夠看作超級大,因此R1分的電壓就很小,輸出Y和電源VCC基本一致。若想進一步瞭解請百度探索或留言,我繼續更新。
與門在數字電路中還能夠表示爲「&」:
再來分析一個或門:當輸入中至少有一個「1」時,輸出爲「1」,若全爲「0」,則輸出「0」。
剛剛的與門展現的是兩個輸入,如今來看看四個輸入!
簡單分析一下,當ABCD四個都是輸入低電平「0」時,四個二極管都處於截止狀態,此時輸出即爲低電平「0」。
只有當其中任意一個不爲低電平時,若A爲高電平「1」,此時D1二極管導通,輸出即爲A的電平,即高電平「1」。
或門在數字電路中還能夠表示爲:
後面的非門之類的,單靠二極管就不太行了,就須要請出它的老哥——「三極管」,這裏暫時不介紹,咱們只須要知道:咱們能夠利用這些元器件構成如上表所展現的那些門電路,如今咱們要作的就是思考如何利用這些門電路來進行代碼的執行!
有了以上的邏輯運算門電路,咱們來不如考慮如何作加減乘除?爲方便回憶,如今把咱們已有的門電路工具組再次拿出來!
加法器
首先我們得明白,計算機中全部的運算其實都是基於二進制(進制的轉換以後再講)的,也就是加法器的輸入和輸出只有「0」和「1」。
值得注意的是設計邏輯電路時最好的方法是先寫真值表,對於一個簡單的加法器而言有兩個輸入(A/B)和一個輸出(S)和一個進位(C)。
**簡單分析一下,**輸入兩個1,輸出當前位0,進位爲1;輸入兩個0,當前位爲0,進位爲0;輸入一個0一個1,輸出當前位0,進位爲0。
A | B | S | C |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
只看當前位,去看看門電路工具組是否是有點眼熟?異或門!
只看進位,去看看與門是否是有點眼熟!
也就是說加法器能夠由異或門和與門構成!以下圖所示:
可是如今這個只能稱爲「半加器」,最多隻能計算1+1,如何更進一步,好比1+2,2+2?
這就須要在本來的加法器增長一個進位接口,以下就是「全加器」:
Copy一個百度圖片來簡化一下上圖的結構:
將兩個加法器串聯在一塊兒,就獲得一個能夠進行2位(3+3)加法的加法器。
要幾位加法就用幾個加法器串聯,如四位(15+15):
注:上圖展現的是串行進位加法器,又稱波紋加法器。還有一種超前進位加法器,再也不是從右到左一次計算,比前者更快。
參考: wenku.baidu.com/view/9de55e…
減法器
減法器實際上是本質仍是經過加法器實現的,好比15-15,其實就是15+(-15),這裏的-15是所謂的補碼,後面再說。
乘法器
加減解決了,乘法怎麼弄?
先看看二進制的乘法是怎麼計算的,以下:
上圖是4位的乘法,先考慮2位的乘法,例如a2a1×b2b1:
爲何輸出有四位?由於二位乘法最大就是四位結果!好比11(二進制)乘11(二進制),結果是多少?1001!
結合上圖的乘法過程,咱們能夠利用與門以及加法器來組成乘法器,以下圖所示:
乘1?原值。
乘2?因爲是二進制,在末尾加0便可。
乘3?先加0,在作一次加法可行。
乘4?加兩個0。
......
除法器
除法器的設計就比較麻煩了,這裏不進行展開,有興趣的同窗能夠參考如下連接:
乘法器除法器的製做——百度文庫
......
ok!以上一通分析以後咱們獲得了加減乘除四則運算的器件了,咱們接下來能夠進行更高難度的計算了。
好比:
A×B+C
這就須要先保存A×B的結果,在與C相加,等等...保存?話說在計算機內部是用什麼方式保存數據的呢?
這就得講講寄存器的相關知識。
因爲保存數據的重要性,科學家一直在思考在電路中使用何種方式能夠保存數據,好比使某個器件一直輸出高電平,那不就是「1」了嗎?一直輸入低電平,那不就是「0」了嗎?並且還要能夠自由切換「0」和「1」。
通過一陣鼓搗,科學家們發明了鎖存器這個東西,它有什麼用?它能夠根據輸入信號來改變輸出狀態。
鎖存器是具備記憶功能(也就是存儲功能)的基本單元,最簡單的鎖存器能夠存儲一位二進制信息。
它有兩個特色:
最簡單的S-R鎖存器它是由兩個「或非」門電路或者「與非」門電路構造出來的:
R、S是鎖存器的輸入端,前者通常被稱爲復位(Reset)端,後者爲置位(Set)端,Q和Q加一槓是互爲相反的輸出(你0我1,你1我0)。
注意到這個電路跟以前咱們看到的都不同了,其門電路的輸出會做爲自身的輸入,這種結構被稱爲反饋電路。
分析一下「或非」門電路構成的鎖存器的工做原理,這其中涉及穩定態和不穩定狀態,假設輸入以前的Q爲1,槓Q爲0:
不太明白?那就祭出真值表吧!下圖是RS鎖存器的真值表:
由S-R鎖存器派生出各種其餘的鎖存器和觸發器,好比D鎖存器、S-R觸發器、D觸發器等等,有興趣的能夠看看文末的參考連接。
順帶一提,觸發器引入了時鐘信號的概念,這有什麼意義?
其實時鐘信號是爲了規範計算機中的各種電路的執行時機,就像小時候玩的「321不準動」,只有當固定的時鐘信號來臨時,各元件纔會改變自身的狀態。若是沒有時鐘信號來管理時序,那麼各元件的變化就會雜亂無章,極不穩定。
有了鎖存器和寄存器,就能夠並聯構成寄存器,一個鎖存器能夠存儲1位,4個並聯就能夠存儲4位......總之,咱們得到了一個能夠存儲數據的東西了。
忽然發現咱們如今手頭可用的元件愈來愈多的,這就有一個問題,咱們如何控制使用哪一個元件呢?總不能本身手動更改線路鏈接吧?
注:之前真的是手動更改。
咱們能不能經過輸入幾位二進制數,就能夠實現使用對應的元件呢?就以3位舉例。
3位二進制數最多能夠表示8個輸出(2^3)。
內部怎麼實現的?3位的太複雜,找了個2位的將就看看。
上面介紹的這個東西被稱做譯碼器,它將輸入的二進制碼譯成對應的輸出高、低電平信號,實現選擇邏輯電路的做用。
還有一個問題,**那就是這麼多的元件,咱們到底選擇哪個的輸出呢?就比如水壩放水選擇哪個閘門同樣,引出****選擇器的概念。**選擇器能夠根據輸入二進制碼的狀態,選擇其中一個做爲輸出信號。
利用門電路咱們能夠構造它,有了它就能夠得到對應的輸出:
sel輸入0,那麼out就輸出a的值,輸入1就輸出b的值。
上面只能二選一,還能夠進一步四選1、八選一等等,下圖是四選一選擇器:
若是咱們將以前獲得的各個四則運算器、鎖存器、寄存器等等加一個輸入端口,該端口(激活引腳)爲1,這個元件才能用,利用選擇器和激活引腳,咱們就能夠控制選擇的的元器件了。
其實寫到這,計算機底層的基礎知識也就差很少了,最後再講一講編程語言與以上咱們所講解的東西之間的聯繫。
假若有一個CPU,僅有8個引腳,其中4個數據引腳,4個指令引腳。
數據引腳是能夠輸入數據,指令引腳是用來選擇執行的操做。咱們定義,當指令引腳輸入:
0001 讀取數據,將數據引腳的數據讀入寄存器;
0010 選擇加法器,將數據引腳的數據與寄存器數據相加,結果在寄存器;
0100 選擇乘法器,將寄存器的數據乘以數據引腳的數據,結果在寄存器;
1000 清空寄存器。
也許會疑惑怎麼經過指令來執行相應的操做呢?不要忘了咱們已經有不少可用器件,好比譯碼器,就能夠經過4位的二進制數據,來選擇對應的加法器、乘法器等等。
以上就是最簡單的指令譯碼過程,實際場景下的指令固然不止這幾種,而是成千上萬,其中的邏輯電路就複雜的使人髮指了。咱們不用考慮複雜場景,僅從最基本的入手,畢竟再複雜的場景也是由基本的元器件構成的。
假如0001 0001 就是輸入0001將它保存到寄存器中。
好了,咱們以一個計算題來舉例:3×5+6,輸入依次爲:
0001 0011
0100 0101
0010 0110
ok,咱們再計算一個「稍微」複雜一點的:3*6+8+9+10+11×5×6×7×8×9+15。
指令輸入我就不寫了,太麻煩了。這仍是咱們只定義了4種指令,要是成千上萬種這誰頂得住?
咱們不妨對指令稍微包裝一下,規定:
0001 用MOV表示
0010 用SHL表示
0100 用ADD表示
而且假設如今又多了一個元件能夠實現十進制到二進制的轉換,那麼命令應該爲:
MOV 3;
SHL 5;
ADD 6;
稍微好受一點了,這就是所謂的彙編語言,以前僅有0和1的語言稱爲機器語言。
可是仍是以爲有點不暢,明明就是計算一個3×5+6,我爲啥非得要寫三行,一行不行麼?!
好比直接輸入:
print("%d:/n",3×5+6);
複製代碼
上面的這個就是大名鼎鼎的C語言,在計算機中上面的輸入實際上是通過一系列稱之爲「編譯和彙編」的操做,編譯將C語言轉換爲彙編語言,彙編將彙編語言轉換爲機器語言。
相似於C這樣的語言還有不少,好比java、golong、C++、python等等,它們都有一個共同的名字——高級語言。
高級?高級就在於使用這些語言來編程,相比於機器語言和彙編語言已經很人性化了,具備很強的可讀性。
若是之後出現「終極語言」、「天選語言」也別奇怪,在計算機這條路上前人都是爲後人鋪路,不管是二極管、門電路、邏輯電路、寄存器、譯碼器,仍是機器語言、彙編語言、高級語言等等,後來者都是在前人的基礎之上再造、濃縮、改編、起舞。
這是一個螺旋上升永無止境的迭代之路,這也是爲何標題的「終」要加一個引號的緣由,計算機的道路永無止境,我的的學習也是永無止境的。
咱們所熟知的計算機組成結構很簡單:主機+顯示屏+鍵盤+鼠標。音樂發燒友或者遊戲愛好者對音樂要求較高,因此還要加上一個高品質的耳機;程序員可能須要常常拷貝程序,因此還要加上移動硬盤什麼的······
上面其實只提到了計算機的硬件部分,一個完整的計算機系統包括硬件部分和軟件部分。硬件部分就是你所能看見的、摸得着全部設備、芯片、硬盤、鍵盤等。軟件部分就是電腦啓動、電腦運行過程當中那些可見或不可見的程序。如圖所示:
上圖裏的東西太多了,咱們將其簡化爲一下四個部分:CPU、存儲器、IO(輸入輸出設備)、軟件。
一句話簡單介紹幾個部分之間的關係:CPU從存儲器中得到軟件代碼並執行,還利用IO設備與用戶交互。
CPU能夠說是計算機的靈魂和核心,起着操控全局、數據運算(控制器、運算器)的功能。有關它的實際硬件構成詳見以後的「從沙子到CPU」,這裏只對其邏輯上的構成進行介紹,即控制單元、存儲單元、運算單元。
·控制單元是CPU的控制中心,負責執行指令和操做控制電路等。
·存儲單元是存儲CPU運行中、運行後的結果元素。
·運算單元主要是對存儲單元存儲的元素進行邏輯(或、與、非等)運算。
三部分的關係以下:
控制單元
控制單元的組成包括包括:
·指令寄存器IR(Instruction Register):存放指令的倉庫,減少CPU去內存中讀取指令的次數;
·指令譯碼器ID(Instruction Decoder):將指令轉換爲機器碼,使得運算單元和寄存器能夠理解(進行相應的電路操做);
·操做控制器OC(Operation Controller)等
它依次從存儲器(內存/外存)中取出各條指令,放在指令寄存器IR中,經過指令譯碼器ID肯定應該進行什麼操做,而後經過操做控制器OC,按肯定的時序,向相應的部件發出微操做控制信號(之後會講)。
存儲單元
存儲單元的組成包括:
·CPU片內緩存
·寄存器組
它是CPU中暫時存放數據的地方,裏面保存着待處理或已處理的數據,CPU訪問寄存器所用的時間要比訪問內存的時間短。寄存器組可分爲專用寄存器和通用寄存器。專用寄存器的做用是固定的,分別寄存相應的數據。而通用寄存器用途普遍並可由程序員規定其用途,通用寄存器的數目因微處理器而異。
採用寄存器,能夠減小CPU訪問內存的次數,從而提升了CPU的工做速度。但由於受到芯片面積、集成度以及成本所限,寄存器組的容量不可能很大。在任務管理器中點擊性能頁面,即有如圖所示界面:
從圖片右下角能夠看到,該CPU有三級緩存,而且容量逐漸增大。
運算單元
運算單元能夠執行算術運算(包括加減乘數等基本運算及其附加運算)和邏輯運算(包括移位、邏輯測試或兩個值比較)。運算單元所進行的所有操做都是由控制單元發出的控制信號來指揮的。
CPU工做原理大體以下圖:
計算機中的存儲器分爲內存儲器與外存儲器。CPU與內存儲器直接打交道,即咱們常說的內存,它其中存放着當前正在運行的程序與數據,一旦斷電,其中的數據就丟失,速度較快。外存儲器也是存放數據的媒介,即咱們常說的軟盤、硬盤、光盤和磁帶等,能夠長時間保存數據,速度較慢。
IO設備便是計算機與用戶交互的媒介。如常見的鍵盤、鼠標、打印機、掃描儀、顯示器、讀卡機、紙帶、耳機等等···
簡單來講,就是用戶能夠看到計算機想咱們看到的東西或者輸入某些計算機想獲取的東西。
軟件便是計算機中的程序,它是用戶與硬件之間的接口。若是是除軟件以外的三個部分是「軀殼」,那麼,軟件就是「靈魂」,只有當「軀殼」和「靈魂」皆有,這纔是一個真正的計算機。
軟件還可進一步分爲系統軟件和應用軟件。
前者即常聽的Windows、Linux、Android、IOS等等。後者就是用戶啓動或其餘程序調用的軟件。好比Word、Excel、QQ、微信等等。
靈感來自:
CPU 是怎麼認識代碼的? - Zign的回答 - 知乎 www.zhihu.com/question/34…
【數電】(二) 基本邏輯運算與邏輯門電路
計算機組成與設計
數字電路鎖存器詳解
鎖存器、觸發器、寄存器的區別聯繫
數據選擇器
手寫操做系統(1)——Hello OS blog.csdn.net/ll159825344…
"本站全部文章均爲原創,歡迎轉載,請註明文章出處:blog.csdn.net/ll159825344…" 本次更新:2021/5/24