【基礎知識】 CPU 詳細整理(個人整理)


本文只是個人對cpu的理解,不建議瀏覽

建議瀏覽:https://zhuanlan.zhihu.com/p/397260483

提要

64位/32位操作系統,64/32指的是通用寄存器的位數。

定義

中央處理器 (英語:Central Processing Unit,縮寫:CPU)是計算機的主要設備之一,功能主要是解釋計算機指令以及處理計算機軟件中的數據。

組成

CPU運行圖(自己畫的)

CPU的運作原理:取指令》譯碼》獲取操作數》執行指令(ALU)》存儲(寄存器)

 

 

 

 

1、取指令

取指令(Instruction Fetch,IF)階段是將一條指令從主存中取到指令寄存器的過程。 程序計數器 PC 中的數值,用來指示當前指令在主存中的位置。當一條指令被取出后,PC 中的數值將根據指令字長度而自動遞增:若為單字長指令,則(PC)+1->PC;若為雙字長指令,則(PC)+2->PC,依此類推。

2.指令譯碼階段

取出指令后,計算機立即進入指令譯碼(Instruction Decode,ID)階段。 在指令譯碼階段,指令譯碼器按照預定的指令格式,對取回的指令進行拆分和解釋,識別區分出不同的指令類別以及各種獲取操作數的方法。在組合邏輯控制的計算機中,指令譯碼器對不同的指令操作碼產生不同的控制電位,以形成不同的微操作序列;在微程序控制的計算機中,指令譯碼器用指令操作碼來找到執行該指令的微程序的入口,並從此入口開始執行。 在傳統的設計里,CPU中負責指令譯碼的部分是無法改變的。不過,在眾多運用微程序控制技術的新型 CPU 中,微程序有時是可重寫的。

3.執行指令階段

在取指令和指令譯碼階段之后,接着進入執行指令(Execute,EX)階段。 此階段的任務是完成指令所規定的各種操作,具體實現指令的功能。為此,CPU 的不同部分被連接起來,以執行所需的操作。 例如,如果要求完成一個加法運算,算術邏輯單元 ALU 將被連接到一組輸入和一組輸出,輸入端提供需要相加的數值,輸出端將含有最后的運算結果。

4.訪存取數階段

根據指令需要,有可能要訪問主存,讀取操作數,這樣就進入了訪存取數(Memory,MEM)階段。 此階段的任務是:根據指令地址碼,得到操作數在主存中的地址,並從主存中讀取該操作數用於運算。

5.結果寫回階段

作為最后一個階段,結果寫回(Writeback,WB)階段把執行指令階段的運行結果數據“寫回”到某種存儲形式:結果數據經常被寫到 CPU 的內部寄存器中,以便被后續的指令快速地存取;在有些情況下, 結果數據也可被寫入相對較慢、但較廉價且容量較大的主存。許多指令還會改變程序狀態字寄存器

中標志位 的狀態,這些標志位標識着不同的操作結果,可被用來影響程序的動作。

在指令執行完畢、結果數據寫回之后,若無意外事件(如結果溢出等)發生,計算機就接着從程序計數器 PC 中取得下一條指令地址,開始新一輪的循環,下一個指令周期將順序取出下一條指令。許多新型 CPU 可以同時取出、譯碼和執行多條指令,體現並行處理的特性。

CPU的內部結構解析

CPU和內存是由許多晶體管組成的電子部件,通常稱為IC(Integrated Circuit,集成電路)。從功能方面來看,CPU的內部由寄存器,控制器,運算器和時鍾四部分構成,各部分之間由電流信號相互連通。

寄存器:

可用來暫存指令,數據等處理對象,可以將其看做是內存的一種。根據種類的不同,一個CPU內部會有20~100個寄存器。

使用高級語言編寫的程序會在編譯后轉化成機器語言,然后通過CPU內部的寄存器來處理。不同類型的CPU,其內部寄存器的數量,種類以及寄存器存儲的數值范圍都是不同的。根據功能的不同,我們可以將寄存器大致划分為八類。

累加寄存器:存儲執行運算的數據和運算后的數據。

標志寄存器:存儲運算處理后的CPU的狀態。

pc程序計數器:指令指針 存儲下一條指令所在內存的地址。

指令計數器是用於存放下一條指令所在單元的地址的地方。
為了保證程序(在操作系統中理解為進程)能夠連續地執行下去,CPU必須具有某些手段來確定下一條指令的地址。而 程序計數器正是起到這種作用,所以通常又稱為指令計數器。在程序開始執行前,必須將它的起始地址,即程序的一條指令所在的內存單元地址送入PC,因此程序計數器(PC)的內容即是從內存提取的第一條指令的地址。當執行指令時, CPU將自動修改PC的內容,即每執行一條指令PC增加一個量,這個量等於指令所含的字節數,以便使其保持的總是將要執行的下一條指令的地址。由於大多數指令都是按順序來執行的,所以修改的過程通常只是簡單的對PC加1。PC的維數一般和存儲器地址寄存器MAR的維數一樣。

當程序轉移時,轉移指令執行的最終結果就是要改變PC的值,此PC值就是轉去的地址,以此實現轉移。有些機器中也稱PC為指令指針IP(Instruction Pointer)

基址寄存器:存儲數據內存的起始地址。

變址寄存器:存儲基址寄存器的相對地址。

通用寄存器:存儲任意數據。

指令寄存器:存儲指令。CPU內部使用,程序員無法通過程序對該寄存器進行讀寫操作。

棧寄存器:存儲棧區域的起始地址。

取指令:程序計數器是用於存放下一條指令所在單元的地址的地方。當執行一條指令時,首先需要根據PC中存放的指令地址,將指令由內存取到指令寄存器中,此過程稱為“取指令”

其中,程序計數器,累加寄存器,標志寄存器,指令寄存器和棧寄存器都只有一個,其他的寄存器一般有多個。

譯碼器:指令譯碼器的東西根據IR的內容生成很多的微操作指令,從而去控制其他部件已完成相應的功能

控制器:

負責把內存上的指令,數據等讀入寄存器,並根據指令的執行結果來控制整個計算機。

運算器:

負責運算從內存讀入寄存器的數據。

時鍾:

負責發出CPU開始計時的時鍾信號。不過,也有些計算機的時鍾位於CPU的外部。

 

詳細內如:https://www.cnblogs.com/cdaniu/p/15620020.html

CPU指令集是什么

詳細查看:https://www.cnblogs.com/cdaniu/p/15625234.html

微架構

微架構是指一套用於執行指令集的微處理器設計方法,每一個CPU都會用用一套微框架來處理指令集

詳細請看:https://www.cnblogs.com/cdaniu/p/15625508.html

MMU(Memory Management Unit)內存管理單元

CPU 的主頻:CPU 的主頻是由一個晶體振盪器來實現的

一種硬件電路單元負責將虛擬內存地址轉換為物理內存地址

所有的內存訪問都將通過 MMU 進行轉換,除非沒有使能 MMU。

MMU(內存管理單元):包括從邏輯地址到虛擬地址(線性地址)再到內存地址的變換過程、頁式存儲管理、段式存儲管理、段頁式存儲管理、虛擬存儲管理(請求分頁、請求分段、請求段頁)。 MMU位於CPU內部,可以假想為一個進程的所需要的資源都放在虛擬地址空間里面,而CPU在取指令時,機器指令中的地址碼部分為虛擬地址(線性地址),需要經過MMU轉換成為內存地址,才能進行取指令。

    • Swap模式時代

    • 早期計算機在執行程序時,將程序從磁盤加載到內存執行中執行,在多用戶系統中,當新的用戶程序被執行前,需要先將當前用戶的程序從內存swap到磁盤,然后從磁盤加載新的程序執行,當前用戶退出后,在將前一用戶程序從磁盤中加載到內存繼續執行,每次用戶切換伴隨程序的swap,消耗較大。

 

 

 Page模式時代

后來人們將內存划分為固定大小的Page,一般為4K或者更小,這樣用戶程序按需以Page的方式加載到內存,不需要將整個程序加載到內存,這樣內存可同時容納更多程序,而無需按照用戶切換進行swap,提升了內存利用率和加載時間(PageFault是Page時代的產物,而非MMU時代獨有)。

 

  • 動態地址轉換(DAT - Dynamic Address Translation)時代

  • 最早可以追溯到1966年IBM研發的System/360-Model67,在該計算機的設計中首先引入了動態的地址轉換機制,在Page模式基礎上,為用戶程序分配虛地址(VA),通過DAT轉換為物理地址(PA)進行訪問。通過好處是用戶可以使用連續的地址,而不再受制於物理內存大小和Page碎片化的限制,原則上用戶的程序只受磁盤大小限制,代價是增加虛實地址轉換機制。

    • 實現方式
      采用segment、page、offset模式,將24-bit虛擬地址分為3段,0-7bit保留,8-11bit索引segment,一共16個segment,12-19bit索引page,每個segment最多256個page,20-31bit為page offset,每個用戶有一個虛實地址映射表,分為2級,即segment表和page表,每個segment指向一個page表。

    • 轉換過程
      當CPU訪問一個虛地址時,先通過VA的8-11bit查找segment表得到page表,再根據12-19bit在page表中找到PA的page起始地址,加上20-31bit的page offset就得到實際的PA了。

這就是MMU最早的雛形了。

 

 

 

現代MMU的實現

現代CPU的MMU的地址轉換方式一般分為3種模式,即實地址模式、塊地址轉換、頁地址轉換。

 

 

 

現代MMU的實現

現代CPU的MMU的地址轉換方式一般分為3種模式,即實地址模式、塊地址轉換、頁地址轉換。

 

 

 

    • 實地址模式

    • 即CPU狀態位中MMU使能位清零,MMU處於關閉狀態,此時CPU操作的地址不經過轉換(VA=PA),直接作為物理地址進行訪問,CPU上電時或者在異常入口時處於該狀態,在該狀態下可以訪問任意物理內存,非常危險,一般操作系統在CPU上電后做完必要初始化以后便使能MMU,或者在異常處理的入口保存好必要信息后使能MMU。

    • 塊地址轉換

    • 或者成為固定的地址轉換或靜態配置的地址轉換表,這種模式支持配置一些固定的內存地址映射(VPN->RPN),比如Linux Kernel加載的地址,以PowerPC604為例,0xC0000000這段地址開始的256M內存映射使用了該模式的轉換,好處是這種配置轉換速度快,一般在特定的寄存器中配置,沒有頁表查找過程,缺點是缺乏靈活性,一次配置永久使用。

    • 頁地址轉換

    • 類似於早期的動態地址轉換DAT,即將VA的一部分bit用於索引segment,另外一部分bit用於索引PTE表,最終得到物理地址的Page起始地址,再加上最后12bit(4K)的Page offset得到真正的物理地址。

      相比早期的DAT,有以下優化:

    • 增加了PTE表的緩存TLB(Translation lookaside Buffer),有些處理器將ITLB(指令)和DTLB(數據)分開,以減少指令和數據之間的緩存沖突。

    • 支持更大的物理地址(36bit以上)或邏輯地址,如在PowerPC中,用以應對現代操作系統的多進程管理將32bit通過segment寄存器擴展為52bit的邏輯地址,然后通過hash函數得到key用來查找PTE,並最終轉換為36bit物理地址,邏輯地址的擴展用於減少多進程之間的PTE沖突。

    • 支持多種PTE查找方式,如硬件查找和軟件查找。

                   MMU地址轉換流程如下:

 

 

 

主要分為幾個階段:

  • 用戶進程訪問虛存地址。
  • 觸發TLB查找過程,該部分通過硬件完成(灰色背景),沒有軟件參與。
  • TLB miss場景下,查找PTE(粉色背景),該部分在不同CPU上實現不同,像X86都是硬件查找,PowerPC有些處理器使用軟件查找,即在內核實現一個TLB miss的異常處理,可以靈活做到TLB查找。
  • Do Page Fault,分為幾種情況:
    • 新申請內存第一次讀寫,觸發物理內存分配
    • 進程fork后子進程寫內存觸發Copy-On-Write。
    • 非法內存讀寫,錯誤處理

 

 

 

 

匯編語言的的指令是和寄存器和運算器 存儲器一 一對應的。如,加法指令00000011寫成匯編語言就是 ADD。只要還原成二進制,匯編語言就可以被 CPU 直接執行,所以它是最底層的低級語言。

C# IL代碼指令不是一 一對應的。IL的指令是組合出來的。是對機器指令的抽象。

內容來源:https://my.oschina.net/u/4274516/blog/3522193

https://my.oschina.net/u/4398626/blog/3929100

https://my.oschina.net/u/4370598/blog/3757485

https://my.oschina.net/u/4391341/blog/3612316


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM