国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

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

cpu的程序是如何運(yùn)行起來的

工程師 ? 來源:羽林君 ? 作者:羽林君 ? 2020-09-11 09:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

作者:良知猶存

轉(zhuǎn)自:羽林君

1

CPU的硬件最小原子

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

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

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

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

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

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

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

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

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

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

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

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

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

2

CPU的模塊組成過程

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

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

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

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

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

加法器:

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

下面這是一個(gè)1位的加法器:

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

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

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

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

用一個(gè)抽象的框圖進(jìn)行表示,其中輸入是A和B標(biāo)識(shí)為從A0~A7及B0~B7。輸出為和輸出,標(biāo)識(shí)為從 S0~S7:

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

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

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

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

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

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

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

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

進(jìn)行AND 、NOT、OR組合,變成一個(gè)1位鎖存器

輸入STE為1,輸出為1

輸入RESTE為1,輸出為0

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

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

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

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

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

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

3

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

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

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

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

這里展示一個(gè)簡單范例代碼,一段機(jī)器碼 00101110。

首先這個(gè)機(jī)器碼分為前四位和后四位,前四位代表操作碼,后四位代表地址。

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

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

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

指令地址寄存器,一個(gè)追蹤器,負(fù)責(zé)追蹤程序運(yùn)行到哪里了;

指令寄存器,負(fù)責(zé)儲(chǔ)存當(dāng)前指令

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

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

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

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

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

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

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

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

執(zhí)行階段:當(dāng)確認(rèn)了執(zhí)行的操作碼,我們就開始執(zhí)行

從地址1110(10進(jìn)制14)讀取出0000 0011的數(shù)據(jù),因?yàn)槭荓OAD_A指令,我們把該數(shù)據(jù)放進(jìn)寄存器A,不操作其他寄存器

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

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

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

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

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

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

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

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

FORTRAN,是IBM1957年發(fā)布的語言,而主持FORTRAN的項(xiàng)目的總監(jiān)John Backus說,他只是因?yàn)閼校跃烷_發(fā)了新的語言,是的大部分新程序的開發(fā)是因?yàn)楦咝实拈_發(fā),把一個(gè)月的開發(fā)時(shí)間編程一周,在變成一天。

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

然后陸續(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。未來語言還會(huì)越來越多,新的語言用新的平臺(tái)和新的技術(shù),讓我們可以快速的開發(fā)使用。

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

    關(guān)注

    173

    文章

    6076

    瀏覽量

    178409
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11279

    瀏覽量

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

    關(guān)注

    117

    文章

    3846

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    單片機(jī)里的程序運(yùn)行方式

    我們想要理解單片機(jī)是如何運(yùn)行程序的,我們首先需要了解單片機(jī)的組成,我們這里以80C51單片機(jī)為例來理解程序在單片機(jī)中是如何運(yùn)行的。 單片機(jī)的組成8051單片機(jī)的內(nèi)部硬件結(jié)構(gòu)包括: 中央處理器
    發(fā)表于 01-16 06:57

    Linux 下交叉編譯實(shí)戰(zhàn):跑起來你的第一個(gè) STM32 程序

    起來你的第一個(gè)STM32程序。一、準(zhǔn)備工作在開始之前,需要準(zhǔn)備:1、Linux開發(fā)環(huán)境Ubuntu、Debian或其他主流發(fā)行版都可以。2、ARMGCC交叉編譯工具
    的頭像 發(fā)表于 11-24 19:04 ?813次閱讀
    Linux 下交叉編譯實(shí)戰(zhàn):跑<b class='flag-5'>起來</b>你的第一個(gè) STM32 <b class='flag-5'>程序</b>

    Arm Neoverse CPU上大代碼量Java應(yīng)用的性能測試

    Java 是互聯(lián)網(wǎng)領(lǐng)域廣泛使用的編程語言。Java 應(yīng)用的一些特性使其性能表現(xiàn)與提前編譯的原生應(yīng)用(例如 C 程序)大相徑庭。由于 Java 字節(jié)碼無法直接在 CPU 上執(zhí)行,因此通常運(yùn)行時(shí)在
    的頭像 發(fā)表于 11-05 11:25 ?755次閱讀
    Arm Neoverse <b class='flag-5'>CPU</b>上大代碼量Java應(yīng)用的性能測試

    大數(shù)組程序無法運(yùn)行怎么解決?

    主控是103,程序中定義一個(gè)const類型 128k只讀數(shù)組,放在flash上,程序無法運(yùn)行,堆棧都初始化不了,在keil編譯下正常,在rtthread studio下編譯無法運(yùn)行,求
    發(fā)表于 09-15 06:21

    CPU 到 GPU,渲染技術(shù)如何重塑游戲、影視與設(shè)計(jì)?

    CPU(CentralProcessingUnit)是計(jì)算機(jī)的中央處理器,它負(fù)責(zé)執(zhí)行各種程序和指令。CPU渲染是指使用CPU來執(zhí)行渲染流程
    的頭像 發(fā)表于 09-01 12:16 ?982次閱讀
    從 <b class='flag-5'>CPU</b> 到 GPU,渲染技術(shù)如何重塑游戲、影視與設(shè)計(jì)?

    探索CPU架構(gòu)的奧秘,揭秘高性能計(jì)算的隱形引擎

    的深海,揭開那些隱藏在高性能計(jì)算背后的神秘面紗。1.取指令(Fetch)程序計(jì)數(shù)器(PC):CPU通過程序計(jì)數(shù)器獲取下一條指令的內(nèi)存地址。指令讀取:從存儲(chǔ)器或緩存中讀
    的頭像 發(fā)表于 08-13 11:58 ?796次閱讀
    探索<b class='flag-5'>CPU</b>架構(gòu)的奧秘,揭秘高性能計(jì)算的隱形引擎

    同樣的代碼在官方開發(fā)板上運(yùn)行正常,在自己板子上就跑不起來,怎么辦?

    同樣的代碼在Nordic官方開發(fā)板上可以運(yùn)行正常,但在自己板子上就跑不起來,如果你碰到了上述情況,建議按照如下步驟進(jìn)行自檢: 首先確認(rèn)用戶板元器件焊接良好,功能正常。如果你的板子有LED的話,你可以
    的頭像 發(fā)表于 05-12 15:26 ?775次閱讀
    同樣的代碼在官方開發(fā)板上<b class='flag-5'>運(yùn)行</b>正常,在自己板子上就跑不<b class='flag-5'>起來</b>,怎么辦?

    信創(chuàng)國產(chǎn)CPU推薦

    cpu
    jf_10805031
    發(fā)布于 :2025年04月23日 17:20:43

    STM32F030正常上電不運(yùn)行是什么原因?

    在在線調(diào)試的時(shí)候沒有任何問題,等到了下載進(jìn)去正式運(yùn)行了發(fā)現(xiàn)并沒有運(yùn)行,初始化階段都沒有運(yùn)行起來,有可能是什么原因?可能程序
    發(fā)表于 04-23 06:14

    如何在 樹莓派 上編寫和運(yùn)行 C 語言程序

    在本教程中,我將討論C編程語言是什么,C編程的用途,以及如何在RaspberryPi上編寫和運(yùn)行C程序。本文的目的是為您介紹在RaspberryPi上進(jìn)行C編程的基礎(chǔ)知識(shí)。如果您想深入了解C編程
    的頭像 發(fā)表于 03-25 09:28 ?1156次閱讀
    如何在 樹莓派 上編寫和<b class='flag-5'>運(yùn)行</b> C 語言<b class='flag-5'>程序</b>?

    零基礎(chǔ)入門:如何在樹莓派上編寫和運(yùn)行Python程序

    在這篇文章中,我將為你簡要介紹Python程序是什么、Python程序可以用來做什么,以及如何在RaspberryPi上編寫和運(yùn)行一個(gè)簡單的Python程序。什么是Python
    的頭像 發(fā)表于 03-25 09:27 ?2038次閱讀
    零基礎(chǔ)入門:如何在樹莓派上編寫和<b class='flag-5'>運(yùn)行</b>Python<b class='flag-5'>程序</b>?

    STM32F103RBT6開發(fā)板每次程序都得重新燒錄才能正常運(yùn)行,如何解決?

    每次板子都得重新燒錄程序才能運(yùn)行起來。第一次燒錄完程序后,能正常運(yùn)行,等我把開關(guān)斷開再打開,程序
    發(fā)表于 03-11 07:40

    FLASHXIP程序跑不起來是怎么回事?

    1、環(huán)境是: Nuclei Studio IDE for C/C++ Developers Version: 2023-10 2、開發(fā)板是正點(diǎn)原子達(dá)芬奇 這是跑不起來程序,不知道是什么原因還望高手指導(dǎo)一下
    發(fā)表于 03-07 14:20

    用stsw-link004這個(gè)軟件配合仿真器寫程序后,直接運(yùn)行程序程序運(yùn)行不正常是什么原因?

    用stsw-link004這個(gè)軟件配合仿真器寫程序后,直接運(yùn)行程序程序運(yùn)行不正常,必須對電路板進(jìn)行完全重新上電,程序才能正常
    發(fā)表于 03-07 07:00

    STM32H533的USB沒有啟動(dòng)起來是怎么回事?

    有關(guān)USB配置,同樣的配置在STM32H503上就能正常運(yùn)行,可以通過USB助手發(fā)現(xiàn),在STM32H533就沒有任何反應(yīng),通過STM32CubeMX配置的模塊有USB、USBx、THREADx,通過測試發(fā)現(xiàn)程序能夠正常運(yùn)行,就是
    發(fā)表于 03-07 06:44