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

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

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

基于Von Neumann體系計算機的物理結(jié)構(gòu)

冬至子 ? 來源:袋鼠在云端 ? 作者:袋鼠么么噠 ? 2023-11-13 15:38 ? 次閱讀

內(nèi)存

每個內(nèi)存單元有一個地址內(nèi)存地址是從0開始編號的整數(shù),CPU通過地址找到相應(yīng)的內(nèi)存單元,取其中的指令或者讀寫其中的數(shù)據(jù)。一個地址所對應(yīng)的內(nèi)存單元只能存一個字節(jié),像int、float等多字節(jié)的數(shù)據(jù)類型保存在內(nèi)存中要占用連續(xù)的多個地址,它們的地址是它所占內(nèi)存單元的起始地址。

CPU

CPU最核心的功能單元包括:

Register寄存器

寄存器是CPU內(nèi)部的高速存儲器,像內(nèi)存一樣可以存取數(shù)據(jù),但比訪問內(nèi)存快得多。
一些寄存器可以用在各種運算和讀寫內(nèi)存的指令中,比如eax寄存器,這稱為通用寄存器(General-purpose Register)。

一些寄存器只能用于某種特定的用途,比如eip用作程序計數(shù)器,這稱為特殊寄存器(Special-purpose Register)。

PC (Program Counter,程序計數(shù)器)

程序計數(shù)器是一種特殊寄存器,保存著CPU取下一條指令的地址,CPU按程序計數(shù)器保存的地址去內(nèi)存中取指令然后解釋執(zhí)行,這時程序計數(shù)器保存的地址會自動加上該指令的長度,指向內(nèi)存中的下一條指令。

Instruction Decoder (指令譯碼器)

CPU取上來的指令由若干個字節(jié)組成,這些字節(jié)中有些位表示內(nèi)存地址,有些位表示寄存器編號,有些位表示這種指令做什么操作,是加減乘除還是讀寫內(nèi)存,指令譯碼器負責(zé)解釋這條指令的含義,然后調(diào)動相應(yīng)的執(zhí)行單元去執(zhí)行它。

ALU (Arithmetic and Logic Unit,算術(shù)邏輯單元)

如果譯碼器將一條指令解釋為運算指令,就調(diào)動算術(shù)邏輯單元去做運算,比如加減乘除、位運算、邏輯運算。指令中會指示運算結(jié)果保存到哪里,可能保存到寄存器中,也可能保存到內(nèi)存中。

Bus (地址和數(shù)據(jù)總線)。

CPU和內(nèi)存之間用地址總線、數(shù)據(jù)總線和控制線連接起來,每條線上有1和0兩種狀態(tài)。

從CPU訪問內(nèi)存

如果在執(zhí)行指令過程中需要訪問內(nèi)存,比如從內(nèi)存讀一個數(shù)到寄存器,執(zhí)行過程可以想像成這樣:

1.CPU內(nèi)部將寄存器對接到數(shù)據(jù)總線上,使寄存器的每一位對接到一條數(shù)據(jù)線,等待接收數(shù)據(jù)。

2.CPU通過控制線發(fā)一個讀請求,并且將內(nèi)存地址通過地址線發(fā)給內(nèi)存。

3.內(nèi)存收到地址和讀請求之后,將相應(yīng)的內(nèi)存單元對接到數(shù)據(jù)總線的另一端,這樣,內(nèi)存單元每一位的1或0狀態(tài)通過一條數(shù)據(jù)線到達CPU寄存器中相應(yīng)的位,就完成了數(shù)據(jù)傳送。

image.png

上圖中畫了32條地址線和32條數(shù)據(jù)線,CPU寄存器也是32位,可以說這種體系結(jié)構(gòu)是32位的,比如x86就是這樣的體系結(jié)構(gòu),目前主流的處理器是32位或64位的。地址線、數(shù)據(jù)線和CPU寄存器的位數(shù)通常是一致的,從上圖可以看出數(shù)據(jù)線和CPU寄存器的位數(shù)應(yīng)該一致,另外有些寄存器(比如程序計數(shù)器)需要保存一個內(nèi)存地址,因而地址線和CPU寄存器的位數(shù)也應(yīng)該一致。32位計算機有32條地址線,地址空間(Address Space)從0x00000000到0xffffffff,共4GB,而64位計算機有更大的地址空間。

這里的的地址線、數(shù)據(jù)線是指CPU的內(nèi)總線,是直接和CPU的執(zhí)行單元相連的,內(nèi)總線經(jīng)過MMU和總線接口的轉(zhuǎn)換之后引出到芯片引腳才是外總線,外地址線和外數(shù)據(jù)線的位數(shù)都有可能和內(nèi)總線不同,例如32位處理器的外地址總線可尋址的空間可以大于4GB。

CPU從內(nèi)存中取值

image.png

1.eip寄存器指向地址0x80483a2,CPU從這里開始取一條5個字節(jié)的指令,然后eip寄存器指向下一條指令的起始地址0x80483a7。

2.CPU對這5個字節(jié)譯碼,得知這條指令要求從地址0x804a01c開始取4個字節(jié)保存到eax寄存器。

3.執(zhí)行指令,讀內(nèi)存,取上來的數(shù)是3,保存到eax寄存器。注意,地址0x804a01c~0x804a01f里存儲的四個字節(jié)不能按地址從低到高的順序看成0x03000000,而要按地址從高到低的順序看成0x00000003。也就是說,對于多字節(jié)的整數(shù)類型,低地址保存的是整數(shù)的低位,這稱為小端(Little Endian)字節(jié)序(Byte Order)。x86平臺是小端字節(jié)序的,而另外一些平臺規(guī)定低地址保存整數(shù)的高位,稱為大端(Big Endian)字節(jié)序。

4.CPU從eip寄存器指向的地址取一條3個字節(jié)的指令,然后eip寄存器指向下一條指令的起始地址0x80483aa。

5.CPU對這3個字節(jié)譯碼,得知這條指令要求把eax寄存器的值加1,結(jié)果仍保存到eax寄存器。
6.執(zhí)行指令,現(xiàn)在eax寄存器中的數(shù)是4。

7.CPU從eip寄存器指向的地址取一條5個字節(jié)的指令,然后eip寄存器指向下一條指令的起始地址0x80483af。

8.CPU對這5個字節(jié)譯碼,得知這條指令要求把eax寄存器的值保存到從地址0x804a018開始的4個字節(jié)。

9.執(zhí)行指令,把4這個值保存到從地址0x804a018開始的4個字節(jié)(按小端字節(jié)序保存)。

設(shè)備

image.png

CPU訪問設(shè)備的兩種方式:

Memory-mapped I/O (內(nèi)存映射I/O)

圖中①②訪問這種設(shè)備就像訪問內(nèi)存一樣(略有不同,如下表),按地址讀寫即可。比如ARM。

Port I/O端口I/O)

圖中③需要用一種專用的in/out指令訪問。比如x86。

第三種方式:設(shè)備總線

由于計算機的設(shè)備五花八門,于是出現(xiàn)了各種適應(yīng)不同要求的設(shè)備總線,設(shè)備總線的控制器也是一種設(shè)備。CPU通過內(nèi)存映射I/O或端口I/O訪問相應(yīng)的總線控制器,通過總線控制器再去訪問掛在總線上的設(shè)備。

比如PCI、AGP、USB、1394、SATA等等,這些設(shè)備是掛在設(shè)備總線上的。

上圖中標(biāo)有“設(shè)備”的框都可能是實際的設(shè)備,也可能是設(shè)備總線的控制器。

image.png

Interrupt中斷機制

每個設(shè)備都有一條中斷線,通過中斷控制器連接到CPU,當(dāng)設(shè)備需要主動通知CPU時就引發(fā)一個中斷信號,CPU正在執(zhí)行的指令將被打斷,程序計數(shù)器會指向某個固定的地址(這個地址由體系結(jié)構(gòu)定義),于是CPU從這個地址開始取指令(或者說跳轉(zhuǎn)到這個地址),執(zhí)行中斷服務(wù)程序(ISR,Interrupt Service Routine),完成中斷處理之后再返回先前被打斷的地方執(zhí)行后續(xù)指令。

比如某種體系結(jié)構(gòu)規(guī)定發(fā)生中斷時跳轉(zhuǎn)到地址0x00000010執(zhí)行,那么就要事先把一段ISR程序加載到這個地址,ISR程序是內(nèi)核代碼的一部分,在這段代碼中首先判斷是哪個設(shè)備引發(fā)了中斷,然后調(diào)用該設(shè)備的中斷處理函數(shù)做進一步處理。

設(shè)備寄存器

設(shè)備中可供讀寫訪問的單元通常稱為設(shè)備寄存器(注意和CPU寄存器不是一回事)。
操作設(shè)備的過程就是讀寫這些設(shè)備寄存器的過程,比如向串口發(fā)送寄存器里寫數(shù)據(jù),串口設(shè)備就會把數(shù)據(jù)發(fā)送出去,讀串口接收寄存器的值,就可以讀取串口設(shè)備接收到的數(shù)據(jù)。

硬盤

在x86平臺上,硬盤是掛在IDE、SATA或SCSI總線上的設(shè)備,保存在硬盤上的程序是不能被CPU直接取指令執(zhí)行的,操作系統(tǒng)在執(zhí)行程序時會把它從硬盤拷貝到內(nèi)存,這樣CPU才能取指令執(zhí)行。

操作系統(tǒng)

Operating System(操作系統(tǒng))本身也是一段保存在磁盤上的程序,計算機在啟動時執(zhí)行一段固定的啟動代碼(稱為Bootloader)首先把操作系統(tǒng)從磁盤加載到內(nèi)存,然后執(zhí)行操作系統(tǒng)中的代碼把用戶需要的其它程序加載到內(nèi)存。

操作系統(tǒng)最核心的功能是管理進程調(diào)度、管理內(nèi)存的分配使用和管理各種設(shè)備,做這些工作的程序稱為Kernel(內(nèi)核),在我的系統(tǒng)上內(nèi)核程序是/boot/vmlinuz-2.6.28-13-generic文件,它在計算機啟動時加載到內(nèi)存并常駐內(nèi)存。

廣義上操作系統(tǒng)的概念還包括一些必不可少的用戶程序,比如Shell是每個Linux系統(tǒng)必不可少的,而Office辦公套件則是可有可無的,所以前者也屬于廣義上操作系統(tǒng)的范疇,而后者屬于應(yīng)用軟件。

設(shè)備驅(qū)動程序

由于各種設(shè)備的操作方法各不相同,每種設(shè)備都需要專門的Device Driver(設(shè)備驅(qū)動程序),一個操作系統(tǒng)為了支持廣泛的設(shè)備就需要有大量的設(shè)備驅(qū)動程序,事實上Linux內(nèi)核源代碼中絕大部分是設(shè)備驅(qū)動程序。設(shè)備驅(qū)動程序通常是內(nèi)核里的一組函數(shù),通過讀寫設(shè)備寄存器實現(xiàn)對設(shè)備的初始化、讀、寫等操作,有些設(shè)備還要提供一個中斷處理函數(shù)供ISR調(diào)用。

MMU

現(xiàn)代操作系統(tǒng)普遍采用Virtual Memory Management(虛擬內(nèi)存管理)機制,這需要處理器中的MMU(Memory Management Unit,內(nèi)存管理單元)提供支持。

PA物理地址

如果處理器沒有MMU,或者有MMU但沒有啟用,CPU執(zhí)行單元發(fā)出的內(nèi)存地址將直接傳到芯片引腳上,被內(nèi)存芯片(以下稱為物理內(nèi)存,以便與虛擬內(nèi)存區(qū)分)接收,這稱為PA(Physical Address,物理地址)。

image.png

VA虛擬地址

如果處理器啟用了MMU,CPU執(zhí)行單元發(fā)出的內(nèi)存地址將被MMU截獲,從CPU到MMU的地址稱為VA(Virtual Address,虛擬地址),而MMU將這個地址翻譯成另一個地址發(fā)到CPU芯片的外部地址引腳上,也就是將VA映射成PA

image.png

如果是32位處理器,則內(nèi)地址總線是32位的,與CPU執(zhí)行單元相連(右圖只是示意性地畫了4條地址線),而經(jīng)過MMU轉(zhuǎn)換之后的外地址總線則不一定是32位的。也就是說,虛擬地址空間和物理地址空間是獨立的,32位處理器的虛擬地址空間是4GB,而物理地址空間既可以大于也可以小于4GB。

MMU將VA映射到PA是以Page(頁)為單位的,32位處理器的頁尺寸通常是4KB。例如,MMU可以通過一個映射項將VA的一頁0xb70010000xb7001fff映射到PA的一頁0x20000x2fff,如果CPU執(zhí)行單元要訪問虛擬地址0xb7001008,則實際訪問到的物理地址是0x2008。物理內(nèi)存中的頁稱為Page Frame(物理頁面或者頁幀)。

虛擬內(nèi)存的哪個頁面映射到物理內(nèi)存的哪個頁幀是通過Page Table(頁表)來描述的,頁表保存在物理內(nèi)存中,MMU會查找頁表來確定一個VA應(yīng)該映射到什么PA。

操作系統(tǒng)和MMU是這樣配合的:

1.操作系統(tǒng)在初始化或分配、釋放內(nèi)存時會執(zhí)行一些指令在物理內(nèi)存中填寫頁表,然后用指令設(shè)置MMU,告訴MMU頁表在物理內(nèi)存中的什么位置。

2.設(shè)置好之后,CPU每次執(zhí)行訪問內(nèi)存的指令都會自動引發(fā)MMU做查表和地址轉(zhuǎn)換操作,地址轉(zhuǎn)換操作由硬件自動完成,不需要用指令控制MMU去做。

我們在程序中使用的變量和函數(shù)都有各自的地址,程序被編譯后,這些地址就成了指令中的地址,指令中的地址被CPU解釋執(zhí)行,就成了CPU執(zhí)行單元發(fā)出的內(nèi)存地址,所以在啟用MMU的情況下,程序中使用的地址都是虛擬地址,都會引發(fā)MMU做查表和地址轉(zhuǎn)換操作。

MMU除了做地址轉(zhuǎn)換之外,還提供內(nèi)存保護機制。 各種體系結(jié)構(gòu)都有User Mode(用戶模式)和Privileged Mode(特權(quán)模式)之分,操作系統(tǒng)可以在頁表中設(shè)置每個內(nèi)存頁面的訪問權(quán)限,有些頁面不允許訪問,有些頁面只有在CPU處于特權(quán)模式時才允許訪問,有些頁面在用戶模式和特權(quán)模式都可以訪問,訪問權(quán)限又分為可讀、可寫和可執(zhí)行三種。這樣設(shè)定好之后,當(dāng)CPU要訪問一個VA時,MMU會檢查CPU當(dāng)前處于用戶模式還是特權(quán)模式,訪問內(nèi)存的目的是讀數(shù)據(jù)、寫數(shù)據(jù)還是取指令,如果和操作系統(tǒng)設(shè)定的頁面權(quán)限相符,就允許訪問,把它轉(zhuǎn)換成PA,否則不允許訪問,產(chǎn)生一個Exception(異常)。

異常的處理過程和中斷類似,不同的是中斷由外部設(shè)備產(chǎn)生而異常由CPU內(nèi)部產(chǎn)生,中斷產(chǎn)生的原因和CPU當(dāng)前執(zhí)行的指令無關(guān),而異常的產(chǎn)生就是由于CPU當(dāng)前執(zhí)行的指令出了問題,例如訪問內(nèi)存的指令被MMU檢查出權(quán)限錯誤,除法指令的除數(shù)為0等都會產(chǎn)生異常。

通常操作系統(tǒng)把虛擬地址空間劃分為用戶空間和內(nèi)核空間,例如x86平臺的Linux系統(tǒng)虛擬地址空間是0x000000000xffffffff,前3GB(0x000000000xbfffffff)是用戶空間,后1GB(0xc0000000~0xffffffff)是內(nèi)核空間。用戶程序加載到用戶空間,在用戶模式下執(zhí)行,不能訪問內(nèi)核中的數(shù)據(jù),也不能跳轉(zhuǎn)到內(nèi)核代碼中執(zhí)行。這樣可以保護內(nèi)核,如果一個進程訪問了非法地址,頂多這一個進程崩潰,而不會影響到內(nèi)核和整個系統(tǒng)的穩(wěn)定性。CPU在產(chǎn)生中斷或異常時不僅會跳轉(zhuǎn)到中斷或異常服務(wù)程序,還會自動切換模式,從用戶模式切換到特權(quán)模式,因此從中斷或異常服務(wù)程序可以跳轉(zhuǎn)到內(nèi)核代碼中執(zhí)行。事實上,整個內(nèi)核就是由各種中斷和異常處理程序組成的??偨Y(jié)一下:在正常情況下處理器在用戶模式執(zhí)行用戶程序,在中斷或異常情況下處理器切換到特權(quán)模式執(zhí)行內(nèi)核程序,處理完中斷或異常之后再返回用戶模式繼續(xù)執(zhí)行用戶程序。

Segmentation fault (段錯誤)的產(chǎn)生過程:

1.用戶程序要訪問的一個VA,經(jīng)MMU檢查無權(quán)訪問。

2.MMU產(chǎn)生一個異常,CPU從用戶模式切換到特權(quán)模式,跳轉(zhuǎn)到內(nèi)核代碼中執(zhí)行異常服務(wù)程序。

3.內(nèi)核把這個異常解釋為段錯誤,把引發(fā)異常的進程終止掉。

存儲器

Memory Hierarchy

image.png

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

    關(guān)注

    68

    文章

    19051

    瀏覽量

    228563
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5275

    瀏覽量

    119693
  • 計算機
    +關(guān)注

    關(guān)注

    19

    文章

    7305

    瀏覽量

    87566
  • ISR
    ISR
    +關(guān)注

    關(guān)注

    0

    文章

    38

    瀏覽量

    14382
  • 中斷控制器
    +關(guān)注

    關(guān)注

    0

    文章

    59

    瀏覽量

    9426
收藏 人收藏

    評論

    相關(guān)推薦

    計算機基礎(chǔ)知識

    科學(xué)的發(fā)展奠定了基礎(chǔ),而每克服它的一個缺點,都對計算機的發(fā)展帶來很大影響,其中影響最大的就是“程序存儲”方式的采用。將程序存儲方式的設(shè)想確立為體系的是美國數(shù)學(xué)家馮 諾依曼(Von Neuman
    發(fā)表于 03-08 15:50

    計算機操作系統(tǒng)的運行機制和體系結(jié)構(gòu)

    計算機操作系統(tǒng)-運行機制、體系結(jié)構(gòu)
    發(fā)表于 07-09 16:52

    視頻教程-《計算機體系結(jié)構(gòu) 硬件篇2》之 計算機通信-嵌入式 精選資料分享

    計算機體系結(jié)構(gòu) 硬件篇2》之 計算機通信 2008年畢業(yè)于沈陽航空航天大學(xué)...
    發(fā)表于 07-20 06:16

    計算機組成原理簡答題及答案

    裝置;計算機軟件:計算機運行所需要的程序及相關(guān)資料。硬件和軟件在計算機系統(tǒng)中相互依存,缺一不可。同等重要。2.如何理解計算機組成和計算機體系結(jié)構(gòu)
    發(fā)表于 07-22 06:53

    計算機組成和體系結(jié)構(gòu)

    Computer Organization and Architecture 計算機組成和體系結(jié)構(gòu)2019-2020 學(xué)年春季學(xué)期期末考試重點Chapter 1(教材第一章
    發(fā)表于 07-29 08:46

    了解計算機硬件體系結(jié)構(gòu)

    模塊一知識點1.了解計算機硬件體系結(jié)構(gòu)2.掌握常見的計算機硬件設(shè)備3.了解計算機軟件體系結(jié)構(gòu)4.掌握主板
    發(fā)表于 09-17 09:03

    計算機軟件體系結(jié)構(gòu)由哪幾部分組成?

    計算機軟件體系結(jié)構(gòu)由哪幾部分組成?
    發(fā)表于 10-25 08:24

    馮·諾伊曼結(jié)構(gòu)計算機程序和數(shù)據(jù)

    architecture),是一種將程序指令存儲器和數(shù)據(jù)存儲器合并在一起的電腦設(shè)計概念結(jié)構(gòu)。馮●諾依曼結(jié)構(gòu)計算機其程序和數(shù)據(jù)共用一個存儲空間,程序指令存儲地址和數(shù)據(jù)存儲地址指向同一個存儲器的不同
    發(fā)表于 12-22 06:06

    馮·諾依曼計算機體系結(jié)構(gòu)缺陷有哪些?

    馮·諾依曼結(jié)構(gòu)的特點是什么?馮·諾依曼計算機體系結(jié)構(gòu)缺陷有哪些?哈佛結(jié)構(gòu)具有哪些特點應(yīng)用場景?
    發(fā)表于 12-24 07:36

    計算機體系結(jié)構(gòu)的相關(guān)資料推薦

    第一部分 IO基礎(chǔ)知識計算機系統(tǒng)軟件體系結(jié)構(gòu)采用一種層的結(jié)構(gòu),有人說過一句名言:“Any problem in computer science can be solved by anther
    發(fā)表于 01-07 06:42

    馮諾依曼計算機體系結(jié)構(gòu)是怎樣組成的

    馮諾依曼計算機體系結(jié)構(gòu)是怎樣組成的?微型系統(tǒng)地結(jié)構(gòu)是怎樣組成的?
    發(fā)表于 02-10 06:15

    計算機體系結(jié)構(gòu)的發(fā)展及技術(shù)問題探討

    回顧了計算機體系的發(fā)展歷程,并分析了計算機體系的發(fā)展和技術(shù)研究的關(guān)鍵: Cell和多核等新型處理結(jié)構(gòu)和可重構(gòu)計算技術(shù)。提出了新的計算機體系結(jié)構(gòu)
    發(fā)表于 08-02 10:10 ?17次下載

    計算機體系結(jié)構(gòu)

    計算機體系結(jié)構(gòu)介紹資料
    發(fā)表于 06-21 16:27 ?0次下載

    馮諾伊曼計算機體系結(jié)構(gòu)

    馮·諾伊曼體系結(jié)構(gòu)是現(xiàn)代計算機的基礎(chǔ),現(xiàn)在大多計算機仍是馮·諾伊曼計算機的組織結(jié)構(gòu),只是作了一些改進而已,并沒有從根本上突破馮
    的頭像 發(fā)表于 12-24 15:21 ?6158次閱讀

    工業(yè)控制計算機體系結(jié)構(gòu)是什么

    工業(yè)控制計算機是一種專門為工業(yè)自動化控制領(lǐng)域設(shè)計的計算機系統(tǒng),具有高性能、高可靠性、實時性、可擴展性等特點。本文將詳細介紹工業(yè)控制計算機體系結(jié)構(gòu),包括其硬件
    的頭像 發(fā)表于 06-16 11:38 ?778次閱讀