學(xué)習(xí)啦>學(xué)習(xí)電腦>電腦入門(mén)>

邏輯地址線性地址物理地址三個(gè)地址有什么聯(lián)系

時(shí)間: 春健736 分享

  在計(jì)算機(jī)科學(xué)中,邏輯地址是什么?線性地址是什么?物理地址優(yōu)勢(shì)什么?邏輯地址線性地址物理地址三個(gè)地址有什么聯(lián)系?學(xué)習(xí)啦小編整理了邏輯地址,線性地址以及物理地址的相關(guān)資料,下面大家跟著學(xué)習(xí)啦小編一起去了解一下吧。

  邏輯地址線性地址物理地址

  一、邏輯地址轉(zhuǎn)線性地址

  機(jī)器語(yǔ)言指令中出現(xiàn)的內(nèi)存地址,都是邏輯地址,需要轉(zhuǎn)換成線性地址,再經(jīng)過(guò)MMU(CPU中的內(nèi)存管理單元)轉(zhuǎn)換成物理地址才能夠被訪問(wèn)到。

  我們寫(xiě)個(gè)最簡(jiǎn)單的hello world程序,用gcc編譯,再反匯編后會(huì)看到以下指令:

  mov 0x80495b0, %eax

  這里的內(nèi)存地址0x80495b0 就是一個(gè)邏輯地址,必須加上隱含的DS 數(shù)據(jù)段的基地址,才能構(gòu)成線性地址。也就是說(shuō) 0x80495b0 是當(dāng)前任務(wù)的DS數(shù)據(jù)段內(nèi)的偏移。

  在x86保護(hù)模式下,段的信息(段基線性地址、長(zhǎng)度、權(quán)限等)即段描述符占8個(gè)字節(jié),段信息無(wú)法直接存放在段寄存器中(段寄存器只有2字節(jié))。Intel的設(shè)計(jì)是段描述符集中存放在GDT或LDT中,而段寄存器存放的是段描述符在GDT或LDT內(nèi)的索引值(index)。

  Linux中邏輯地址等于線性地址。為什么這么說(shuō)呢?因?yàn)長(zhǎng)inux所有的段(用戶(hù)代碼段、用戶(hù)數(shù)據(jù)段、內(nèi)核代碼段、內(nèi)核數(shù)據(jù)段)的線性地址都是從 0x00000000 開(kāi)始,長(zhǎng)度4G,這樣 線性地址=邏輯地址+ 0x00000000,也就是說(shuō)邏輯地址等于線性地址了。

  這樣的情況下Linux只用到了GDT,不論是用戶(hù)任務(wù)還是內(nèi)核任務(wù),都沒(méi)有用到LDT。GDT的第12和13項(xiàng)段描述符是 __KERNEL_CS 和__KERNEL_DS,第14和15項(xiàng)段描述符是 __USER_CS 和__USER_DS。內(nèi)核任務(wù)使用__KERNEL_CS 和__KERNEL_DS,所有的用戶(hù)任務(wù)共用__USER_CS 和__USER_DS,也就是說(shuō)不需要給每個(gè)任務(wù)再單獨(dú)分配段描述符。內(nèi)核段描述符和用戶(hù)段描述符雖然起始線性地址和長(zhǎng)度都一樣,但DPL(描述符特權(quán)級(jí))是不一樣的。__KERNEL_CS 和__KERNEL_DS 的DPL值為0(最高特權(quán)),__USER_CS 和__USER_DS的DPL值為3。

  用gdb調(diào)試程序的時(shí)候,用info reg 顯示當(dāng)前寄存器的值:

  cs 0x73 115

  ss 0x7b 123

  ds 0x7b 123

  es 0x7b 123

  可以看到ds值為0x7b, 轉(zhuǎn)換成二進(jìn)制為 00000000 01111011,TI字段值為0,表示使用GDT,GDT索引值為 01111,即十進(jìn)制15,對(duì)應(yīng)的就是GDT內(nèi)的__USER_DS用戶(hù)數(shù)據(jù)段描述符。

  從上面可以看到,Linux在x86的分段機(jī)制上運(yùn)行,卻通過(guò)一個(gè)巧妙的方式繞開(kāi)了分段。

  Linux主要以分頁(yè)的方式實(shí)現(xiàn)內(nèi)存管理。

  二、線性地址轉(zhuǎn)物理地址

  前面說(shuō)了Linux中邏輯地址等于線性地址,那么線性地址怎么對(duì)應(yīng)到物理地址呢?這個(gè)大家都知道,那就是通過(guò)分頁(yè)機(jī)制,具體的說(shuō),就是通過(guò)頁(yè)表查找來(lái)對(duì)應(yīng)物理地址。

  準(zhǔn)確的說(shuō)分頁(yè)是CPU提供的一種機(jī)制,Linux只是根據(jù)這種機(jī)制的規(guī)則,利用它實(shí)現(xiàn)了內(nèi)存管理。

  在保護(hù)模式下,控制寄存器CR0的最高位PG位控制著分頁(yè)管理機(jī)制是否生效,如果PG=1,分頁(yè)機(jī)制生效,需通過(guò)頁(yè)表查找才能把線性地址轉(zhuǎn)換物理地址。如果PG=0,則分頁(yè)機(jī)制無(wú)效,線性地址就直接做為物理地址。

  分頁(yè)的基本原理是把內(nèi)存劃分成大小固定的若干單元,每個(gè)單元稱(chēng)為一頁(yè)(page),每頁(yè)包含4k字節(jié)的地址空間(為簡(jiǎn)化分析,我們不考慮擴(kuò)展分頁(yè)的情況)。這樣每一頁(yè)的起始地址都是4k字節(jié)對(duì)齊的。為了能轉(zhuǎn)換成物理地址,我們需要給CPU提供當(dāng)前任務(wù)的線性地址轉(zhuǎn)物理地址的查找表,即頁(yè)表(page table)。注意,為了實(shí)現(xiàn)每個(gè)任務(wù)的平坦的虛擬內(nèi)存,每個(gè)任務(wù)都有自己的頁(yè)目錄表和頁(yè)表。

  為了節(jié)約頁(yè)表占用的內(nèi)存空間,x86將線性地址通過(guò)頁(yè)目錄表和頁(yè)表兩級(jí)查找轉(zhuǎn)換成物理地址。

  32位的線性地址被分成3個(gè)部分:

  最高10位 Directory 頁(yè)目錄表偏移量,中間10位 Table是頁(yè)表偏移量,最低12位Offset是物理頁(yè)內(nèi)的字節(jié)偏移量。

  頁(yè)目錄表的大小為4k(剛好是一個(gè)頁(yè)的大小),包含1024項(xiàng),每個(gè)項(xiàng)4字節(jié)(32位),項(xiàng)目里存儲(chǔ)的內(nèi)容就是頁(yè)表的物理地址。如果頁(yè)目錄表中的頁(yè)表尚未分配,則物理地址填0。

  頁(yè)表的大小也是4k,同樣包含1024項(xiàng),每個(gè)項(xiàng)4字節(jié),內(nèi)容為最終物理頁(yè)的物理內(nèi)存起始地址。

  每個(gè)活動(dòng)的任務(wù),必須要先分配給它一個(gè)頁(yè)目錄表,并把頁(yè)目錄表的物理地址存入cr3寄存器。頁(yè)表可以提前分配好,也可以在用到的時(shí)候再分配。

  還是以 mov 0x80495b0, %eax 中的地址為例分析一下線性地址轉(zhuǎn)物理地址的過(guò)程。

  前面說(shuō)到Linux中邏輯地址等于線性地址,那么我們要轉(zhuǎn)換的線性地址就是0x80495b0。轉(zhuǎn)換的過(guò)程是由CPU自動(dòng)完成的,Linux所要做的就是準(zhǔn)備好轉(zhuǎn)換所需的頁(yè)目錄表和頁(yè)表(假設(shè)已經(jīng)準(zhǔn)備好,給頁(yè)目錄表和頁(yè)表分配物理內(nèi)存的過(guò)程很復(fù)雜,后面再分析)。

  內(nèi)核先將當(dāng)前任務(wù)的頁(yè)目錄表的物理地址填入cr3寄存器。

  線性地址 0x80495b0 轉(zhuǎn)換成二進(jìn)制后是 0000 1000 0000 0100 1001 0101 1011 0000,最高10位0000 1000 00的十進(jìn)制是32,CPU查看頁(yè)目錄表第32項(xiàng),里面存放的是頁(yè)表的物理地址。線性地址中間10位00 0100 1001 的十進(jìn)制是73,頁(yè)表的第73項(xiàng)存儲(chǔ)的是最終物理頁(yè)的物理起始地址。物理頁(yè)基地址加上線性地址中最低12位的偏移量,CPU就找到了線性地址最終對(duì)應(yīng)的物理內(nèi)存單元。

  我們知道Linux中用戶(hù)進(jìn)程線性地址能尋址的范圍是0 - 3G,那么是不是需要提前先把這3G虛擬內(nèi)存的頁(yè)表都建立好呢?一般情況下,物理內(nèi)存是遠(yuǎn)遠(yuǎn)小于3G的,加上同時(shí)有很多進(jìn)程都在運(yùn)行,根本無(wú)法給每個(gè)進(jìn)程提前建立3G的線性地址頁(yè)表。Linux利用CPU的一個(gè)機(jī)制解決了這個(gè)問(wèn)題。進(jìn)程創(chuàng)建后我們可以給頁(yè)目錄表的表項(xiàng)值都填0,CPU在查找頁(yè)表時(shí),如果表項(xiàng)的內(nèi)容為0,則會(huì)引發(fā)一個(gè)缺頁(yè)異常,進(jìn)程暫停執(zhí)行,Linux內(nèi)核這時(shí)候可以通過(guò)一系列復(fù)雜的算法給分配一個(gè)物理頁(yè),并把物理頁(yè)的地址填入表項(xiàng)中,進(jìn)程再恢復(fù)執(zhí)行。當(dāng)然進(jìn)程在這個(gè)過(guò)程中是被蒙蔽的,它自己的感覺(jué)還是正常訪問(wèn)到了物理內(nèi)存。

  看過(guò)“ 邏輯地址線性地址物理地址三個(gè)地址有什么聯(lián)系”的人還看了:

1.物理地址和邏輯地址的區(qū)別

2.物理地址和虛擬地址

3.修改硬盤(pán)物理地址

4.什么是8086邏輯地址和物理地址

5.物理首地址是什么

邏輯地址線性地址物理地址三個(gè)地址有什么聯(lián)系

在計(jì)算機(jī)科學(xué)中,邏輯地址是什么?線性地址是什么?物理地址優(yōu)勢(shì)什么?邏輯地址線性地址物理地址三個(gè)地址有什么聯(lián)系?學(xué)習(xí)啦小編整理了邏輯地址,線性地址以及物理地址的相關(guān)資料,下面大家跟著學(xué)習(xí)啦小編一起去了解一下吧。 邏輯地址線
推薦度:
點(diǎn)擊下載文檔文檔為doc格式

精選文章

  • 物理地址擴(kuò)展
    物理地址擴(kuò)展

    在計(jì)算機(jī)科學(xué)中,物理地址擴(kuò)展是指x86和x86-64處理器的一個(gè)特色,即如果操作系統(tǒng)提供適當(dāng)支持,則可以在32位的系統(tǒng)中使用超過(guò)4GiB字節(jié)的實(shí)體內(nèi)存,那么

  • 物理地址可以修改嗎
    物理地址可以修改嗎

    最近不少朋友問(wèn)到關(guān)于物理地址這樣的問(wèn)題,那么物理地址可以修改嗎?學(xué)習(xí)啦小編整理了物理地址到邏輯地址的相關(guān)資料,下面大家跟著學(xué)習(xí)啦小編一起去

  • 初中語(yǔ)文邏輯病句解題技巧及成分殘缺
    初中語(yǔ)文邏輯病句解題技巧及成分殘缺

    語(yǔ)文閱讀是語(yǔ)文學(xué)習(xí)的一大板塊。無(wú)論在考試還是在平日的積累中都非常重要,在升學(xué)考試中也占據(jù)著相當(dāng)大的比例。為快速提高同學(xué)們的閱讀能力,學(xué)習(xí)

  • 初中語(yǔ)文病句解題技巧之結(jié)構(gòu)混亂與邏輯分析法
    初中語(yǔ)文病句解題技巧之結(jié)構(gòu)混亂與邏輯分析法

    語(yǔ)文閱讀是語(yǔ)文學(xué)習(xí)的一大板塊。無(wú)論在考試還是在平日的積累中都非常重要,在升學(xué)考試中也占據(jù)著相當(dāng)大的比例。為快速提高同學(xué)們的閱讀能力,學(xué)習(xí)

605935