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

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

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

45個(gè)寄存器、CPU核心技術(shù)大揭秘(上)

jf_78858299 ? 來源:編程技術(shù)宇宙 ? 作者:軒轅之風(fēng)O ? 2023-04-03 14:35 ? 次閱讀

寄存器這個(gè)太多太復(fù)雜,不適合寫故事,拖了很久,總算是寫完了,這篇文章就來詳細(xì)聊聊x86/x64架構(gòu)CPU中那些紛繁復(fù)雜的寄存器們。

長文預(yù)警,時(shí)速較快,請(qǐng)系好安全帶~起飛~

自1946年馮·諾伊曼領(lǐng)導(dǎo)下誕生的世界上第一臺(tái)通用電子計(jì)算機(jī)ENIAC至今,計(jì)算機(jī)技術(shù)已經(jīng)發(fā)展了七十多載。

從當(dāng)初專用于數(shù)學(xué)計(jì)算的龐然大物,到后來大型機(jī)服務(wù)器時(shí)代,從個(gè)人微機(jī)技術(shù)蓬勃發(fā)展,到互聯(lián)網(wǎng)浪潮席卷全球,再到移動(dòng)互聯(lián)網(wǎng)、云計(jì)算日新月異的當(dāng)下,計(jì)算機(jī)變的形態(tài)各異,無處不在。

這七十多年中,出現(xiàn)了數(shù)不清的編程語言,通過這些編程語言,又開發(fā)了無數(shù)的應(yīng)用程序。

可無論什么樣的應(yīng)用程序,什么樣的編程語言,最終的程序邏輯都是要交付給CPU去執(zhí)行實(shí)現(xiàn)的(當(dāng)然這里有些不嚴(yán)謹(jǐn),除了CPU,還有協(xié)處理器、GPU等等)。所以了解和學(xué)習(xí)CPU的原理都是對(duì)計(jì)算機(jī)基礎(chǔ)知識(shí)的夯實(shí)大有裨益。

在七十多年的漫長歷程中,也涌現(xiàn)了不少架構(gòu)的CPU。

  • MIPS
  • PowerPC
  • x86/x64
  • IA64
  • ARM
  • ······

這篇文章就以市場應(yīng)用最為廣泛的x86-x64架構(gòu)為目標(biāo),通過學(xué)習(xí)了解它內(nèi)部的100個(gè)寄存器功能作用,來串聯(lián)闡述CPU底層工作原理。

通過這篇文章,你將了解到:

  • CPU指令執(zhí)行原理
  • 內(nèi)存尋址技術(shù)
  • 軟件調(diào)試技術(shù)原理
  • 中斷與異常處理
  • 系統(tǒng)調(diào)用
  • CPU多任務(wù)技術(shù)

什么是寄存器?

寄存器是CPU內(nèi)部用來存放數(shù)據(jù)的一些小型存儲(chǔ)區(qū)域,用來暫時(shí)存放參與運(yùn)算的數(shù)據(jù)和運(yùn)算結(jié)果以及一些CPU運(yùn)行需要的信息。

x86架構(gòu)CPU走的是復(fù)雜指令集(CISC) 路線,提供了豐富的指令來實(shí)現(xiàn)強(qiáng)大的功能,與此同時(shí)也提供了大量寄存器來輔助功能實(shí)現(xiàn)。這篇文章將覆蓋下面這些寄存器:

  • 通用寄存器
  • 標(biāo)志寄存器
  • 指令寄存器
  • 段寄存器
  • 控制寄存器
  • 調(diào)試寄存器
  • 描述符寄存器
  • 任務(wù)寄存器
  • MSR寄存器

通用寄存器

首當(dāng)其沖的是通用寄存器,這些的寄存器是程序執(zhí)行代碼最最常用,也最最基礎(chǔ)的寄存器,程序執(zhí)行過程中,絕大部分時(shí)間都是在操作這些寄存器來實(shí)現(xiàn)指令功能。

所謂通用,即這些寄存器CPU沒有特殊的用途,交給應(yīng)用程序“隨意”使用。注意,這個(gè)隨意,我打了引號(hào),對(duì)于有些寄存器,CPU有一些潛規(guī)則,用的時(shí)候要注意。

  • eax : 通常用來執(zhí)行加法,函數(shù)調(diào)用的返回值一般也放在這里面
  • ebx : 數(shù)據(jù)存取
  • ecx : 通常用來作為計(jì)數(shù)器,比如for循環(huán)
  • edx : 讀寫I/O端口時(shí),edx用來存放端口號(hào)
  • esp : 棧頂指針,指向棧的頂部
  • ebp : 棧底指針,指向棧的底部,通常用ebp+偏移量的形式來定位函數(shù)存放在棧中的局部變量
  • esi : 字符串操作時(shí),用于存放數(shù)據(jù)源的地址
  • edi : 字符串操作時(shí),用于存放目的地址的,和esi兩個(gè)經(jīng)常搭配一起使用,執(zhí)行字符串的復(fù)制等操作

在x64架構(gòu)中,上面的通用寄存器都擴(kuò)展成為64位版本,名字也進(jìn)行了升級(jí)。當(dāng)然,為了兼容32位模式程序,使用上面的名字仍然是可以訪問的,相當(dāng)于訪問64位寄存器的低32位。

rax rbx rcx rdx rsp rbp rsi rdi

除了擴(kuò)展原來存在的通用寄存器,x64架構(gòu)還引入了8個(gè)新的通用寄存器:

r8-r15

在原來32位時(shí)代,函數(shù)調(diào)用時(shí),那個(gè)時(shí)候通用寄存器少,參數(shù)絕大多數(shù)時(shí)候是通過線程的棧來進(jìn)行傳遞(當(dāng)然也有使用寄存器傳遞的,比如著名的C++ this指針使用ecx寄存器傳遞,不過能用的寄存器畢竟不多)。

進(jìn)入x64時(shí)代,寄存器資源富裕了,參數(shù)傳遞絕大多數(shù)都是用寄存器來傳了。寄存器傳參的好處是速度快,減少了對(duì)內(nèi)存的讀寫次數(shù)。

當(dāng)然,具體使用棧還是用寄存器傳參數(shù),這個(gè)不是編程語言決定的,而是編譯器在編譯生成CPU指令時(shí)決定的,如果編譯器非要在x64架構(gòu)CPU上使用線程棧來傳參那也不是不行,這個(gè)對(duì)高級(jí)語言是無感知的。

標(biāo)志寄存器

標(biāo)志寄存器,里面有眾多標(biāo)記位,記錄了CPU執(zhí)行指令過程中的一系列狀態(tài),這些標(biāo)志大都由CPU自動(dòng)設(shè)置和修改:

  • CF 進(jìn)位標(biāo)志
  • PF 奇偶標(biāo)志
  • ZF 零標(biāo)志
  • SF 符號(hào)標(biāo)志
  • OF 補(bǔ)碼溢出標(biāo)志
  • TF 跟蹤標(biāo)志
  • IF 中斷標(biāo)志 ······

圖片

在x64架構(gòu)下,原來的eflags寄存器升級(jí)為64位的rflags,不過其高32位并沒有新增什么功能,保留為將來使用。

指令寄存器

eip : 指令寄存器可以說是CPU中最最重要的寄存器了,它指向了下一條要執(zhí)行的指令所存放的地址,CPU的工作其實(shí)就是不斷取出它指向的指令,然后執(zhí)行這條指令,同時(shí)指令寄存器繼續(xù)指向下面一條指令,如此不斷重復(fù),這就是CPU工作的基本日常。

而在漏洞攻擊中,黑客想盡辦法費(fèi)盡心機(jī)都想要修改指令寄存器的地址,從而能夠執(zhí)行惡意代碼。

同樣的,在x64架構(gòu)下,32位的eip升級(jí)為64位的rip寄存器。

段寄存器

段寄存器與CPU的內(nèi)存尋址技術(shù)緊密相關(guān)。

早在16位的8086CPU時(shí)代,內(nèi)存資源寶貴,CPU使用分段式內(nèi)存尋址技術(shù):

圖片

16位的寄存器能尋址的范圍是64KB,通過引入段的概念,將內(nèi)存空間劃分為不同的區(qū)域:分段,通過段基址+段內(nèi)偏移段方式來尋址。

這樣一來,段的基地址保存在哪里呢?8086CPU專門設(shè)置了幾個(gè)段寄存器用來保存段的基地址,這就是段寄存器段的由來。

段寄存器也是16位的。

段寄存器有下面6個(gè),前面4個(gè)是早期16位模式就引入了,到了32位時(shí)代,又新增了fs和gs兩個(gè)段寄存器。

  • cs : 代碼段
  • ds : 數(shù)據(jù)段
  • ss : 棧段
  • es : 擴(kuò)展段
  • fs : 數(shù)據(jù)段
  • gs : 數(shù)據(jù)段

段寄存器里面存儲(chǔ)的內(nèi)容與CPU當(dāng)前工作的內(nèi)存尋址模式緊密相關(guān)。

當(dāng)CPU處于16位實(shí)地址模式下時(shí),段寄存器存儲(chǔ)段的基地址,尋址時(shí),將段寄存器內(nèi)容左移4位(乘以16)得到段基地址+段內(nèi)偏移得到最終的地址。

當(dāng)CPU工作于保護(hù)模式下,段寄存器存儲(chǔ)的內(nèi)容不再是段基址了,此時(shí)的段寄存器中存放的是 段選擇子 ,用來指示當(dāng)前這個(gè)段寄存器“指向”的是哪個(gè)分段。

注意我這里的指向打了引號(hào),段寄存器中存儲(chǔ)的并不是內(nèi)存段的直接地址,而是段選擇子,它的結(jié)構(gòu)如下:

圖片

16個(gè)bit長度的段寄存器內(nèi)容劃分了三個(gè)字段:

  • PRL : 特權(quán)請(qǐng)求級(jí),就是我們常說的ring0-ring3四個(gè)特權(quán)級(jí)。
  • TI : 0表示用的是全局描述符表GDT,1表示使用的是局部描述符表LDT。
  • Index : 這是一個(gè)表格中表項(xiàng)的索引值,這個(gè)表格叫 內(nèi)存描述符表 ,它的每一個(gè)表項(xiàng)都描述了一個(gè)內(nèi)存分段。

這里提到了兩個(gè)表,全局描述符表GDT和局部描述符表LDT,關(guān)于這兩個(gè)表的介紹,下面介紹描述符寄存器時(shí)再詳述,這里只需要知道,這是CPU支持分段式內(nèi)存管理需要的表格,放在內(nèi)存中,表格中的每一項(xiàng)都是一個(gè)描述符,記錄了一個(gè)內(nèi)存分段的信息。

保護(hù)模式下的段寄存器和段描述符到最后的內(nèi)存分段,通過下圖的方式聯(lián)系在一起:

圖片

通用寄存器、段寄存器、標(biāo)志寄存器、指令寄存器,這四組寄存器共同構(gòu)成了一個(gè)基本的指令執(zhí)行環(huán)境,一個(gè)線程的上下文也基本上就是這些寄存器,在執(zhí)行線程切換的時(shí)候,就是修改它們的內(nèi)容。

圖片

控制寄存器

控制寄存器是CPU中一組相當(dāng)重要的寄存器,我們知道eflags寄存器記錄了當(dāng)前運(yùn)行線程的一系列關(guān)鍵信息。

那CPU運(yùn)行過程中自身的一些關(guān)鍵信息保存在哪里呢?答案是控制寄存器!

圖片

32位CPU總共有cr0-cr4共5個(gè)控制寄存器,64位增加了cr8。他們各自有不同的功能,但都存儲(chǔ)了CPU工作時(shí)的重要信息:

  • cr0 : 存儲(chǔ)了CPU控制標(biāo)記和工作狀態(tài)
  • cr1 : 保留未使用
  • cr2 : 頁錯(cuò)誤出現(xiàn)時(shí)保存導(dǎo)致出錯(cuò)的地址
  • cr3 : 存儲(chǔ)了當(dāng)前進(jìn)程的虛擬地址空間的重要信息——頁目錄地址
  • cr4 : 也存儲(chǔ)了CPU工作相關(guān)以及當(dāng)前人任務(wù)的一些信息
  • cr8 : 64位新增擴(kuò)展使用 其中,CR0尤其重要,它包含了太多重要的CPU信息。

一些重要的標(biāo)記位含義如下:

PG: 是否啟用內(nèi)存分頁

AM: 是否啟用內(nèi)存對(duì)齊自動(dòng)檢查

WP: 是否開啟內(nèi)存寫保護(hù),若開啟,對(duì)只讀頁面嘗試寫入時(shí)將觸發(fā)異常,這一機(jī)制常常被用來實(shí)現(xiàn)寫時(shí)復(fù)制功能

PE: 是否開啟保護(hù)模式

除了CR0,另一個(gè)值得關(guān)注的寄存器是CR3,它保存了當(dāng)前進(jìn)程所使用的虛擬地址空間的頁目錄地址,可以說是整個(gè)虛擬地址翻譯中的頂級(jí)指揮棒,在進(jìn)程空間切換的時(shí)候,CR3也將同步切換。

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

    關(guān)注

    31

    文章

    5271

    瀏覽量

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

    關(guān)注

    68

    文章

    10772

    瀏覽量

    210437
  • X86
    X86
    +關(guān)注

    關(guān)注

    5

    文章

    291

    瀏覽量

    43329
  • X64
    X64
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    7825
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    解析CPU中的寄存器

    8位寄存器在16位寄存器中,而16位寄存器在32位寄存器中。
    發(fā)表于 09-19 10:10 ?3801次閱讀

    CPU核心技術(shù)

    CPU核心技術(shù)           核心(Die)又稱為內(nèi)核,是CPU最重要的組
    發(fā)表于 12-18 09:54 ?1423次閱讀

    寄存器組網(wǎng)絡(luò)處理寄存器分配技術(shù)

    本內(nèi)容提供了多寄存器組網(wǎng)絡(luò)處理寄存器分配技術(shù)
    發(fā)表于 06-28 15:26 ?28次下載
    多<b class='flag-5'>寄存器</b>組網(wǎng)絡(luò)處理<b class='flag-5'>器</b><b class='flag-5'>上</b>的<b class='flag-5'>寄存器</b>分配<b class='flag-5'>技術(shù)</b>

    通過了解寄存器的功能與作用去揭秘CPU核心技術(shù)

    這篇文章就以市場應(yīng)用最為廣泛的x86-x64架構(gòu)為目標(biāo),通過學(xué)習(xí)了解它內(nèi)部的100個(gè)寄存器功能作用,來串聯(lián)闡述CPU底層工作原理。
    的頭像 發(fā)表于 04-27 14:32 ?4795次閱讀
    通過了解<b class='flag-5'>寄存器</b>的功能與作用去<b class='flag-5'>揭秘</b><b class='flag-5'>CPU</b><b class='flag-5'>核心技術(shù)</b>

    深度學(xué)習(xí)_硬件知識(shí)_寄存器與下拉寄存器

    ),對(duì)應(yīng)引腳輸出高電平。拉是一個(gè)電阻接到一個(gè)電壓,其實(shí)就是增強(qiáng)IO的驅(qū)動(dòng)能力。下拉寄存器下拉就是一個(gè)電阻接到地,保證IO口是低電平。...
    發(fā)表于 01-14 14:31 ?10次下載
    深度學(xué)習(xí)_硬件知識(shí)_<b class='flag-5'>上</b>拉<b class='flag-5'>寄存器</b>與下拉<b class='flag-5'>寄存器</b>

    如何在VHDL中實(shí)現(xiàn)一個(gè)簡單的寄存器

    寄存器是設(shè)備中用于存儲(chǔ)數(shù)據(jù)的常見電子元件。這些是最小的數(shù)據(jù)保存元素,用于存儲(chǔ) CPU 正在處理的操作數(shù)或指令。有不同類型的寄存器,即指令寄存器、程序
    發(fā)表于 07-29 16:48 ?4454次閱讀
    如何在VHDL中實(shí)現(xiàn)一<b class='flag-5'>個(gè)</b>簡單的<b class='flag-5'>寄存器</b>

    如何使用ALU,RAM,寄存器打造一個(gè)CPU 1

    CPU簡介 **「計(jì)算機(jī)的心臟是中央處理單元,簡稱“CPU”」** 。這篇文章就利用前幾篇文章中提到過的ALU,RAM,寄存器組件做一個(gè)CPU
    的頭像 發(fā)表于 01-30 15:56 ?763次閱讀

    如何使用ALU,RAM,寄存器打造一個(gè)CPU 2

    CPU簡介 **「計(jì)算機(jī)的心臟是中央處理單元,簡稱“CPU”」** 。這篇文章就利用前幾篇文章中提到過的ALU,RAM,寄存器組件做一個(gè)CPU
    的頭像 發(fā)表于 01-30 15:56 ?711次閱讀
    如何使用ALU,RAM,<b class='flag-5'>寄存器</b>打造一<b class='flag-5'>個(gè)</b><b class='flag-5'>CPU</b> 2

    如何使用ALU,RAM,寄存器打造一個(gè)CPU 3

    在指令表中我們看到ADD指令的后四位 **「寄存器 OR RAM地址一列中,列出來的不是之前的RAM地址而是兩位的寄存器ID」** 。兩位可以表示四個(gè)數(shù)字,正好對(duì)應(yīng)ABCD四個(gè)
    的頭像 發(fā)表于 01-30 16:01 ?1040次閱讀
    如何使用ALU,RAM,<b class='flag-5'>寄存器</b>打造一<b class='flag-5'>個(gè)</b><b class='flag-5'>CPU</b> 3

    cpu寄存器和存儲(chǔ)的區(qū)別

    cpu寄存器和存儲(chǔ)的區(qū)別 寄存器存在于CPU中,速度很快,數(shù)目有限;存儲(chǔ)是內(nèi)存,速度稍慢,但
    發(fā)表于 03-21 15:12 ?1300次閱讀

    計(jì)算機(jī)寄存器和存儲(chǔ)

    存儲(chǔ),CPU都在一個(gè)片內(nèi),所以寄存器是片內(nèi)RAM的一部分。 存儲(chǔ)插在主板,容量大,速度慢
    發(fā)表于 03-21 15:22 ?1947次閱讀

    45個(gè)寄存器、CPU核心技術(shù)揭秘(下)

    寄存器這個(gè)太多太復(fù)雜,不適合寫故事,拖了很久,總算是寫完了,這篇文章就來詳細(xì)聊聊x86/x64架構(gòu)的CPU中那些紛繁復(fù)雜的寄存器們。
    的頭像 發(fā)表于 04-03 14:36 ?1670次閱讀
    <b class='flag-5'>45</b><b class='flag-5'>個(gè)</b><b class='flag-5'>寄存器</b>、<b class='flag-5'>CPU</b><b class='flag-5'>核心技術(shù)</b>大<b class='flag-5'>揭秘</b>(下)

    CPU的6個(gè)主要寄存器

    CPU寄存器是中央處理內(nèi)的組成部分,是有限存貯容量的高速存貯部件。寄存器CPU內(nèi)部的元件,包括通用
    的頭像 發(fā)表于 02-03 15:15 ?3306次閱讀

    CPU寄存器的用途

    在計(jì)算機(jī)體系結(jié)構(gòu)中,中央處理單元(CPU)無疑是整個(gè)系統(tǒng)的核心。CPU負(fù)責(zé)執(zhí)行指令、處理數(shù)據(jù)、控制計(jì)算機(jī)系統(tǒng)的運(yùn)行等關(guān)鍵任務(wù)。而在這個(gè)過程中,寄存器扮演著至關(guān)重要的角色。本文將詳細(xì)探討
    的頭像 發(fā)表于 05-30 17:09 ?986次閱讀

    寄存器分為基本寄存器和什么兩種

    寄存器是計(jì)算機(jī)中用于存儲(chǔ)數(shù)據(jù)的高速存儲(chǔ)單元,它們是CPU內(nèi)部的重要組成部分。寄存器可以分為基本寄存器和擴(kuò)展寄存器兩種類型。 一、基本
    的頭像 發(fā)表于 07-12 10:31 ?831次閱讀