成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

梳理Linux內(nèi)存尋址之分段機(jī)制

系統(tǒng) Linux 系統(tǒng)運(yùn)維
最近在學(xué)習(xí)Linux內(nèi)核,讀到《深入理解Linux內(nèi)核》的內(nèi)存尋址一章。原本以為自己對(duì)分段分頁(yè)機(jī)制已經(jīng)理解了,結(jié)果發(fā)現(xiàn)其實(shí)是一知半解。于是,查找了很多資料,最終理順了內(nèi)存尋址的知識(shí)。現(xiàn)在把我的理解記錄下來(lái),希望對(duì)內(nèi)核學(xué)習(xí)者有一定幫助,也希望大家指出錯(cuò)誤之處。

  [[151258]]

【引自ShareHub的博客】一、前言

  最近在學(xué)習(xí)Linux內(nèi)核,讀到《深入理解Linux內(nèi)核》的內(nèi)存尋址一章。原本以為自己對(duì)分段分頁(yè)機(jī)制已經(jīng)理解了,結(jié)果發(fā)現(xiàn)其實(shí)是一知半解。于是,查找了很多資料,最終理順了內(nèi)存尋址的知識(shí)。現(xiàn)在把我的理解記錄下來(lái),希望對(duì)內(nèi)核學(xué)習(xí)者有一定幫助,也希望大家指出錯(cuò)誤之處。

  二、分段到底是怎么回事

  相信學(xué)過(guò)操作系統(tǒng)課程的人都知道分段分頁(yè),但是奇怪的是書(shū)上基本沒(méi)提分段分頁(yè)是怎么產(chǎn)生的,這就導(dǎo)致我們知其然不知其所以然。下面我們先扒一下分段機(jī)制產(chǎn)生的歷史。

  實(shí)模式的誕生(16位處理器及尋址)

  在8086處理器誕生之前,內(nèi)存尋址方式就是直接訪問(wèn)物理地址。8086處理器為了尋址1M的內(nèi)存空間,把地址總線擴(kuò)展到了20位。但是,一個(gè) 尷尬的問(wèn)題出現(xiàn)了,ALU的寬度只有16位,也就是說(shuō),ALU不能計(jì)算20位的地址。為了解決這個(gè)問(wèn)題,分段機(jī)制被引入,登上了歷史舞臺(tái)。

  為了支持分段,8086處理器設(shè)置了四個(gè)段寄存器:CS,DS,SS, ES。每個(gè)段寄存器都是16位的,同時(shí)訪問(wèn)內(nèi)存的指令中的地址也是16位的。但是,在送入地址總線之前,CPU先把它與某個(gè)段寄存器內(nèi)的值相加。這里要注 意:段寄存器的值對(duì)應(yīng)于20位地址總線中的高16位,所以相加時(shí)實(shí)際上是內(nèi)存總線中的高12位與段寄存器中的16位相加,而低4位保留不變,這樣就形成一 個(gè)20位的實(shí)際地址,也就實(shí)現(xiàn)了從16位內(nèi)存地址到20位實(shí)際地址的轉(zhuǎn)換,或者叫“映射”。

  保護(hù)模式的誕生(32位處理器及尋址)

  ◆80286處理器的地址總線為24位,尋址空間達(dá)16M,同時(shí)引入了保護(hù)模式(內(nèi)存段的訪問(wèn)受到限制)

  ◆80386處理器是一個(gè)32位處理器,ALU和地址總線都是32位的,尋址空間達(dá) 4G。也就是說(shuō)它可以不通過(guò)分段機(jī)制,直接訪問(wèn)4G的內(nèi)存空間。雖然它是新時(shí)代的小王子,超越它的無(wú)數(shù)前輩,然而,它需要背負(fù)家族的使命—兼容前代的處理 器。也就是說(shuō),它必須支持實(shí)模式和保護(hù)模式。所以,80386在段寄存器的基礎(chǔ)上構(gòu)筑保護(hù)模式,并且保留16位的段寄存器。

  ◆從80386之后的處理器,架構(gòu)基本相似,統(tǒng)稱為IA32(32 Bit Intel Architecture)。

  三、IA32的內(nèi)存尋址機(jī)制

  尋址硬件

  在 8086 的實(shí)模式下,把某一段寄存器左移4位,然后與地址ADDR相加后被直接送到內(nèi)存總線上,這個(gè)相加后的地址就是內(nèi)存單元的物理地址,而程序中的這個(gè)地址就叫 邏輯地址(或叫虛地址)。在IA32的保護(hù)模式下,這個(gè)邏輯地址不是被直接送到內(nèi)存總線而是被送到內(nèi)存管理單元(MMU)。MMU由一個(gè)或一組芯片組成, 其功能是把邏輯地址映射為物理地址,即進(jìn)行地址轉(zhuǎn)換,如圖所示。  

MMU

  IA32的三種地址

  ◆邏輯地址:機(jī)器語(yǔ)言指令仍用這種地址指定一個(gè)操作數(shù)的地址或一條指令的地址。 這種尋址方式在Intel的分段結(jié)構(gòu)中表現(xiàn)得尤為具體,它使得MS-DOS或Windows程序員把程序分為若干段。每個(gè)邏輯地址都由一個(gè)段和偏移量組成。

  ◆線性地址:線性地址是一個(gè)32位的無(wú)符號(hào)整數(shù),可以表達(dá)高達(dá)232(4GB)的地址。通常用16進(jìn)制表示線性地址,其取值范圍為0x00000000~0xffffffff。

  ◆物理地址:也就是內(nèi)存單元的實(shí)際地址,用于芯片級(jí)內(nèi)存單元尋址。 物理地址也由32位無(wú)符號(hào)整數(shù)表示。

  MMU地址轉(zhuǎn)化過(guò)程

  MMU是一種硬件電路,它包含兩個(gè)部件,一個(gè)是分段部件,一個(gè)是分頁(yè)部件,在此,我們把它們分別叫做分段機(jī)制和分頁(yè)機(jī)制,以利于從邏輯的角度來(lái)理解硬件的實(shí)現(xiàn)機(jī)制。分段機(jī)制把一個(gè)邏輯地址轉(zhuǎn)換為線性地址;接著,分頁(yè)機(jī)制把一個(gè)線性地址轉(zhuǎn)換為物理地址。  


MMU_translate

 

  IA32的段寄存器

  IA32中有六個(gè)16位段寄存器:CS,DS,SS,ES,F(xiàn)S,GS。跟8086的段寄存器不同的是,這些寄存器存放的不再是某個(gè)段的基地址,而是某個(gè)段的選擇符(Selector)。

#p#

  四、分段機(jī)制的實(shí)現(xiàn)

  段是虛擬地址空間的基本單位,分段機(jī)制必須把虛擬地址空間的一個(gè)地址轉(zhuǎn)換為線性地址空間的一個(gè)線性地址。

  為了實(shí)現(xiàn)這種映射,僅僅用段寄存器來(lái)確定一個(gè)基地址是不夠的,至少還得描述段的長(zhǎng)度,并且還需要段的一些其他信息,比如訪問(wèn)權(quán)之類。所以,這里需要的是一個(gè)數(shù)據(jù)結(jié)構(gòu),這個(gè)結(jié)構(gòu)包括三個(gè)方面的內(nèi)容:

  1.段的基地址(Base Address):在線性地址空間中段的起始地址。

  2.段的界限(Limit):在虛擬地址空間中,段內(nèi)可以使用的***偏移量。

  3.段的保護(hù)屬性(Attribute):表示段的特性。例如,該段是否可被讀出或?qū)懭耄蛘咴摱问欠褡鳛橐粋€(gè)程序來(lái)執(zhí)行,以及段的特權(quán)級(jí)等等。

  上面的數(shù)據(jù)結(jié)構(gòu)我們稱為段描述符,多個(gè)段描述符組成的表稱為段描述符表

  段描述符

  所謂描述符(Descriptor),就是描述段的屬性的一個(gè)8字節(jié)存儲(chǔ)單元。在實(shí)模式下,段的屬性不外乎是代碼段、堆棧段、數(shù)據(jù)段、段的起始地址、段的長(zhǎng)度等等,而在保護(hù)模式下則復(fù)雜一些。IA32將它們結(jié)合在一起用一個(gè)8字節(jié)的數(shù)表示,稱為描述符 。  

IA32的一個(gè)通用的段描述符的結(jié)構(gòu)

  從圖可以看出,一個(gè)段描述符指出了段的32位基地址和20位段界限(即段長(zhǎng))。這里我們只關(guān)注基地址和段界限,其他的屬性略過(guò)。

  1.段描述符表

  各種各樣的用戶描述符和系統(tǒng)描述符,都放在對(duì)應(yīng)的全局描述符表、局部描述符表和中斷描述符表中。描述符表(即段表)定義了IA32系統(tǒng)的所有段 的情況。所有的描述符表本身都占據(jù)一個(gè)字節(jié)為8的倍數(shù)的存儲(chǔ)器空間,空間大小在8個(gè)字節(jié)(至少含一個(gè)描述符)到64K字節(jié)(至多含8K)個(gè)描述符之間。

  2.全局描述符表(GDT)

  全局描述符表GDT(Global Descriptor Table),除了任務(wù)門(mén),中斷門(mén)和陷阱門(mén)描述符外,包含著系統(tǒng)中所有任務(wù)都共用的那些段的描述符。 它的***個(gè)8字節(jié)位置沒(méi)有使用。

  3.中斷描述符表IDT(Interrupt Descriptor Table)

  中斷描述符表IDT(Interrupt Descriptor Table),包含256個(gè)門(mén)描述符。IDT中只能包含任務(wù)門(mén)、中斷門(mén)和陷阱門(mén)描述符,雖然IDT表最長(zhǎng)也可以為64K字節(jié),但只能存取2K字節(jié)以內(nèi)的描述符,即256個(gè)描述符,這個(gè)數(shù)字是為了和8086保持兼容。

  局部描述符表(LDT)

  局部描述符表LDT(local Descriptor Table),包含了與一個(gè)給定任務(wù)有關(guān)的描述符,每個(gè)任務(wù)各自有一個(gè)的LDT。 有了LDT,就可以使給定任務(wù)的代碼、 數(shù)據(jù)與別的任務(wù)相隔離。每一個(gè)任務(wù)的局部描述符表LDT本身也用一個(gè)描述符來(lái)表示,稱為L(zhǎng)DT描述符,它包含了有關(guān)局部描述符表的信息,被放在全局描述符表GDT中。

  總結(jié)

  IA32的內(nèi)存尋址機(jī)制完成從邏輯地址—線性地址—物理地址的轉(zhuǎn)換。其中,邏輯地址的段寄存器中的值提供段描述符,然后從段描述符中得到段基址和段界限,然后加上邏輯地址的偏移量,就得到了線性地址,線性地址通過(guò)分頁(yè)機(jī)制得到物理地址。

  首先,我們要明確,分段機(jī)制是IA32提供的尋址方式,這是硬件層面的。就是說(shuō),不管你是windows還是linux,只要使用IA32的CPU訪問(wèn)內(nèi)存,都要經(jīng)過(guò)MMU的轉(zhuǎn)換流程才能得到物理地址,也就是說(shuō)必須經(jīng)過(guò)邏輯地址—線性地址—物理地址的轉(zhuǎn)換。

  五、Linux中分段的實(shí)現(xiàn)

  前面說(shuō)了那么多關(guān)于分段機(jī)制的實(shí)現(xiàn),其實(shí),對(duì)于Linux來(lái)說(shuō),并沒(méi)有什么卵用。因?yàn)椋琇inux基本不使用分段的機(jī)制,或者說(shuō),Linux中的分段機(jī)制只是為了兼容IA32的硬件而設(shè)計(jì)的。

  Intel微處理器的段機(jī)制是從8086開(kāi)始提出的, 那時(shí)引入的段機(jī)制解決了從CPU內(nèi)部16位地址到20位實(shí)地址的轉(zhuǎn)換。為了保持這種兼容性,386仍然使用段機(jī)制,但比以前復(fù)雜得多。因此,Linux內(nèi) 核的設(shè)計(jì)并沒(méi)有全部采用Intel所提供的段方案,僅僅有限度地使用了一下分段機(jī)制。這不僅簡(jiǎn)化了Linux內(nèi)核的設(shè)計(jì),而且為把Linux移植到其他平 臺(tái)創(chuàng)造了條件,因?yàn)楹芏郣ISC處理器并不支持段機(jī)制。但是,對(duì)段機(jī)制相關(guān)知識(shí)的了解是進(jìn)入Linux內(nèi)核的必經(jīng)之路。

  從2.2版開(kāi)始,Linux讓所有的進(jìn)程(或叫任務(wù))都使用相同的邏輯地址空間,因此就沒(méi)有必要使用局部描述符表LDT。但內(nèi)核中也用到LDT,那只是在VM86模式中運(yùn)行Wine,因?yàn)榫褪钦f(shuō)在Linux上模擬運(yùn)行Winodws軟件或DOS軟件的程序時(shí)才使用。

  在 IA32 上任意給出的地址都是一個(gè)虛擬地址,即任意一個(gè)地址都是通過(guò)“選擇符:偏移量”的方式給出的,這是段機(jī)制存訪問(wèn)模式的基本特點(diǎn)。所以在IA32上設(shè)計(jì)操作 系統(tǒng)時(shí)無(wú)法回避使用段機(jī)制。一個(gè)虛擬地址最終會(huì)通過(guò)“段基地址+偏移量”的方式轉(zhuǎn)化為一個(gè)線性地址。 但是,由于絕大多數(shù)硬件平臺(tái)都不支持段機(jī)制,只支持分頁(yè)機(jī)制,所以為了讓 Linux 具有更好的可移植性,我們需要去掉段機(jī)制而只使用分頁(yè)機(jī)制。但不幸的是,IA32規(guī)定段機(jī)制是不可禁止的,因此不可能繞過(guò)它直接給出線性地址空間的地址。 萬(wàn)般無(wú)奈之下,Linux的設(shè)計(jì)人員干脆讓段的基地址為0,而段的界限為4GB,這時(shí)任意給出一個(gè)偏移量,則等式為“0+偏移量=線性地址”,也就是說(shuō) “偏移量=線性地址”。另外由于段機(jī)制規(guī)定“偏移量<4GB”,所以偏移量的范圍為0H~FFFFFFFFH,這恰好是線性地址空間范圍,也就是說(shuō) 虛擬地址直接映射到了線性地址,我們以后所提到的虛擬地址和線性地址指的也就是同一地址。看來(lái),Linux在沒(méi)有回避段機(jī)制的情況下巧妙地把段機(jī)制給繞過(guò) 去了。

  另外,由于IA32段機(jī)制還規(guī)定,必須為代碼段和數(shù)據(jù)段創(chuàng)建不同的段,所以Linux必須為代碼段和數(shù)據(jù)段分別創(chuàng)建一個(gè)基地址為0,段界限為4GB 的段描述符。不僅如此,由于Linux內(nèi)核運(yùn)行在特權(quán)級(jí)0,而用戶程序運(yùn)行在特權(quán)級(jí)別3,根據(jù)IA32段保護(hù)機(jī)制規(guī)定,特權(quán)級(jí)3的程序是無(wú)法訪問(wèn)特權(quán)級(jí)為 0的段的,所以Linux必須為內(nèi)核用戶程序分別創(chuàng)建其代碼段和數(shù)據(jù)段。這就意味著Linux必須創(chuàng)建4個(gè)段描述符——特權(quán)級(jí)0的代碼段和數(shù)據(jù)段,特權(quán)級(jí)3的代碼段和數(shù)據(jù)段。

  六、總結(jié)

  分段機(jī)制是IA32架構(gòu)CPU的特色,并不是操作系統(tǒng)尋址方式的必然選擇。Linux為了跨平臺(tái),巧妙的繞開(kāi)段機(jī)制,主要使用分頁(yè)機(jī)制來(lái)尋址。

  參考資料

  《深入分析Linux內(nèi)核源碼》

責(zé)任編輯:火鳳凰 來(lái)源: ShareHub博客
相關(guān)推薦

2015-10-09 10:22:47

分頁(yè)內(nèi)存尋址Linux

2020-09-30 06:50:35

Linux內(nèi)存尋址

2009-12-17 11:00:47

Linux內(nèi)存管理

2010-06-10 10:59:33

Internet協(xié)議

2013-09-29 15:11:46

Linux運(yùn)維內(nèi)存管理

2018-10-10 05:12:35

2015-06-04 09:38:39

Java垃圾回收機(jī)

2025-04-15 06:00:00

2021-07-07 11:35:17

Linux內(nèi)存段尋址

2010-06-02 11:33:26

Linux 內(nèi)存監(jiān)控

2011-01-18 09:51:59

Linux磁盤(pán)分區(qū)

2020-06-22 08:30:42

Linux內(nèi)存手動(dòng)釋放

2021-10-08 07:53:01

Go 尋址元素

2011-01-18 10:25:19

Linux磁盤(pán)分區(qū)

2025-04-09 05:22:00

2010-09-26 13:23:13

JVM內(nèi)存管理機(jī)制

2013-04-01 10:07:19

Java內(nèi)存回收機(jī)制

2022-06-01 16:01:58

MySQL內(nèi)存管理系統(tǒng)

2012-02-01 13:57:40

內(nèi)存緩存機(jī)制

2010-07-23 09:34:48

Python
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲第一网站 | 天天视频成人 | 一级a毛片 | 久久视频精品 | 欧美一级免费黄色片 | 狠狠干五月天 | 一级毛毛片 | 日本精品裸体写真集在线观看 | 福利在线观看 | 中文字幕11页 | 毛片一级片 | 99精品99久久久久久宅男 | 在线āv视频| 国产精品色| 奇色影视 | 日韩一区欧美一区 | 亚洲国产成人精品久久久国产成人一区 | 国产精品久久久久久妇女6080 | 亚洲一区二区三区在线播放 | 精品国产一区二区三区久久久蜜月 | www.47久久青青 | 久久爱黑人激情av摘花 | 国产精品久久久久久久久久久久 | 免费一级欧美在线观看视频 | 一区二区三区在线免费观看 | 宅女噜噜66国产精品观看免费 | 日本精品视频一区二区三区四区 | 国产九九精品 | 免费99精品国产自在在线 | 中文字幕精品一区 | 欧美 日韩 国产 成人 在线 91 | 九色视频网站 | 亚洲国产精品一区二区www | 色综合欧美 | 91九色视频| 国产精品色一区二区三区 | 欧美精品一区二区三区在线播放 | 精产国产伦理一二三区 | 国产精品视频导航 | 青青草一区二区三区 | 欧美日韩视频在线 |