有哪位大神能用簡單的語言,解釋下硬體和軟體是如何結合的,代碼如何控制硬體機器?

到現在一直不理解,軟體是如何控制硬體的。


2016-08-04 更新: 補充了MOSFET章節。(這次更新比較粗糙,並沒有字斟句酌,而且可能有知識點上的錯誤和沒解釋清楚的地方,會不斷更正)

這一塊會比較無聊,但是對於理解邏輯門的物理實現還是至關重要的。

我本人也是忝列門牆,學問有限,故只擇其精要,陳述於此。

另:非常感謝大家給我的贊和感謝,我定當努力。

--------------------------------------------------------------------------------------

2016-02-18 更新(修改):將之前的一些不恰當處稍事修改,改了一些病句。

雖然觀者寥寥,但既然有人點贊,有人感謝,那我就當不吝分享所知所學了。

免責:因為本人沒有考證癖,多數內容也純粹靠記憶寫下,難免有錯誤,紕漏,望多包涵 反饋。

——————————————————————————————————

目錄:

1. 二進位理論

2.數字電路的實現

3.CPU 對硬體的控制

4.最終章(解答樓主問題)

補充:

5.邏輯門的物理實現:MOSFET

6. 軟體控制硬體實例:SD CARD(待續)

7. I2C協議詳解(待續)

8. FPGA 與 ASIC(待續)

=========================================================

作為啃了幾年書本,燒過幾塊電池的工程狗,那我就來科普一下吧。

不算大神,唯手熟爾。

我們不妨從最底層開始往上走。

1. 二進位理論

眾所周知,電腦,手機以及其他大量的電子設備,都是基於複雜的數字電路進行工作的。而數字電路則通過循環往複地完成一系列的指令,來輸出我們想要的結果。

那究竟裡面的工作原理是什麼樣子的呢?

首先,我們需要一套數字理論。

上帝說,我們需要一個理論。於是萊布尼茨誕生了。

萊布尼茨提出了二進位,這成為了現代計算機理論的基礎。至於是老子啟發了他,還是他自己坐而悟道想出了二進位,其實已經不重要了。有了二進位,一切變得簡單起來:

我們可以只用1 和0 來代表所有數字,進行和十進位一樣的代數運算。雖然對於人腦來說,二進位非常不雅觀, 比如:

10001010101010101010 * 0101001101010 = 0101101001000001010011100110100。

但它對於計算機來說, 則最簡潔,最直觀,最高效。

1.1 二進位運算

每一位都只可能是1或者0,運算符號也就是加減乘除。雖然長,位數多,但速度極快!因為,但就每一位來說,運算之後,只會有幾種情況:

1 + 1 -&> 0, 進一位(, 這個)

1 + 0 -&> 1.

0 + 1 -&> 1.

0 + 0 -&> 0.

所以說,《三體》中,劉慈欣講到人肉計算機一說。單個運算單元只需要記住特定指令相對應的操作即可,甚至連加減乘除都不需要會。 但這個在現實裡面並不可能完成。假設這個運算恆紀元的程序有10000條指令(但顯然這個條件都不成立,因為這個程序必然很複雜,涉及複雜的浮點運算和邏輯演算法,甚至還有平方開放積分微分,10000條機器代碼都不夠塞牙縫的), 每條指令需要100個邏輯單元,每個單元的運算時間1秒鐘,那麼整個程序就需要1000000s (11天13小時46分鐘)。。。所以可能程序還沒算完,亂紀元又來了,所有人來不及脫水都死了。這還不算髮盒飯,上廁所時間。

1.2 二進位邏輯

而且,電腦可以理解是非對錯了。計算機以1表示「對」,「是」,「正確」。以0表示「錯」,『否』,『錯誤』。然後又引進了「或」,『與』,『否定』,等邏輯語句。

我們用 || 表示「或」,表示兩者有一個成立即成立(我是學工科的(1) || 我是學計算機的(0) = 我沒有女朋友(1))。

0 || 0 = 0

0 || 1 = 1

1 || 0 = 1

1 || 1 = 1

我們用 表示「與」,表示兩者都成立方可成立。(我是學工科的(1) 我是男的(1) = 我沒有女朋友(1))。

0 0 = 0

0 1 = 0

1 0 = 0

1 1 = 1

2. 數字電路的實現

2.1. 邏輯門

我們有了數字理論,那怎麼才能做出邏輯電路呢?怎麼才能用來運算呢?我們引入這些理想的邏輯門,靠他們來作運算。

這個就是與門,除非兩個輸入都是1,則輸出1, 否則輸出0.

這個就是或門,除非兩個輸入都是0,則輸出0,否則輸出1.

這個就是非門,它會對輸入取反(1變0,0變1 )

這個叫或非電路,除非兩輸入相同則輸出0,否則輸出1

現在,僅用一個理想原件,就可以做一次邏輯運算了!

那如何做代數運算?比如加法?

以上的電路就能完成2以內的加法了。

當兩個輸入都是0, 高位輸出0, 低位也是0 =》 0

當兩個輸入都是1, 高位輸出1, 低位也是0 =》 2

當輸入一個0一個1,高位輸出0, 低位也是1 =》 1

所以,大家也看到了,這個邏輯電路其實並不明白加法,它只是照部就搬的給我們了碰巧正確的結果——這就是我們常說的『中文房間』的思想實驗。

我們有了2以內的加法,那麼4以內也好解決了,8,16。。。以此類推,我們只要把數字電路互相疊加,就能得到很多功能,比如說加減乘除,求余等等數學運算,相應地,邏輯電路也會越來越複雜:

我們現在有了CPU,他可以完成簡單的運算,但是這還不夠。

我們要編程。

2.2. 編程

程序本身就是指令的集合。

所謂的編程就是將程序員所要實現的效果,用系統支持的指令寫下來。就好比給你一本唐詩三百首,讓你用裡面的詩句組合(雜燴)成你想要表達的意思。

當我們安裝一個程序的時候,它本身實在硬碟裡面的。 只有當我們啟動它的時候,系統才會到硬碟里,找到該程序,然後將其讀取到內存中。

將設我們還在使用一個幾十年前的電腦,這個電腦每次操作只操作的數字只有八個0或者1,也就是我們常說的8位系統。這些指令被存放到內存裡面之後,CPU又會把它當下要執行的那一句放到寄存器裡面,然後執行這條指令。一條接一條,循環往複。

假設我們有一個8位指令。CPU得到它之後,就會分析,這一個指令裡面,哪一段是操作符,哪一段是數字。比如:0101 00 11,它會讀前四位,發現是加法(我瞎編的),然後讀5-6位發現是0,7-8位是3,所以輸出3。

CPU得到3之後,會把它放到寄存器裡面,然後進行後續操作。

當然看似簡單,8位操作裡面的數字電路也會是無比複雜了(這還只是幾十年前的科技,如今intel 64位處理器的複雜程度可見一斑)。

至此,我們已經可以編程了。我們的程序會是這樣子。

00101010

10101010

01001101

01010010

計算機誕生之初,程序的確是這樣的。但假如讓如今的程序員來幹這種事情,肯定又得哭爹喊娘一頓了(誤)。所以,後來,出現了彙編語言。比如:

MOV R1, #0x1

MOV R2, #0x1

ADD R1, R2, R1

這是ARM的彙編指令,讀出來如下

在寄存器R1裡面裝1,

在寄存器R2裡面裝1,

計算R1 + R2 並將值放到R1裡面。

這就是一個簡單的加法程序了。

但是呢,這種程序寫起來還是很不舒服,效率極低。

於是高級語言語言。

int a1 = 1;

int a2 = 2;

a1 = a1 + a2;

這是c語言裡面的一個簡單加法。這個程序被我寫完之後,會被編譯出來——也就是有一個c的編譯器,將這個程序轉換成01010101 這樣的指令(往土了說,就是個翻譯機,把人類語言翻譯成10)。當我們運行這個程序的時候,電腦會把這些東西放到內存裡面,然後逐行的讀取,然後一行行的運算。

好了,我們可以回歸問題了。

3. CPU 對硬體的控制

3.1. 對CPU的誤解

在我學習這些東西之前,我對CPU有一種誤解。我以為在電腦裡面,只有CPU是活的。換句話說,整個電腦裡面,事無巨細,都是CPU一手操辦的,就像一個勤奮的全棧工程師一樣。

其實,CPU更像是個產品經理。

舉個例子,我們的電腦裡面有藍牙。藍牙裡面其實也有一個CPU,更確切的說,是個MCU(Micro Control Unit),它負責將無線藍牙信號解碼成數字信號等一系列的操作,而CPU得工作只是協調MCU做相應的工作而已。

給個場景:你打開了聽歌軟體,輸出設備是藍牙耳機。

軟體:哥,給我個耳機唄。

CPU:大妹子,耳機沒插,倒是有個藍牙耳機。

軟體:那哥,你告訴藍牙,俺要在他那裡唱歌唄。

CPU:歐了。

CPU轉向藍牙。

CPU:嘿,那個傻大個,說你呢,瞅啥,俺大妹子要你給她幹個活。

藍牙:哥,你等會兒。

藍牙:scanning devices.....

藍牙:searching for possible peripherals providing required service.....

藍牙:device BLEX00010EFD010 discovered.....

CPU: 啥玩樣兒啊,讓你干點事兒,咋這麼墨跡呢?

藍牙:哥,這事兒費神,您和大妹子多擔待啊。

藍牙:bonding with BLEX00010EFD010.

藍牙:bonding succeeded.

藍牙:Bluetooth Service Linkage Established.

藍牙:哥,成了,叫大妹子開始吧。

CPU:真墨跡。

CPU轉向音樂軟體。

CPU:大妹子,開始吧。

軟體:哥,叫他唱「我是女生,可愛的女生」。

CPU:轉向藍牙。

CPU:傻大個,唱,「我是女生,可愛的女生」。

藍牙:check linkage lost?

藍牙:linkage quality good.

藍牙:signal to noise ratio: -20dB.

藍牙:transmission rate:1 Mb/s.

藍牙:我是女生,可愛的女生。。。。。

所以,在這個實例裡面,CPU只是充當了協調領導的角色。所以一個程序得以實現,其實仰仗於CPU能順暢,有效的發布指令,和得到結果。

而這些信息的通道就叫 BUS,或者叫匯流排。

3.2. 匯流排(BUS)

就像上網用網線一樣,電腦內部的通信也依賴於匯流排。這些匯流排傳輸數據,指令,地址等一系列的信息,是電腦完成各項計算和操作人物的物理基礎。在計算機內部,每一個硬體設備都以特定的方式與CPU想連。哪怕是外接設備,也可以通過USB,SD卡槽得以連接。

但單單有物理基礎還是不夠的,就像你只有電話線,只有網線,只有天線。

你還需要一些通訊協議。

4.3 通訊協議

誰都有嘴,但並不是誰和誰都可以用嘴高效正確地傳遞信息。(我就發現,一和女孩子講話,我就懵逼。) 而一門共同的語言就像是一個協議,確保雙方所言所聞都能被正確的處理。匯流排也一樣,也需要有一套既定的協議,得以讓信息能在CPU和MCU之間正常往來。比較常用的協議有SPI, I2C, UART, 等等。這些協議規定了,什麼指令表明什麼含義,什麼時候可以發信息,有幾條數據線,電壓多少,頻率多少,等等。事無巨細,一律都有非常嚴謹統一的規定。

為了不讓看官厭煩,我也不會跟老學究老教授一樣說一堆,如果後面有空間,我可以舉幾個例子,這邊我暫且按下不表。

4. 最終章:總結暨對這個問題的直接回復

當程序員在電腦的終端寫下一行命令,比如說"turn off the bulb"(我們假設有個程序員在CPU上接出一根電線到一個小燈泡上面) 。從打下到執行有如下步驟。

我們的這句話會被編譯成若干個指令,就像(瞎編):

0101 0000(翻譯:CPU把0寫到內存里特定的位置),

00010101(翻譯:通過匯流排,用I2C,叫一下小燈泡的MCU),

然後小燈泡被叫了一下之後,自己到約定的這個內存為止去讀數字,發現是0,所以輸出0,這個0 就是個低電壓,可以理解成0V,然後0V和5V與邏輯之後,就是0V,所以小燈泡就關了。

當然,我上面也純屬扯淡,這個指令不可能用短短几行代碼來完成。使用I2C協議本身可能就需要超過一百條代碼:通過吧某些地方的電壓拉低,某些地方的電壓拉高,來完成通信,有點類似黑幫片裡面交易雙方互相閃車燈。

今天先寫這些,後面有時間會再補充一些內容。

看官們鼓勵一下把。

-------補充-------

5. 邏輯門的物理實現:MOSFET

有了理論上的邏輯門,現在需要做的,就是著手設計切實可用的邏輯元件。從最開始的陰極管到現在的晶體管(Transistors),在過去的大半個世紀,這些邏輯元件的實現經歷了數次更新迭代。無論在速度,穩定性上,都出現了質的飛躍。

今天,我們就來講一下MOSFET(metal–oxide–semiconductor field-effect transistor,金屬氧化物場效應晶體管),它是現如今電子行業用的最多的邏輯元件,比如說我們常聽到CMOS技術等等,就是基於MOSFET。

但是,在開始之前,我們必須先涉獵枯燥的,玄幻的,又非常重要的半導體理論。

5.1. 硅

一切都要從硅開始說起。

硅,其實並不稀奇。

地球上最多的元素:氧硅鋁鐵。這個我們都會背。

如果說沒有貝爾實驗室和那一群伯樂(我忘記那些科學家的名字了),可能硅還是會很平凡的,作為砂石,存在這個星球上。

硅,基於我非常有限的高中化學知識:四價,共價鍵,非常穩定,不易得電子,不易失電子。

除了穩定,看似沒什麼鳥用。但是,當少量的+3/+5價單質(如:Ga/As)被混入硅之後,我們就真的化腐朽為神奇了。

比如說,假如我們把0.1 Mol的As混入了1 Mol的Si之後,因為As為+5價,所以相比於Si,那個多出來的電子非常活躍,容易脫離原子核。這就導致一塊不帶電的混合物裡面,有大量的(這裡,大量只是相對於一塊Si單質)帶正電的原子核(+5As丟了一個電子)和同等量的遊離電子(e)。我們稱這塊混合半導體為n-type(negative)。

到這裡其實非常好理解。easy peasy。

同理,我們可以想像把0.1 Mol的Ga混入另外一個1 Mol的Si裡面。這時候,那些牛逼的理論物理學家在這時候引入了穴的概念(Holes)。因為Ga特別容易得電子,導致有些Si的電子會被Ga偷取,留下了一些穴,而這些穴,就像+1的電子,也會不停的運動。我們稱這個半導體為p-type(positive)。

然後,當我們把一個p-type 和一塊n-type放在一起的時候,神奇到讓人無法相信的事情發生了。

(我覺得我可能都講不清楚~~~~~~~)

5.2. PN Junction(PN 結)

我們可以自己做一下思想實驗,接觸面兩邊鄰域的電子和穴會互相中和,導致這一塊區域(depletion region)的電子和穴非常稀少,而那些固定的原子核(包括帶+1的As和帶-1的Ga)並不會變化。他們會造成一個穩定的電場,阻止了其他地方的電子和穴湧入。於是一個動態穩定(dynamic equilibrium)形成了,如圖。

為了看官不頭疼,這裡我省去若干章節。總而言之,言而總之。到這裡,我們就得到了一個二極體。

當我們施加一個正向電壓的時候,depletion region會因為電壓的緣故變薄,大量的電子和穴得以穿過,造成很強的電流。而當我們施加一個反向電壓的時候,depletion region會變厚,電流無法通過。

wah lah ~

5.3. 場效應晶體管

有了這個理論,後面要做的就不難了。(Bazinga!寫到這裡我已經徹底懵了,我是照著參考書寫的。)

一個MOSFET就長這樣。

為了便於理解它的工作原理,我們可以把它簡化成這樣:

當我們不給Gate這個電壓的時候,我們得到了兩個典型的PN Junction(Drain Subtract, Subtract Source),電流是無法流過的。

當我們給Gate施加一個正電壓的時候,Gate的上層帶正電,下層則帶了負電。但因為Gate是個不導電的金屬氧化物,所以它的下部會形成一個n type 通道(induced electron inversion layer)--電子可以直接從Source流到Drain。於是,我們得到了一個電流通路。

這就是我們的邏輯開關了。

最後,我們需要了解,MOSFET可以分為兩種,一種叫P-MOS, 一種叫N-MOS。我們上面的圖例其實是NMOS因為整個的載體為電子。很顯然,PMOS的載體就是穴,它的source和drain都是P-type。

在現實的使用中,兩者的區別就是:

High Gate Voltage Low Gate Voltage

PMOS 斷路 通路

NMOS 通路 斷路

5.4. CMOS (Complementary MOSFET BALABALA)邏輯電路

單個的MOSFET似乎並沒有神力,但當若干個mosfet組合到一起,我們就可以很輕鬆的得到各種我們想要的邏輯門。

這個圖例看起來很複雜,但其實是個紙老虎。首先,我們給Vdd通5V電源。

假設兩個輸入都是1, 即5V。對照5.3.的最後的表格

Q1: 通

Q2: 通

Q3: 斷

Q4: 斷 (Q1 和Q2 通導致Q5和Q6的Gate連到了5V,也即高電壓上)

Q5: 通

Q6: 斷

所以,輸出連接到了Vdd,也即5V,也即1.

同理,其他易證。

6. 軟體控制硬體實例:SD CARD

7. I2C協議詳解

8. FPGA 與 ASIC


以下基於一個十分簡單的FPGA微指令單片機原型進行說明。

和當今計算機系統結構有一定的區別,但是容易理解和教學。

主流的計算機教材都會以此原型來講解計算機的組成。

0

計算機有許多部件,每個部件都能做一些事情。

它們都是用「開關」控制的。

於是一個功能很多的計算機,有著數量巨大的「開關」。

1

要完成一件事,就是要按照一定的方式撥動這些「開關」。

撥動「開關」的不同,完成的事情也就不一樣。

2

寄存器可以保存一個數據,當然是二進位的。在它的輸出那裡,數據的0就是不通電,1就是通電。

這剛好就是一個「開關」。

3

於是我們把控制硬體的「開關組」換掉,換成寄存器的輸出端。

寄存器里的保存的數據變成了開關的「通、斷」情況。

這個特定的數據,剛好讓硬體的開關完成了一件基本的事。

4

於是大家把這個數據叫做「微指令」,意思是它是一個指令(完成一件事情)的一個步驟。

5

然後在寄存器里換上另一個數據,它是這個指令的下一個步驟。

這個寄存器就叫微指令寄存器

6

計算機中有一個系統叫「時鐘」,這個系統每隔一段時間就會發一個信號出來。

7

人們把所有的微指令都保存在一個存儲器里,按照順序排列起來。

每收到時鐘發來的一個信號,就把下一條微指令放到微指令寄存器中。

8

由於不斷的收到時鐘信號,微指令寄存器里不斷的更新著新的微指令。

控制硬體的開關們,也隨著微指令寄存器里的值的不同,

通通斷斷的工作著。

硬體本身就這樣一點一點的工作著。

9

存儲這些微指令的存儲器也有一個「開關組」,

隨著這些開關的不同,這個存儲器存到微指令寄存器里的數據就不同。

於是我們用了另一個寄存器來存放控制這些開關的數據(也就是指令)。

這個寄存器我們叫做微地址寄存器

10

微地址寄存器也會接收時鐘信號。

而且它只要收到時鐘信號,就會自己把自己內部的數據+1。

這樣微指令存儲器的「開關」就指向了下一條微指令,於是就會給微指令寄存器更換成下一條微指令了。

11

我們把這個「計算機」能做的所有的事情都存在這個微指令存儲器裡面。

因為一件事情的幾個步驟(幾個微指令)總是放在一起,這幾個微指令就稱為一條「指令」。

當我們想要使用這條指令的時候,

只需要修改微地址寄存器里的數據,讓它變成這條指令的第一條微指令的地址。

這樣,在下一個時鐘信號到來的時候,這條微指令就會被放到微指令寄存器里,開關撥動了,硬體也做出了反應。同時微地址寄存器+1。

然後又來一個時鐘信號。。。

如此反覆,直到這條指令執行完畢。

12

你寫的程序,就是一條一條的指令,存在內存里。

當它運行的時候,這條指令被取出來,存到指令寄存器(IR)里。

IR會根據它裡面的數據,去修改微地址寄存器里的數據。

這樣這條指令就能被執行了。

13

內存很大,我們要知道從內存的哪裡獲得指令。

於是我們用一個寄存器來存指令在內存的何處。這個寄存器就被叫做地址寄存器(AR)。

存放到IR中的數據,就是內存中在AR里存放的數據所對應的地址上的那個。

這個關係和上面的微地址寄存器和微指令寄存器的關係是一樣的。

14

程序開始執行的時候,計算機內另一個稱作程序計數器(PC)的寄存器中的值變為0

這個寄存器是存放現在執行到第幾條指令了。

知道了現在是第幾條指令,就可以計算出AR應該存放什麼樣的地址了。

15

每條指令的最後一條微指令的作用都是讓PC+1。

16

你寫的程序就是按順序排列的一條一條的指令而已。

17

當執行了一條指令,這條指令的地址送入AR,這時內存會找到這條指令的內容,把它存入IR。

根據IR中的微指令開頭地址,修改微地址寄存器,這樣微指令寄存器就是直接對硬體的操作了。

18

每一個時鐘信號的來臨,微指令寄存器就會改變,這條指令就會繼續執行下去。

最後一條微指令是PC+1

19

PC+1之後,IR就會變成下一條指令的地址。然後取出下一條指令,然後執行。

20

執行到一半,某條微指令居然把PC的值減少了15?

原來程序遇到了一個循環,退回了15條指令重新執行。

21

你的計算機的程序就是這樣從數據變成指令再變成開關的通斷來控制你的硬體的。


很難描述清楚,建議看一下這本書:編碼:隱匿在計算機軟硬體背後的語言 [Code:The Hidden Language of Computer Hardware and Software]

從最簡單的信息傳輸二進位和與非門講起,逐漸搭出各種相對複雜些的基本模塊,然後通過機器碼、彙編如何控制硬體處理,認真看完這本書就能知道計算機軟硬體的底層奧秘。


我來用個最簡單的例子來解釋一下吧,計算機最擅長計算了,所以咱們就以C語言加法為例:

a=b+c;

要想知道這句話是怎麼在CPU上執行的,首先我們要把它編譯成彙編語言,這樣就直觀了:

lw r1,0(r4) ;把b從內存讀入寄存器r1

lw r2,0(r5) ;把c從內存讀入寄存器r2

addi r3,r1,r2 ;調用加法器

sd r3,0(r6) ;把結果寫回內存

看完上面幾句就大概知道硬體執行代碼的流程了,在高級語言里,一條語句往往對應好幾條彙編指令。然而,彙編還是用來給人看的,代碼在真正執行的時候會被編譯成機器碼,這個機器碼一般會是2~4位元組(僅憑記憶,待考證),也就是16~32位,其中不同的位代表不同的意思,CPU拿到這條指令,將其解碼,再調用相應的硬體模塊,就ok了。

當然現代CPU往往有流水線機制,一條指令又往往被拆成多個stage來執行,以加快CPU的吞吐率,經典的MIPS構架是5 stages:取指、解碼、執行、讀地址、寫回。

軟硬體結合的另一個例子就是單片機了,和CPU的差別就是單片機集成了內存,定時器,PWM,以及各種通信模塊,不過速度往往是CPU的1/10~1/100.單片機編程里,調用硬體的方式有點區別,一般是直接往一個寄存器里寫數據就可以直接調用一個硬體模塊了。以AVR單片機為例,比如要啟動一個定時器進行一個100周期的定時溢出中斷,要這樣寫:

SREG=0x80 ;使能全局中斷

TIMSK|=(1&<&TCCR0=0x01 ;配置定時器工作模式,普通

TCNT0=0x64 ;定時時間100

如果想更深入了解計算機的工作機制,可以讀讀下面兩本書,都是經典:

計算機組成與設計:硬體、軟體介面

深入理解計算機系統


簡單的語言:軟體分為低級語言和高級語言

高級語言是低級語言的抽象。低級語言是硬體邏輯電路的抽象。那麼軟體的一行高級代碼,分解為若干行低級語言,然後由編譯器分解為若干指令集中的指令按順序執行。底層硬體收到二進位碼(實際是硬體電路的編號)以後,通過查詢列表找到對應硬體電路,然後將其使能,即可執行。

舉個實際的例子,比如a=1,收到這個指令後,底層軟體首先會在存儲區開一個空間,然後把常量1放進去,然後返回一個完成狀態。這裡對應著一系列硬體操作,以放常量1為例,晶元內部可以看成一塊電路板。當賦值時,首先讀常量(假設這款晶元常量都存在緩存),然後寫賦值。讀指令會讓所有的緩存讀埠使能,後面跟著地址是直接接到緩存地址介面上的。所儀讀指令一來,數據介面就給出常量值。因為有賦值語句,所以數據介面與寫入賦值介面的邏輯開關又打開了,這時候又來個寫指令,於是數據就被放到賦值緩存里了


我也和題主有過同樣的疑問,那就是軟體虛擬的,而硬體是實實在在的thing,它們之間到底怎麼實現連接的呢。

其實所謂軟體,它也是「硬體」,只不過這個硬體是軟體的一種體現方式,軟體讀著是各種演算法,控制方式,體現在「硬體」上就是0和1,這個0和1在遠古時期是卡帶,在現在是各種存儲介質,變的是形式,不變的是軟體依然是體檢在「硬體」上的0和1的排列。

說到這,你應該能明白了,軟體其實就是「硬體」,而硬體和硬體的連接那就容易理解多了,無非就是有電(1)和沒電(0),數字電路裡面就是通和斷,進行組合實現邏輯判斷,輸出也是通和斷,也就控制了你的顯示器亮和不亮。

前面很多大神回答的很好,也很準確,也很專業,但是如果沒些許的專業知識還是不容易理解的,其實他們的回答就是活生生的教材,現在贊同最多的回答,算是對專業知識的通俗講解。

手機手打,回答的處於半專業無限靠近非專業,希望能解答題主疑惑。


軟體控制硬體 = 指令集控制電流通斷

Keyword: 寄存器


坐過火車沒?你可以把乘客當成數據,鐵軌當成電路,火車站就是一些寄存器,或組合邏輯電路。

全國的鐵軌,車站都是布好的,那麼就是表示硬體做好以後就不能改變了。

現在有一數據(乘客)坐上一列火車從成都站出發,出發以後有四種選擇可以向東去貴州,也可以向北去西安,向南往雲南,向西往西藏(在計算機里搬移數據還是運算數據,做加法還是做乘法就是這個方向)。

那麼鐵軌是如何決定火車的方向呢?鐵路局通過一系列道閘來切換列車行駛的方向。一個地方道閘往往只能在兩個方向中選一個。只有按照順序選對了道閘的方向,列車才會把乘客送到正確的地方。是不是很像電燈開關?實際上道閘在計算機里就是開關。而道閘搬動的順序,我們就叫它程序。

計算機原理就是按照順序搬動一系列開關,讓數據到達對應的組合邏輯。如此往複。一二三四,二二三四,再來一次。

把這些順序或者開關組合,合到一起,打個套路,就形成了指令。比如成都-帝都,開啟或關閉x-y-z-h-i-l道閘。

一堆指令就組成了程序。


簡單的語言呀。

就類比一下人吧。

代碼就類似神經信號,硬體就是你的身體。

代碼輸入硬體的時候,硬體也會產生相應的反應,就像你的身體收到神經信號的刺激會反應一樣。

還有,代碼和神經信號其實都是電信號。

不是大神,先就這樣簡單說說吧。


軟體接受人類語言或操作,然後翻譯成硬體能讀懂的二進位碼,二進位碼變成不同的電流,電流變化使硬體工作。說白了就是軟體控制電流變化,使硬體工作。過程:高級計算機語言→計算機操作系統→計算機硬體→構成硬體的數模電路→構成數模電路的元件。


這是一個存儲單元和一個三極體開關。

存儲單元里的值可以決定三極體的通斷:1-&>通,0-&>斷。

存儲單元里存的你可以叫軟體/數據。三極體就是被控制的硬體。數字電路無非就是這兩種元素的各種組合了。

更多種的存儲器:SRAM/DRAM/硬碟/光碟

更多三極體組成多種電路:與/或/非門 -&> 加/乘/邏輯運算 -&> ALU/介面電路 -&> Processor


其實計算機它只知道電平的高低,根據輸入的電平的高低做出相應的反應。而電平的高低又對應著二進位編碼中的0(低)1(高)。所有的軟體最終都會轉換成二進位代碼,就是一長串0,1的組合,然後轉換成相應的高低電平來操作計算機。


首先,很多編程語言最後都會被 「 翻譯 」 成二進位可執行代碼(類似C# Java這種暫不討論)。這些二進位代碼會被儲存在硬碟上。當操作系統調用這些代碼的時候,這些二進位代碼會被放入CPU的代碼儲存區。然後再按照代碼規定的步驟一步一步被放入各種儲存器,被ALU執行計算。最終產生不同的結果。

為什麼二進位代碼能控制CPU?是因為二進位代碼裡面有指令和數據。CPU會執行這些指令來操控數據。

這些二進位記錄了電平高低(就是1和0來)。最後這些高低電平會被CPU中的各種元器件(如與門或門和非門組成的multiplexer,flip-flow等)解析,最後按照一定規則輸出電平。電平輸出到顯示器後,顯示器晶元會解析這些電平,然後激活屏幕上的像素點,於是就能看到圖像了。

就demultiplexer而言,我們可以用兩個控制端控制4個(四個控制端可以控制16個)輸入端中的哪一個被連接到輸出端。通過這樣的器件之間的互相連接,我們就可以解析電平了。


代碼是如何控制硬體的? - 單片機 - 知乎

簡單來說就是沒有軟體,軟體是硬體的另一種表現形式,我們對電腦的每一個操作都是向電腦輸入一連串的高低電平。高低電平就是控制硬體了。


拿人來舉例子吧。你的身體包括腦袋都屬於硬體,你的想法屬於軟體,當你想走的時候,你的腦子通過神經控制身體走路。

再簡單說說計算機原理。指令存在內存中,CPU一條一條地讀取指令,然後根據指令執行相應的操作,一組指令執行一系列操作完成一個功能,那這一組指令就是軟體,執行這一組指令的物理器件就是硬體,包括存儲指令的內存。

你的腦袋好比CPU,存儲記憶等等的海馬體好比內存,神經網路好比匯流排,手腳眼睛耳朵等等好比外設。


我也來湊湊熱鬧吧

這段時間對這個生冷的問題也有了一點點領悟,但是不知道能不能悟到了 。

存儲器本是有大量的晶體管組成的(這個概念相信題主能理解吧),這部分更精彩的講解請移步看 @張軍昭 同學回答的「為什麼計算機能讀懂0和1」。

由這些晶體管的不同組合可以實現不同功能,一般情況下這些器件的正常工作都是要實時通電才可以的,如果組合成存儲器即為易失存儲器,如果在某些器件的控制端(需要保持電平)加一個電容器(可以用來保持電平)不就可以組成了非易失存儲器了。

說到電腦上寫的程序如何與硬體的電平聯繫起來,這個也不難理解,那些0和1的代碼是怎麼生成的呢,說到這個,你想到什麼了,?對鍵盤俠,在敲鍵盤的時候其實是在不斷改變電平的(以5V為例,5V為1,0V為0),每個按鍵按下都會產生不同的電平,然後這些電平會不斷的被存儲在存儲器中。加上前面說的電容,其實鍵盤產生的電平會用來改變電容的電荷(就是電壓吧)。為什麼我們能看到顯示器上的0和1呢,這個就是顯示器的原理了。

完畢!

願廣納批評,本人非專業人士,只是一時興起


硬體處理器是數字電路,數字電路核心是0 1邏輯,軟體用0 1來控制這個邏輯。當然這邏輯是個複雜的邏輯。


老子在德道經中提到,道生一,一生二,二生三,三生萬物,萬物負陰而抱陽,中氣以為和。道0生德1,這是宇宙普適的自然法則。三生萬物中的計算機同樣遵守這個法則。陰為0,陽為1,這兩個一女一男,是道0德1的兒女,能量層級在道父德母之下,並且在德1之母下,調和陰陽能量的平衡。把物質類比為陰為0,把能量類比為1,因為萬物本質就是能量。E=mc2.…所以不論硬體和軟體,都是能量的顯化,準確地說是電能或者光能。能量的頻率相近,就能溝通了。電路開與閉就形成0與1組合,可以表達一切,好比中醫用陰陽思維來診斷疾病一樣。二進制0與1可與人類常用十進制來切換,就形成機器語言,匯編語言,高級語言,三生萬物嘛。故從本質而論,硬軟並無區別,能量而巳。能量有固,液,氣三態,從無形之氣到有形之固液,振動頻率不同罷了。


驅動


寫寄存器


生產的時候有個規定,人為的,定義了電腦遇到怎樣的數字會做出怎樣的動作,比如咱們不說二進位,用一個三位十進位來表示指令:

第一位:1=加

2=減

3 乘 4除………

第二位第三位是要運算的數據,那麼假如電腦硬體收到了234這個數字,便會執行3x4的指令,得到一個12的結果,其中:

2(第一位)就是指令成分,3、4分別是數據成分

只是現在計算機用二進位,乍看不好懂而已

就醬,硬體的規則就是人為指定哪兒是數據成分哪兒是控制成分而已。


推薦閱讀:

頂級配置的組裝電腦,實際性能表現也一定是頂級的嗎?
硬體編程與軟體編程的區別與聯繫?
硬體用戶體驗研究有哪些公司做得比較好,聯想、海爾、魅族算不算?有沒有硬體用研的學習網站?
目前市場上除了蘋果的 Airport Extreme 之外,還有哪些產品可以在2.4GHz 和 5GHz 兩個頻段下同時運行?
誠心求一萬左右的電腦主機配置,剪輯,遊戲用,什麼靠譜?

TAG:軟體 | 編程 | 硬體 | 計算機網路 |