計算機軟體與硬體結合部分的構造是怎樣的?

很多人都知道軟體編程可以控制硬體電路,尤其是做嵌入式開發的朋友,但是軟體是一個無形的代碼,而硬體是機械的動作,像是燈光亮起、馬達變速等,即使是底層代碼像彙編,畢竟也是軟體。那這個軟體的怎麼控制晶體管的呢?軟體和硬體結合的部分在哪裡呢?困擾了好久的問題了,謝謝


很久沒有答題了其實最近真的很忙但是難得今天下午有點空又不想干正事那就上來隨便說兩句好了可以預見到這會是一個挺長的答案但是我還是忍不住啊我到底是怎麼了這樣真的好么……

-----這是現在很流行的分割線-----

-----雖然我也不知道為什麼這東西會流行起來-----

-----但是過了這條線以後我就會嚴肅起來------

這個回答對於一些基本的概念,比如什麼是編碼,什麼是晶體管,什麼是基本的計算機組成等,將不會做具體解釋。如果有朋友不明白的話,那就……去買兩本微機原理之類的書看看吧。

好了,現在開始。我們就用一台普通的電腦當例子來說好了,別的電子系統大同小異,原理都是差不多的。

大家都知道,任何軟體都是0和1的編碼。這些編碼平時是存儲在那些斷電後信息也不會消失的存儲器上的,比如磁帶,機械式硬碟,亦或是現在正逐漸普及的快閃記憶體(Flash Memory)式固態硬碟。快閃記憶體里存的是電子,而磁帶和機械硬碟里存儲的磁極。

圖1: 快閃記憶體(Flash Memory)存儲示意圖。圖片來源:(上)SLC vs. MLC: An Analysis of Flash Memory,(下)Imec Advances NAND Flash Technology with Ultra-Thin Hybrid Floating Gate Cell

以圖1中的快閃記憶體為例(電子比磁極的概念容易懂一點,這裡就用電子做例子了),一個快閃記憶體單元可以理解為一個普通的晶體管加上一層很薄的懸浮柵(Floating Gate),這層很薄的懸浮柵可以存儲一定量的電子(Electron)。當我們把程序寫入或者刪除的時候,其實我們就是在把電子注入或者拉出這層懸浮柵。而這層懸浮柵裡面有或者沒有電子,就會影響這個晶體管本身的開關電壓。淺顯的說,如果這層懸浮柵里沒有電子,那麼我們只要在Gate上加3v的電壓就能讓晶體管Source端的電子流到Drain端;如果這層懸浮柵裡面有電子,那我們需要在Gate上加5v的電壓才能讓Source的電子流到Drain端。有了這個特性,我們就可以定義加3v電壓的時候,Drain端有電流流出為1,沒有電流流出為0。根據這樣的定義,如果我們把很多很多這樣的快閃記憶體單元排列在一起(圖2),統一在他們的Gate上加一個3v大小的電壓,然後在他們的Drain端接一根導線測量一下電流,我們就可以發現有的導線上有電流,有的導線上沒有電流。一個快閃記憶體單元可以做的很小(目前是十幾納米,圖1下),這樣就可以在很小的空間里存下很多0和1了。

圖2,快閃記憶體里讀出的電流有無可以控制燈泡的開關。

好了,目前其實我們已經把0和1從我們的存儲器裡面讀出來了。現在存儲單元里的0和1已經變成了導線上電流的有無。剩下的事情就很簡單了。在最極端簡化的情況下,我們可以用一個電流放大器直接把這個電流放大,然後接在一個燈泡上,這樣我們就可以有一組有亮有暗的燈泡了(圖2)。如果我們每隔一段時間更換一下驅動這些燈泡的導線,也就是讀出不同的0和1值,那我們就可以得到一組不斷變換明暗的燈泡了。如果我們再細緻一點,把這些燈泡變得比芝麻粒還小,並且均勻的排列成一個1024x768的陣列,那我們就得到一個可以顯示黑白圖像的顯示器了——前提是要在之前提到的快閃記憶體單元里存儲進你要顯示圖像的01信息(記住,電腦里所有信息都是0和1的編碼,圖像也不例外)。

當然在實際產品的電路中,電流(也就是電子)的傳遞路徑遠遠沒有這麼簡單。從存儲單元讀出的電流(電子)會經過無數的臨時存儲單元,比如靜態隨機存取存儲器,動態隨機存儲器;無數的算數邏輯單元;無數的傳輸線路,比如SPI匯流排,PCI Express,藍牙,最後達到滿足需求的邏輯,時序和電流電壓大小,從而驅動形形色色的物理部件,比如顯示器,馬達,喇叭等等。所有這些電流驅動的部件,只要信號端的電子根據事先設計好的順序和數量到達,就能夠發揮出他們的設計功能。

綜上,目前主流的電子器件,雖然種類繁多,但歸根結底,其承載信息的比特流,是由電子的流動和存儲來完成的(比較常見的例外是光纖,那裡面跑的是光子,不是電子)。

圖3:早期計算機輸入程序用的打孔紙帶。圖片來源不明。

補充,題主有問電平是怎麼跑到快閃記憶體單元裡面去的,答案是:用另一個程序控制電路把電子打進去的。當然有人又會問這另一個程序是怎麼來的,好像變成雞生蛋蛋生雞的問題了?其實不是啦,就好像 @陸昊天 答案里提到的,最早的程序比特流都是打在紙帶上的(圖3),然後機器們就一直進化知道現在可以用很少的電子就能起到當初紙帶上的孔一樣的作用啦。當然,在邏輯上,紙帶上的孔和快閃記憶體單元里的電子是等價的。是無數工程師科學家的智慧結晶發明出的各種奇巧裝置讓現在的我們可以把簡單的0和1存放在如此小的空間裡面並且能夠自由讀寫。

-----又是流行的分割線-----

-----過了這條線我又要開始亂寫了-----

好了下午過去的差不多了很久沒有寫這麼多中文了很多詞用的應該是完全不對的吧但是我不管了反正差不多就是這個意思了寫的還是比較簡單的如果有高手能指正一下的話最好不過了我關機做飯去了……


結合部分是指令集


想像有一個計算工廠,廠里有一個機器,機器有64個開關,通過這些開關的不同狀態,可以讓這個機器計算加法或者減法,每個開關由一個工人控制。如果今天老闆想算加法了,就給64個工人每人一個紙條,告訴他們把開關置成「開」還是「關」。等工人們按照要求設置好開關後,一通電,加法的結果就出來了。

後來老闆嫌用工成本太高,就想用64個機器人換掉64個工人。他希望找到這樣的機器人:一通電,機器人就把開關打開;一斷電,機器人就把開關關上——這多省事!

然後老闆就一直在找合適的機器人,直到他找到了半導體三極體

然後老闆覺得還是得一個個地通電、斷電,太麻煩,於是就把這64個機器人按照順序排好,還準備了一條紙帶:想讓第一個機器人通電,就在紙帶的第一個位置打個孔(標記為1);想讓第二個機器人斷電,就在第二個位置不打孔(標記為0),以此類推。當機器人都被通知到後,進行運算,計算完成後把紙帶向前移動一列,機器人們就知道新的命令了,這樣效率不知提高了多少倍,於是有了這種打孔紙帶(圖中這個紙帶是給8個機器人看的):

沒錯,這個東西就是包括內存、硬碟在內所有存儲器的祖宗。然後老闆覺得機器太大太笨重,就想把機器做小,越小越好,然後他就用大規模集成電路實現了之前工廠的所有功能。沒錯,這是一個64位的CPU

故事還沒完,但我覺得題主應該明白一串0和1是怎麼控制硬體的了。

——嗯,基本就是這個樣子。

----------------------------------------分割線----------------------------------------

上面說的都是不嚴謹的說明,大牛小牛勿噴。


試著回答一下,不對的地方請大家指正。

==============================一句話解釋================================

因為計算機系統是基於數字電路的 ,而數字電路的功能就是執行「軟體」的邏輯(「軟體」的 0,1 在電路上則表現為高低電平),數字電路輸出高低電平,高低電平則驅動「硬體」的狀態(燈亮滅、馬達變速)。

===============================不詳細解釋===============================

(涉及的內容太多了,每個部分都有厚厚的一本書和課程對應,所以只能大概粗略描述一下)

  1. 人類可以看懂的高級程序語言(以C++為例)先經過編譯器(compiler)編譯,再經過鏈接器(linker)鏈接,最終的結果就是機器碼,也就是一串0,1的組合。機器碼是給CPU看的,普通人類基本是無法看懂的。這一部分只涉及題主說的「軟體」。(大學課程:C++程序設計)
  2. 前一步生成的結果(機器碼)保存在了硬碟上的某個磁軌,當我們運行程序時,也就是先把硬碟上的數據讀入到內存當中,然後內存中的數據再讀入CPU的緩存(Cache)當中,供其操作。一般來說,除了單片機,大小機器都會有個操作系統來負責這事,這一步仍然只涉及題主說的「軟體」。(大學課程:計算機操作系統)
  3. 然後CPU中的ALU按照時鐘順序讀取指令和數據,進行最基本的操作,即加減法、邏輯運算、自增自減、移位等。因為現在的計算機系統都是 數字的,CPU也不例外,它其實就是一個專用集成電路(ASIC)。「軟體」在邏輯上表現為 1, 0;在電路(內存、Cache)中表現為高低電平。CPU在讀入「軟體」、處理、輸出「軟體」的整個過程在邏輯上是「軟體」操作,在電路上則是高低電平的變化。CPU和外面的設備(內存、顯卡、音效卡、滑鼠等)打交道都是通過電平(高低)來處理。在這一步,不僅僅涉及題主所說的「軟體」了,也包含了硬體電路的內容,應該就是題主說的「結合部分吧」。(大學課程:微機原理)
  4. 如果題主仍然對 CPU 如何把「軟體」變為「硬體」有疑問or興趣,可以看看CPU設計和數字電路設計方面的書,不考慮細節的地方,CPU的原理其實也不是很難,很多微機原理的書都是以古董級別的8086, ARM作為例子,介紹CPU的相關知識,甚至還有教你製作CPU的書:如何自製一個CPU。這一步只包含」硬體「了。(大學課程:數字電路設計基礎)
  5. 如果題主對數字電路的高低電平如何驅動硬體(晶體管的亮滅)有疑問,可以看看模擬電子電路的相關書籍。這一步只包含」硬體「了。(大學課程:模擬電子電路基礎)

P.S.

其實前面已經有人說的非常好了(我又廢話了這麼長 =.=), 所謂「軟體」或者「程序」,最早它的載體是打孔紙帶,邏輯上的 0,1 用有沒有孔來表示,機器根據有沒有孔來控制「硬體」的行為。後來隨著電子電路技術的發展,經歷真空管、電子管、變成現在的晶體管和集成電路IC,邏輯上的 0,1 變成了電平的高低。電平驅動硬體,僅此而已。

================================分割線=================================

最後推薦兩本書,第一本不廢話了,計算機經典書籍,程序猿的必看。第二本是大牛 Charles Petzold 寫的科普書,號稱 「完全0基礎的人也可以看懂」,教你用最基本的導線、繼電器搭建一個非嚴格意義上的計算機,至少它和現在的計算機原理是一致的。

1. 深入理解計算機系統 (豆瓣)(CSAPP)

本書是一本將計算機軟體和硬體理論結合講述的經典教程,內容覆蓋計算機導論、體系結構和處理器設計等多門課程。本書的最大優點是為程序員描述計算機系統的實現細節,通過描述程序是如何映射到系統上,以及程序是如何執行的,使讀者更好地理解程序的行為為什麼是這樣的,以及造成效率低下的原因。

2. 編碼 (豆瓣)(code)

本書講述的是計算機工作原理。作者用豐富的想像和清晰的筆墨將看似繁雜的理論闡述得通俗易懂,你絲毫不會感到枯燥和生硬。更重要的是,你會因此而獲得對計算機工作原理較深刻的理解。這種理解不是抽象層面上的,而是具有一定深度的。


高級語言編程,接著編譯成為彙編,接著編譯成機器語言,指令集聽說過嗎?接著用指令集解釋機器語言,操縱底層硬體高低電平。詳情參考數電,編譯原理等書籍。

有問題請學會搜索…這麼問只會知道大概


結合部分就是ROM,是的就是這貨。cpu取指令的時候也就是從ROM里取出很多個1 0之類的狀態,從而完成了你的軟體功能


題主的糾結涉及到了計算機的組織結構,以前上微機原理的時候有過一點了解,粗淺的談談我的理解。

對於計算機的設計者來說,計算機系統劃分成很多層,每一層都執行特定的指令集來完成特定的功能,具體如下圖。

從上到下共分了6層。

最高層用戶層,是用戶可見的一層,用戶可以使用各種軟體。

第五層是高級語言層,是各種軟體開發者所在的一層,使用c,c++,java等等亂七八糟的語言開發軟體。

第四層是彙編語言層,樓上碼農們寫的語言將會翻譯成彙編語言。

第三層是操作系統層,操作系統對機器的資源進行分配和管理。比如說樓上的彙編語言的代碼需要操作寄存器,那麼操作系統需要提供寄存器給這段代碼。

第二層是機器層,這一層涉及到了計算機的體系結構,我們有這門課,可是我已經忘光了,只記得什麼全混洗什麼亂七八糟的-_-||

第一層是控制層,主要是控制單元,他會分析解碼樓上傳過來的指令,產生操作控制信號,控制信號控制下層的邏輯部件按照時間順序有序的執行

還沒完呢,別忘了計算機都是0開頭的!

第0層,數字邏輯層,這一層就是數電相關的內容了,宏觀上講就是主板,內存條,cpu等等,微觀上講就是二極體,三極體,等等

綜上,計算機每層都是相互關鍵,相互協作的,下層為上層提供服務,上層使用下層的服務完成特定的功能。一般,下層對上層是不可見的,所以用戶會覺得計算機很神奇,也就會產生題主的種種糾結。

手機碼字排版很亂,抱歉

ps:我工作在第五層,我是個戰5渣


軟硬結合的部分在存儲器。

存儲器的原理上面有網友已經說了,那我簡單的描述一下軟體是怎麼控制硬體的吧。

既然說到嵌入式了,那我就已嵌入式MCU為例吧。

雖然軟體在電腦中聽起來是虛無縹緲的沒有實體的東西,但當它寫入flash,卻表現出的是實實在在的二進位序列。怎麼說呢,比如向flash的某個地址寫入了一個數據,當你選中這個地址並輸入讀信號時,數據輸出埠表現出的可是實實在在的二進位(表現為高低電平)信息。

所以,藉助存儲器,組成軟體的二進位代碼有了確定的表現形式(高低電平)。

好了,現在軟體已經能用高低電錶現了,又有各種時序邏輯電路,那控制別的東西還有問題嗎?

另外,推薦《編碼的奧秘》。


軟體和硬體的結合部分在內存,描述不精確請意會。

提問者是懂電路的,應該也明白無論啥語言寫出來的東西最後都轉成機器碼,程序本質上就是一串串開關。

大多數硬體,都已經有了至少最基本的軟體存儲在內存中,就是一串串複雜的開關,本質上就是高低電平。

當硬體通電的時候,電流走過電路,開始讀取已經寫在內存里的程序(此處省略存儲設備的原理),這些程序告訴硬體接下來該怎麼辦。

所以本質上,軟體不是無形的,它是有物質實體存在的,過去是紙帶,現在是內存。

看了看其他答案發現很多人說了內存了,結果題主還在糾結,好吧再理的具體一點。

軟體變機器碼,需要的是編譯器。

機器碼存到內存的原理,有答案也說的很清楚了。

內存里的程序怎麼控制硬體,1怎麼變成高電平的,從內存里讀到的就是高電平低電平,不是1和0,人類為了方便理解把高電平定義為1,低電平定義為0。

突然想到,說了這麼多,關鍵是不是在於題主一直以為電路里流淌的是1和0而不是高低電平?

不是的啊。


以下是我的猜測。想獲得準確信息,就去讀《計算機結構》和Eniac的設計報告,裡面應當有電路圖。

讓我們把電腦和手錶做一個類比。

電腦就是一堆電路,就像你拆開了之後看到的那樣,你甚至可以把硬碟和cpu都拆了,不會有根本性的區別。

開機之後,電腦獲得能量,它就開始運轉。就像手錶上弦之後,齒輪組開始轉動。

你發給電腦的指令有以下幾種方式:鍵盤,滑鼠,寫好並存儲在電腦硬碟的軟體。

先說鍵盤。

你通過鍵盤發出的的指令會被存放在硬碟的一個區域。可以把這個區域想像成一個酒店,開始階段每個房間都存著0。我們叫做酒店A。

所謂0或1不過是這個房間里的電路的開或者關的狀態而已。

現在你敲了一個鍵,它是一個電信號,直接把對應這個鍵的房間的數字變成了1。比如,這個時候酒店的所有房間顯示為0001。(在此我們假定只有4個房間,雖然鍵盤至少有26個鍵)

自從開機後,CPU就在做一個周而復始的動作,就是檢查酒店的各個房間。就像是手錶秒針所對應的齒輪組一直保持著轉動。

在你改變了酒店房間後,當cpu下一輪過來檢查時,發現了這個變化。它就開始多做一個動作。

就像是秒針走了60下,手錶齒輪組會觸發分針的一個動作。

CPU開始給另外一套線路通電,它們按照預先設定的動作去執行0001這個命令。

你買了CPU的時候,它內部就已經燒好了一個完整的電路,裡面記錄了如何處理各個命令。這就是指令集。

現在,它要把對應這個命令的電路走一遍。

走完之後,結果存在另一個酒店。我們叫做酒店B。

這個酒店對應於你的屏幕,每個房間對應於你屏幕的每個像素。

於是,某個或者某些房間的數字將發生變化。

CPU也會周期性的檢查這個酒店。發現了變化之後,就會刷新屏幕,改變某些像素的顯示,然後你就看到了指令所帶來的變化。

使用滑鼠,你肯定需要屏幕的協助,否則你的點擊就是無意義的。

所以,當你使用滑鼠後,酒店A就存儲了屏幕的狀態,也就是各個像素被表現為每個房間的數字。

現在你發出一個點擊,這是一個電信號,它改變了這個像素對應的房間的數字,比如從0到1

同理,cpu輪詢後就會處理這個酒店現在所代表的指令,把相應的指令集電路走一遍,然後結果存到酒店B, 然後cpu又把酒店B顯示給你。

上面的操作都是電路的,自動的。

現在你寫了一個軟體。它在硬碟上。

你的軟體就是一堆的指令,不過是你能讀懂的, 不是CPU需要的電路。

但是,你的指令肯定是通過鍵盤敲進去的,所以在你寫的時候,它們實際上就是一系列的鍵盤動作,所以也被變成了電路級別的,存在了酒店A。

CPU只要增加一個動作,就是不斷把你的指令一條一條的複製到酒店A,然後執行就可以了。

這個增加的動作可以在Bios裡面就設置好,也就是增加一個電路,電腦啟動後cpu就去走一遍這個電路,從而開始了軟體的執行。

或者通過你的鍵盤或滑鼠給cpu,命令它把這個電路走一遍。

所謂軟體,不過就是存在電腦硬碟上的一堆電路圖。CPU只要把這個電路圖走一遍,就可以了。

電腦,顧名思義,它內部只有電的運動。

你看到的漂亮的頁面,不過是「電」展現給你的一個狀態而已,為了符合你作為一個「人」的需要。

就像你看到的手錶,就是3個指針和轉鈕,雖然它們的背後是一堆齒輪在做機械運動。

人們對於「計算」工具的渴望由來已久,比如算籌,算盤。

當我們需要功能更強大時,我們得到了手搖計算機,也就是齒輪組。

當我們需要可編程時,我們得到了打孔機。

當人們用電路代替機械來實現它,於是得到了電子計算器。

當人們按照馮諾依曼的設計,用電路的不同部分完成不同功能,就得到了Eniac。

如果你設計一個龐大的齒輪組,完成馮諾依曼要求的各個部分的功能,放在水邊獲得動力,那麼它就是一個「電腦」

電路讓自動化,智能化和高速度成為可能。複雜電路讓複雜計算成為可能。

於是,歷經幾代的變遷,我們看到了手邊的電腦。

當它用電路把你的整個思維過程實現的時候,它就是一個人。

如果把它送去韓國,它就會變成一個美女。哈哈。


首先,代碼是如何控制硬體的? - 單片機,這個問題下拍第一的答案應該是正解你的疑惑的(親你還來逛知乎嗎親)

接下來噴點私貨

實際上,代碼,數據,高低電平信號這些,都是一個東西——也就是硬體里的電子

只不過層面不同叫法不一樣:人跟人交流的層面這個東西就叫代碼,;人機交流這個東西就叫數據;到了硬體層面這個東西就叫信號

實際上軟體對硬體的控制,到了最終,都是一些列的電信號,至於為什麼你咋看不出來是一系列的電信號控制,這是由於現代計算機的高度自動化,計算機的一些列行為都被指令和程序編排好了,一個機器操作起來越是簡單它實際越是複雜,所以你以為你動動滑鼠就輕而易舉的打開了一個另外世界的大門,實際上這特么是經過了科學發展的幾百年沉澱才有的產物,所以不要以為你學了幾分鐘習咋還是不懂這個那個那個這個的,你學的那點習跟它的發生髮展歷史比簡直就是真空!!!

最後,行吧,我承認我後邊噴的那些話都是我對我自己說的。


[前方多圖謹慎]

留坑。

----------------------------------------------分割線----------------------------------------

這個問題其實樓上幾位已經回答的不錯了. 但鑒於我之前留了個坑, 不填對不起我自己.

那麼從我截圖中(是CMU的一門課)可以看到,電腦從最基本的元素到最抽象的元素有

1. 原子/電子 (這不廢話嗎)

2. 信號, 導體, 電阻/電容/blah blah blah 我都不是很清楚這些個東西是怎麼組成的.

3. 信號邏輯. 這個是什麼呢, 如果樓主稍有了解, 就知道AND gate, OR gate, NAND gate blah blah blah....這些東西就是這一層的東西.

4. 這個我就不解釋了, 放張圖:

(圖來自http://en.wikibooks.org/wiki/Microprocessor_Design/ALU)

那麼有了這些奇奇怪怪的結構之後, 通電時你變化電壓就會導致結果的變化.那麼這個是如何體現的呢?

很簡單, 比如說你按鍵盤, 按一個"A", 其實電腦內部的電壓已經有了變化, 那麼這個變化就會導致你的電腦解析出你按得是"A".

那麼有了這些邏輯之後, 就可以組成一些簡單的部分.比如說

一個Adder, 可以加一個bit, 也就是做 這個:

0+0 = 0

1+0 = 1

0+1 = 1

1+1 = 0 (carry 1)

那麼這個連起來, 就可以做成32 bit adder.

5. datapath. 這個就碉堡了.我再po一張圖片.

(圖片來自: Digital Design and Computer Architecture Second edition, author: David Money Harris Sarah L Harris) &<- 我懷疑是兩夫婦.

這個就是組成一個microprocessor的關鍵.

剩下的我就不提了, 就是程序了.

那麼當你寫好程序, 假如說是一個high-level的語言, 比如說C.

那麼通過linker, compiler, blah blah blah 之後會出現Assembly language. 也就是大概60年前的編程語言.

那麼這個就很好解釋了,

assembly language 就是計算機可以理解的語言.

再po個圖:

這個就是一個Assembly對應的指令.

那麼當你把這個指令存到電腦上後, 電腦會一個個的去讀取, 然後通過microprocessor去解析指令, 運行.

那麼你得程序就可以運行了.

-----------------------------------------------分割線----------------------------

不好意思我講的比較模糊, 但是大概就是這麼回事. 這要講清楚, 得花太多時間了. 哥還得上班呢.


作為一個學渣,我來講講,其實各位大神都太專業了,沒有理解到題主真正的問題,網上有很多類似的問題,都答的不夠痛快,總覺得沒有捅破最後一層紙。我來試著說說這層紙。

首先捋一下這個流程,編程--編譯為01--cpu--硬體呈現。這裡面很多什麼寄存器、門電路、邏輯電路、I/O、什麼高電平低電平、電燈泡亮滅,都不是問題, 這些都能夠理解的。

我想再來理解一下:

古時候打仗,有10萬兵馬排成陣列,這時候,指揮的人拿個旗子,紅黃藍綠黑白什麼顏色,向上一揮畫個圈往左一指,士兵立馬按照訓練說話的動作去行動,這就是指令集了。是約定好的。

計算機很多東西也都是約定好的,以上都是廢話。

再廢話一點:時序是非常重要的,機器太笨了,他反正就是按照自己的心跳來,按照時間順序來,一段時間給我什麼,我就做什麼。

我們來看古時候的編程人員,用的是打孔紙吧,很好理解,打孔紙有幾個要素,1、按時間打孔的,有一定的頻率;2有孔的地方和沒孔的地方,那就是01了嘛。這些都是很好理解的嘛。

好了,還有一個要素,那就是打孔的人,他是人為操作的。

上面都是廢話,關鍵來了:

其實你以為機器是自動的,那是你主觀意識上錯了,機器不是自動的,機器的開頭是人工的,就是你編程的時候是人工的。

你編程的時候,你寫代碼,其實就是對機器做了一套固定的設計,類似於訓練部隊。你寫下hello word的時候,電腦鍵盤--感測器--存儲器,就已經把你的套路存儲為高低電平了,就像古時候人為插電線一樣,你寫代碼的時候,就已經人工弄出了高低電平,這個就很好理解了吧。然後後面一堆編譯器把你弄出來的高低電平,編譯為機器能識別的高低電平,再交給cpu去幹活,那都是很好理解的了。

所以題主問的問題,結合部分是什麼,就是你的腦,你的手。你把軟體用手,弄到了電腦的硬體上。

你不要一直關注這個01怎麼就被識別了呢,他怎麼知道這個就是01呢,因為你寫代碼的時候就通過鍵盤把你腦子裡的01弄成了高低電平,後面的全部是高低電平,並沒有你腦子裡的01。

所以題主這個問題,包括很多人類似疑問,都不是技術問題,而是心理感覺上的問題。

如果你是說那個什麼編譯器、寄存器、cpu工作原理,看書就行了。


鍵盤的輸入轉化為01組合,01組合被存到內存、硬碟等處,CPU內有特定的寄存器(指令集)來執行控制和運算。你說的軟體轉化為01早期是由手工撥動開關實現,現今是鍵盤輸入+邏輯門電路的層層深入觸發的結果。可能有理解不準確的地方,強烈強烈推薦閱讀編碼 這本書,從手動開關燈泡講到操作系統。


楊力理解了我的問題,但是層次太高了,沒有回答到最低層


樓主是相關專業背景的,我從cpu指令集的角度來描述吧, 假設是32位系統。

我們根據CPU指令集不同把代碼編譯成不同二進位碼。運行程序就是把二進位碼按32位分布放置在內存上。CPU的會讀二進位碼,計算並去修改其他的內存地址。

內存實際上就是就是記錄狀態的RS鎖存器,記錄0和1兩種狀態。大部分鎖存器只能用來記錄狀態的,也就是win32系統中我們能用的3G內存。另外不到1G是給物理外設用的,這部分地址可能對應cpu特定引腳的io狀態,就是高和低的狀態。而這些引腳又連接其他硬體外設。

如果前面的代碼修改了這一部分的內存,那麼相應的硬體狀態就要改變。就會產生燈亮啊,蜂鳴器響啊,顯示器的像素點變了啊。

我再補充下CPU運行指令的細節吧。

CPU中的ALU部分是主要計算單元,也就是指令執行單元。簡單來說就是通過讀內存中特定位置電平狀態,再去改其他位置的電平狀態。對ALU來說,我們的二進位碼是輸入,對內存上其他電平的修改則是他的輸出。

ALU讀到內容應該怎麼算,怎麼改,是CPU硬體設計上決定的,也就是我們說的指令集。

而ALU算哪些東西,算完後會改哪一段內存。是由我們輸入的二進位碼控制的。

如果術語不明白,我再補充。


題主,我猜測你跟我之前想的問題是一樣的,是不是說軟體怎麼樣轉化成電平的?如果是這樣,我的理解是軟體經過編譯,再通過硬體驅動的轉化,可以變成一系列帶時序的電平信號。


題主疑問重點在於『軟體怎麼控制晶體管』?

其實你自己在 @shen liuxing答案里的評論已經說得很清楚了呀:「數電只是說到電流電壓怎麼產生以及控制1和0以及門電路」。

於是,我們請出今天的主角:「基本放大電路」。

介於我只學過一本電工學原理,只摸到數電跟模電的皮毛,就不獻醜了。

權當拋磚。


貌似沒有一個人真正回答對的 都在扯什麼門電路 0011二進位什麼的 甚至什麼邏輯器件 寄存器什麼的

所有這些回答 根本就是沒有正確理解樓主困惑所在 我之前也是對此疑惑不解 直到今天在百度知道上看到一個回答才豁然開朗 它說軟體就是電流電壓 就是一種實體信號 只有通電才有所謂的軟體

所以答案其實很簡單 因為計算機根本不存在所謂的軟體 你所看到的全都是硬體以及硬體工作之後的展示效果 通俗意義上所謂的軟體 其實就是我們視覺上所看到的一套UI界面 這個本身其實就是硬體工作所顯示的效果 你操作所謂的軟體實際上就是操縱一些列硬體 這都是一系列硬體通過電流電壓運行之後讓你視覺上感受到的一些列UI界面而已 既然沒有軟體 所謂的軟體和硬體的初始如何接觸這個疑問就完全沒有意義了 從頭到尾都只有硬體! 沒有軟體!

本質上來說 所謂的軟體只是一個可視化的界面而已 它和早期的計算機通過手動連接不同的線路讓計算機切換工作本質上是一回事


作為一個學渣,我來講講,其實各位大神都太專業了,沒有理解到題主真正的問題,網上有很多類似的問題,都答的不夠痛快,總覺得沒有捅破最後一層紙。我來試著說說這層紙。

首先捋一下這個流程,編程--編譯為01--cpu--硬體呈現。這裡面很多什麼寄存器、門電路、邏輯電路、I/O、什麼高電平低電平、電燈泡亮滅,都不是問題, 這些都能夠理解的。

我想再來理解一下:

古時候打仗,有10萬兵馬排成陣列,這時候,指揮的人拿個旗子,紅黃藍綠黑白什麼顏色,向上一揮畫個圈往左一指,士兵立馬按照訓練說話的動作去行動,這就是指令集了。是約定好的。

計算機很多東西也都是約定好的,以上都是廢話。

再廢話一點:時序是非常重要的,機器太笨了,他反正就是按照自己的心跳來,按照時間順序來,一段時間給我什麼,我就做什麼。

我們來看古時候的編程人員,用的是打孔紙吧,很好理解,打孔紙有幾個要素,1、按時間打孔的,有一定的頻率;2有孔的地方和沒孔的地方,那就是01了嘛。這些都是很好理解的嘛。

好了,還有一個要素,那就是打孔的人,他是人為操作的。

上面都是廢話,關鍵來了:

其實你以為機器是自動的,那是你主觀意識上錯了,機器不是自動的,機器的開頭是人工的,就是你編程的時候是人工的。

你編程的時候,你寫代碼,其實就是對機器做了一套固定的設計,類似於訓練部隊。你寫下hello word的時候,電腦鍵盤--感測器--存儲器,就已經把你的套路存儲為高低電平了,就像古時候人為插電線一樣,你寫代碼的時候,就已經人工弄出了高低電平,這個就很好理解了吧。然後後面一堆編譯器把你弄出來的高低電平,編譯為機器能識別的高低電平,再交給cpu去幹活,那都是很好理解的了。

所以題主問的問題,結合部分是什麼,就是你的腦,你的手。你把軟體用手,弄到了電腦的硬體上。

你不要一直關注這個01怎麼就被識別了呢,他怎麼知道這個就是01呢,因為你寫代碼的時候就通過鍵盤把你腦子裡的01弄成了高低電平,後面的全部是高低電平,並沒有你腦子裡的01。

所以題主這個問題,包括很多人類似疑問,都不是技術問題,而是心理感覺上的問題。

如果你是說那個什麼編譯器、寄存器、cpu工作原理,看書就行了。


結合部分就是ROM


我覺得題主想問的問題應該是軟體(邏輯)與硬體的交互實現手段。

我是這麼理解的,其實軟體(邏輯)不是真實存在的,真實存在的東西就是機械能轉換成電能。

機械能:我們敲擊鍵盤編程的過程就是按照人類大腦的邏輯在電腦的存儲器上(紙帶)打孔的過程。這個是機械能轉化為電能的過程。

所謂的軟體無非就是人類按照自己的思維在存儲器(紙帶)上打下的有智慧排列的孔,而這些孔就是門電路的狀態。(人類打孔是按照事先約定好的規則的,這樣才能打上有效的孔,而規則就是「指令」、「語法」)

燒進單片機ROM里的.BIN文件,都是2進位代碼,這些代碼本質上就都是人們事先在電腦的存儲器上打下的孔(敲擊鍵盤編程的過程)。

當然,敲擊鍵盤到最後生成的.Bin文件,中間還有好多過程,其實都是電腦硬體的「翻譯」,我們表面上看到的是軟體的轉化,例如C轉換為彙編、彙編轉換為二進位等等,這裡都需要操作系統的協調資源。

至於二進位代碼如何控制CPU動作,CPU如何驅動I/O口,這個完全是硬體的範疇了。

CPU不斷的取指令(二進位代碼,其實就是門電路的狀態)來執行,這個都是硬體單元之間的動作。

小白的理解,大小牛勿噴


以 PC 機為例 程序就是內存的一些數據

以前學習 DRAM 時候老師說 DRAM 輸出端有運放

運放之後輸出到邏輯電路里

也許這個運放就是問題的關鍵


推薦閱讀:

軟體工程專業如何選擇方向?
如果真的要學計算機專業,像我這種尷尬排名的學子應該怎麼選擇?
通過文檔理解代碼的時代已經過去了?
北大軟微VS北郵?
軟體工程專業前景怎麼樣?

TAG:軟體工程 | 嵌入式系統 |