99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

CPU到底是怎么執(zhí)行到每一個邏輯的

5CTi_cirmall ? 來源:電路設(shè)計技能 ? 作者:良知猶存 ? 2020-10-10 10:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

總述

最近一位朋友問我,開發(fā)的代碼是怎么在芯片運行起來的,我就開始給他介紹代碼的預(yù)編譯、匯編、編譯、鏈接然后到一般的文件屬性,再到代碼運行。但是大佬問了我一句,CPU到底是怎么執(zhí)行到每一個邏輯的,就講了哈CPU的架構(gòu)。這是時候真的有些迷了,雖然有模電數(shù)電的底子,但是自己都說迷糊了,匯編怎么對應(yīng)到機器碼再到怎么執(zhí)行每一個邏輯。

所以我想了想,我自己也重新學習整理一下,寫一篇文章分享給自己也分享給大家。雖然網(wǎng)上也有很多人講這個過程,我也想用自己的視角去介紹一下。所以我就花了三天時間把《CODE》這本書啃完,然后又看了哈Crash Course Computer Science的視頻,現(xiàn)在終于可以寫篇文章了。

作者:良知猶存

1 CPU的硬件最小原子

計算機從上世紀四十年代發(fā)展到現(xiàn)在有八十多年了,我們現(xiàn)在開發(fā)應(yīng)用以及很少會涉及到底層的部分,硬件設(shè)計的電子專業(yè)在學校里面會學習模電數(shù)電這兩門課,今天的第一部分就從這里說起。

一般我們不考慮物理的硬件底層的實現(xiàn)邏輯,但是為了后續(xù)的機器碼的介紹,這里開始介紹CPU的基本組成部分。

我們都知道現(xiàn)在的CPU是無數(shù)的晶體管組成,一塊很小的CPU用顯微鏡觀察可以看到上百萬個元器件,那么最早電腦是啥樣的呢?感謝Crash Course Computer Science的視頻,下面有很好照片都是從她的視頻中截取。以及感謝《CODE》,好多資料也是從此書得來。

最早的計算機,它有76萬5千個組件,300多萬個連接點和大約804公里長的用線,這個是真的大,而且它的核心控制還是用繼電器實現(xiàn)控制邏輯的。

此外,它的性能相較于于現(xiàn)在的電腦來說簡直微不足道。

好了言歸正傳,我們直接介紹現(xiàn)在計算機中的CPU組成,之前用繼電器、電子管進行控制計算,這些基本的元器件使得計算機體型龐大,后來半導體的出現(xiàn),使得計算機的體積大大減小。沒有使用半導體的時候,科學家使用繼電器等進行控制電路的開關(guān),控制電路電流的高和低,通過布爾代數(shù)組合形成我們現(xiàn)在經(jīng)常說的邏輯門,繼而實現(xiàn)數(shù)據(jù)的控制。


如上圖所以它會出現(xiàn)如下情況

這其實就是一個簡單開關(guān)的與門(AND)電路,所有的變量輸入是1的時候,輸出才為1。相應(yīng)的還有非門、或門、異或門等。

那么半導體是如何做到的呢?下面所示是三極管變化而成的與門(AND)電路,通過兩個三極管連接(三極管的工作原理可以百度一哈),實現(xiàn)邏輯。

這是非門(NOT),輸入1輸出位0,輸入位、為0輸出為1.

這是或門(OR),只有A、B兩個同時輸入0的時候,輸出才為0,其余都為1.

這是常用的邏輯門的圖形表示以及真值表顯示,最后一欄為真值表顯示,其中A、B為輸入,F(xiàn)為輸出。

基于這些邏輯的組合我們可以變成最小的11位二進制邏輯的加法器,1bit的數(shù)據(jù)鎖存器,再擴展為8位加法器,256M存儲器。

2 CPU的模塊組成過程

講完了CPU組成的最小原子結(jié)構(gòu),接下來我們抽象出來了邏輯門進行

首先我們先介紹一下CPU的基本架構(gòu)

一塊完整可以執(zhí)行程序CPU功能部件,里面有基本的ALU算數(shù)邏輯單元、控制單元、外部儲存器(儲存數(shù)據(jù)和程序)。

1970年發(fā)布的時候,它是第一個封裝在單個芯片內(nèi)完整的ALU。

ALU(算數(shù)邏輯單元)有兩個單元:一個算數(shù)單元(加法器),負責計算機里的所有數(shù)字操作,例如加減法、增量運算等;一個邏輯單元,負責一些簡單的數(shù)值測試,例如檢測ALU輸出是否為零的的電路

加法器:

用單個晶體管一個個去拼,把這個電路做出來,到那時會很復(fù)雜很難理解。所以我們更高層面的抽象-邏輯門去實現(xiàn)(AND、OR、NOT、XOR)。

下面這是一個1位的加法器:

二進制數(shù)的“和”可以由異或門得到,而“進位”可以由與門得到,所以可以把異或門和與門結(jié)合起來來完成兩個二進制數(shù)A和B的加法

AB只能輸入0或者1,也就是這個加法器能算0+0,1+0或者1+1。

脫離具體的形狀,我們可以把以上的一個加法器,抽象為一個符號用來顯示:

然后我們在進行擴展,把八個全加器連接,這樣就變成了一個8bit的加法器。每個全加器的進位輸出都是下一個全加器的進位輸入:

用一個抽象的框圖進行表示,其中輸入是A和B標識為從A0~A7及B0~B7。輸出為和輸出,標識為從 S0~S7:

這樣我們就構(gòu)造了一個簡單8位的加法器。

邏輯單元:同樣AND、OR、NOT、XOR的執(zhí)行,如下圖一個簡單的判斷輸出是否為0的電路

它用一堆OR門檢查其中一位是否為1,哪怕只有一個輸入的bit(位)為1,但都會被被或門到最后一個NOT(非)門進行取反,所以只有輸入的數(shù)字是0,輸出才能是為1。

告訴ALU執(zhí)行加減法,下面圖片里面的的V代表ALU部分。

通過ALU的FLAGS進行判斷,下面有三個標志一個是OVERFLOW(操作超出了總線寬度,設(shè)置為true(1))、ZERO(運算結(jié)果是否為零)、NEGATIVE(運算結(jié)果第一位為1,則設(shè)置為true(1),表示為負數(shù))

這就是ALU中的一些單元,其實也是一大堆邏輯門巧妙連到一起。

此外我們還需要存儲器(memory),如果ALU計算出來數(shù)據(jù)丟掉那么數(shù)據(jù)也沒什么用了,所以需要內(nèi)存把數(shù)據(jù)保存起來,與ALU一起組成CPU

之前的介紹都是單向順序執(zhí)行的電路,那有什么可以返回的電路呢,通過輸出來控制影響輸入。

進行AND 、NOT、OR組合,變成一個1位鎖存器

輸入STE為1,輸出為1

輸入RESTE為1,輸出為0

如果設(shè)置和置位都為0,電路會輸出最后放置的狀態(tài),所以它就保存住1bit位的數(shù)據(jù)

其中這樣一個1位的鎖存器,放入的動作叫做寫,拿出數(shù)據(jù)的動作叫做讀

為了好顯示,我們使用再高一級別的抽象層,用下面的框圖表示:

隨著芯片鎖存器大小的擴展,正常連接需要的線是非常之多,所以引入了矩陣方式:

為了將地址轉(zhuǎn)化成為行和列 還要用多路復(fù)用器,這就是一個基本的SDRAM的組成結(jié)構(gòu)。

SRAM DRAM FLASH NVRAM,大家功能上相似,但是用不同的電路儲存單個bit的數(shù)據(jù),比如使用不同的邏輯門、電容器、、電荷捕獲或者憶阻器。但是根本上,這些技術(shù)都是矩陣層層嵌套,來儲存大量的信息。

3 CPU的代碼語言執(zhí)行以及編程語言的變化過程

通過不同的邏輯門,我們逐漸搭建起了CPU的硬件部分,同時也抽象到了高層次的“微體系架構(gòu)”,我們開始告訴CPU的模塊進行操作,CPU里面都是101二進制數(shù)據(jù),那怎么和CPU執(zhí)行指令掛上鉤呢?

最早執(zhí)行機器使用就是穿孔卡片,通過穿孔卡片的特殊位置有沒有穿孔,決定機器執(zhí)行的不同步驟。

在計算機早期,程序員編程必須用機器碼寫程序,一般會在會在紙上寫一個“高層次”的描述——偽代碼,例如:從內(nèi)存中獲取當月銷售額,再計算出稅費。

這里展示一個簡單范例代碼,一段機器碼00101110。

首先這個機器碼分為前四位和后四位,前四位代表操作碼,后四位代表地址。

首先在指令表可以查到0010對應(yīng)著執(zhí)行指令是LOAD_A 意思為從內(nèi)存地址取出數(shù)據(jù),放到寄存器A中。

CPU看到00101110是怎么執(zhí)行的呢?

首先CPU有兩個執(zhí)行時候的寄存器:

指令地址寄存器,一個追蹤器,負責追蹤程序運行到哪里了;

指令寄存器,負責儲存當前指令

其次,CPU執(zhí)行指令有三個階段: 取指令->解碼->執(zhí)行

取指令:負責把指令從RAM中復(fù)制到指令寄存器中

如下所示:CPU把0010 1110放到指令寄存器中

解碼階段:負責解析復(fù)制過來的指令對應(yīng)到操作碼是哪個執(zhí)行,先解析0010

LOAD_A指令的工作:把RAM里面的值放入寄存器A中

再解析后四位1110,為地址14

接下來通過控制單元進行選擇確認是否執(zhí)行l(wèi)oad指令

當然控制單元也是由邏輯門連接起來的,這個時候需要一個電路,檢查操作碼是不是LOAD_A對應(yīng)的0010

執(zhí)行階段:當確認了執(zhí)行的操作碼,我們就開始執(zhí)行

從地址1110(10進制14)讀取出0000 0011的數(shù)據(jù),因為是LOAD_A指令,我們把該數(shù)據(jù)放進寄存器A,不操作其他寄存器

本次執(zhí)行完成,然后我們就把“指令地址寄存器”+1,執(zhí)行下一條命令,一直重復(fù)到代碼結(jié)束。

如果我們遇到了例如加減運算時候,就可以用到ALU了,數(shù)據(jù)寄存器把需要進行add的兩個數(shù)據(jù)輸入,然后在發(fā)送操作碼給ALU,ALU開始執(zhí)行最后輸出到暫存的寄存器,關(guān)閉ALU,最后再把數(shù)據(jù)放入正確的寄存器

除了執(zhí)行動作,現(xiàn)代CPU還有時鐘控制。很早的計算機都是用人工插拔來進行每一條指令的計算,但是對于現(xiàn)在的CPU執(zhí)行頻率來說,人工是做不到這樣的速度,所以現(xiàn)在CPU里面有專門的時鐘進行管理CPU的節(jié)奏,來告訴CPU要取指令-解碼-執(zhí)行。類似于練習樂器時候使用的節(jié)拍器一樣。

前面介紹程序運行時候我們是假設(shè)程序已經(jīng)在內(nèi)存里面了,但實際上程序儲存的位置不在內(nèi)存,并且需要在執(zhí)行時候加載到內(nèi)存里面。只要內(nèi)存足夠,不僅可以儲存要運行的程序,還可以存程序需要的數(shù)據(jù),以及運行程序時候產(chǎn)生的新數(shù)據(jù)。

不過早期編程都是專家活,不管是全職還是技術(shù)控,都需要非常了解底層硬件,要懂操作碼、寄存器等才能寫程序,所以編程很麻煩,哪怕是工程師和科學家都無法完全發(fā)揮計算機的能力

所以程序員開發(fā)出了一種新語言,更高層次,更可讀性,每個操作碼分配一個簡單的名字——助記符。助記符后面緊跟數(shù)據(jù),形成完整的指令。這樣程序員就不用0和1去寫代碼,可以用load jump等助記符開始編程,這就是匯編。前面我們講過這些助記符,應(yīng)該還是比較容易理解的。但是CPU是只能識別二進制的,所以程序員又寫了二進制程序來幫忙,它可以讀懂文字指令,自動轉(zhuǎn)化成二進制指令,這個程序就叫做——匯編器。

匯編器讀取用匯編語言寫的程序,然后轉(zhuǎn)成機器碼。LOAD_A 14 是一個典型的匯編代碼。

發(fā)展到現(xiàn)在,就英特爾的CPU 酷睿i7有上千種指令和指令變種,長度從一個字節(jié)到15個字節(jié)。

FORTRAN,是IBM1957年發(fā)布的語言,而主持FORTRAN的項目的總監(jiān)John Backus說,他只是因為懶,所以就開發(fā)了新的語言,是的大部分新程序的開發(fā)是因為更高效率的開發(fā),把一個月的開發(fā)時間編程一周,在變成一天。

就FORTRAN使用效果來說,確實也達到了,平均FORTRAN寫的程序要比同等的匯編寫的代碼少二十倍。然后FORTRAN編譯器會把FORTRAN代碼轉(zhuǎn)為機器碼。

然后陸續(xù)新的語言不斷產(chǎn)生,60年代有ALGOL、LISP和BASIC等語言;70年代有Pascal、C和Smalltalk;80年代有C++、Objectivs-C和Perl;90年代有Python、Ruby和Java;2000開始出現(xiàn)Swift、C#、Go。未來語言還會越來越多,新的語言用新的平臺和新的技術(shù),讓我們可以快速的開發(fā)使用。

責任編輯:xj

原文標題:CPU中的程序是怎么運行起來的

文章出處:【微信公眾號:電路設(shè)計技能】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11080

    瀏覽量

    217133
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3826

    瀏覽量

    83007

原文標題:CPU中的程序是怎么運行起來的

文章出處:【微信號:cirmall,微信公眾號:電路設(shè)計技能】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    CPU的各種指令和執(zhí)行流程

    在集成電路設(shè)計中,CPU的指令是指計算機中央處理單元(CPU)用來執(zhí)行計算任務(wù)的基本操作指令集。這些指令是CPU能夠理解并執(zhí)行的二進制代碼,
    的頭像 發(fā)表于 04-18 11:24 ?841次閱讀

    ADS1298的操作溫度范圍到底是多少?

    ADS1298是 0°Cto +70°C;工業(yè)級ADS1298I 是 –40°Cto +85°C。 現(xiàn)在不知道ADS1298的操作溫度范圍到底是多少?
    發(fā)表于 02-10 07:19

    ADS1298ECG-FE原理圖上看見很多NI的符號, 到底是什么意思呢?

    我們在ADS1298ECG-FE原理圖上看見很多NI的符號, 到底是什么意思呢? 具體的值是多少呢? 如下面兩圖所示: R1, R2電阻的值是多少? 這個比較重要。 R59 - R66又是多少? 麻煩你們回答下。 謝
    發(fā)表于 02-05 08:16

    ADS1278的參考電壓的要求到底是怎樣的?

    <27MHz為例,Vrefp輸入范圍為0.53.1V 而后文又提到,參考輸入電壓的范圍為AGND-0.4v to AVDD+0.4v 問題1. 這個參考電壓的要求到底是怎樣的? 問題2.
    發(fā)表于 01-23 08:02

    ADS7864采樣頻率到底是由外部時鐘決定還是HOLDX信號頻率決定?

    ADS7864數(shù)據(jù)手冊上說當采用8M外部時鐘的時候,采樣頻率為500kHz,但是有人說可以通過HOLDX頻率來控制采樣頻率,HOLDX下降沿采樣次,HOLDX頻率就是采樣頻率。請問采樣頻率
    發(fā)表于 01-14 06:47

    DAC3283到底是8位的LVDS輸入數(shù)據(jù)還是16位的LVDS輸入數(shù)據(jù)?

    請問這個DAC到底是8位的LVDS輸入數(shù)據(jù)還是16位的LVDS輸入數(shù)據(jù)啊。。也就是說,這個I路的15:8和7:0,是16位數(shù)據(jù)拆成了兩部分,高八位和第八位(其中又包含P和N),還是
    發(fā)表于 12-31 08:27

    自動駕駛中直說的BEV+Transformer到底是啥?

    在很多車企的自動駕駛介紹中,都會聽到關(guān)鍵技術(shù),那就是BEV+Transformer,那BEV+Transformer到底是啥?為什么很多車企在自動駕駛技術(shù)中都十分追捧這項技術(shù)?其
    的頭像 發(fā)表于 11-07 11:19 ?1393次閱讀
    自動駕駛中<b class='flag-5'>一</b>直說的BEV+Transformer<b class='flag-5'>到底是</b><b class='flag-5'>個</b>啥?

    TLV320AIC3254內(nèi)部中的ADC處理模塊和minidsp到底是什么關(guān)系?

    我想請問下幾個問題: 1.3254內(nèi)部中的ADC處理模塊和minidsp到底是什么關(guān)系,是并列的還是串行關(guān)系?還是ADC處理模塊就是minidsp特殊情況下的部分? 2.minidsp的抽取因子該怎么理解,到底怎么使用?
    發(fā)表于 10-31 06:02

    請問PCM2903C的溫度范圍到底是多少呢?

    如下圖,PCM2903C的溫度范圍到底是多少呢? 如果用在-25~85℃,是否會出問題?
    發(fā)表于 10-14 07:14

    放大器的共模輸入電壓到底是指什么?

    請問放大器的共模輸入電壓到底是指什么?
    發(fā)表于 09-19 07:17

    功放和運放到底是什么區(qū)別?

    想請問下功放和運放到底是什么區(qū)別,感覺只要接小負載,運放的輸出電流也可以很大啊?到底有什么區(qū)別啊
    發(fā)表于 09-10 07:00

    請問LMV772到底是雙電源還是單電源啊?

    請問LMV772到底是雙電源還是單電源???手冊前面寫的太模糊了。求指教
    發(fā)表于 09-09 07:10

    如今火熱的AI芯片到底是什么

    和運用的主流方式,目前通用的CPU可以拿來執(zhí)行AI的算法。但是因為內(nèi)部有大量的非運算邏輯,而這些指令級對于目前的AI算法來說是完全用不上的,所以CPU并不能達到最高的運算效率。因此,具
    的頭像 發(fā)表于 09-06 10:10 ?1561次閱讀

    運放的輸入電容到底是什么?

    我想請問下運放的輸入電容到底是什么?
    發(fā)表于 09-04 06:52

    LMH6502的輸入電壓到底是多少?

    LMH6502的輸入電壓到底是多少,我稍微給如大點點的信號,放大不行還能接受,我衰減都失真,
    發(fā)表于 08-27 07:02