日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

内存寻址一(分段)

發(fā)布時(shí)間:2025/3/15 编程问答 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 内存寻址一(分段) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

內(nèi)存地址

邏輯地址(logical address)

包括在機(jī)器語(yǔ)言指令中用來(lái)指定一個(gè)操作數(shù)或一條指令的地址。這樣的尋址方式在80x86著名的分段結(jié)構(gòu)表現(xiàn)的尤為詳細(xì)。

每一個(gè)邏輯地址都有一個(gè)段(segment)和偏移量(offset)組成,偏移量指明了從段開(kāi)始的地方到實(shí)際地址之間的距離。

線性地址(linear address)(也稱(chēng)虛擬地址virtual address)

是一個(gè)32位無(wú)符號(hào)整數(shù)。能夠用來(lái)表示高達(dá)4G的地址。

線性地址通經(jīng)常使用十六進(jìn)制數(shù)字表示,值的范圍從0x00000000到0xffffffff。

物理地址(physical address)

用于內(nèi)存芯片級(jí)內(nèi)存單元尋址。它們與微處理器的地址引腳發(fā)送到內(nèi)存總線上的電信號(hào)相相應(yīng)。物理地址由32位或36位無(wú)符號(hào)整數(shù)表示。


內(nèi)存管理單元(MMU)通過(guò)一種稱(chēng)為分段單元(segmentation unit)的硬件電路把一個(gè)邏輯地址轉(zhuǎn)換成線性地址;接著,第二個(gè)稱(chēng)為分頁(yè)單元(paging unit)的硬件電路把線性地址轉(zhuǎn)換為一個(gè)物理地址。


當(dāng)Intel處理器工作在保護(hù)模式下,分段機(jī)制是必須使用的。而分頁(yè)是可選的。當(dāng)分頁(yè)沒(méi)有使用時(shí),線性地址空間就直接映射到物理地址空間。物理地址空間是指處理器在地址總線產(chǎn)生的地址空間范圍,如處理器為32位但地址總線是36位,這物理地址空間就是0~2^36


硬件中的分段

一個(gè)邏輯地址由兩部分組成:一個(gè)段標(biāo)識(shí)符和一個(gè)指定段內(nèi)相對(duì)地址的偏移量。段標(biāo)識(shí)符是一個(gè)16位長(zhǎng)的字段,稱(chēng)為段選擇符

段選擇符(segment selector)


Index 指定了放在GDT或者LDT中的對(duì)應(yīng)段描寫(xiě)敘述符的入口。從存放在GDT或者LDT中的8192個(gè)描寫(xiě)敘述符中選擇段描寫(xiě)敘述符。因?yàn)橐粋€(gè)段描寫(xiě)敘述符是8個(gè)字節(jié)長(zhǎng)(以下 會(huì)講道)。因此它在GDT或者LDT內(nèi)的相對(duì)地址是由段選擇符的最高13位的值乘以8得到的。

比如:假設(shè)GDT在0x00020000(這個(gè)值保存在gdtr寄存器中),且由段選擇符所指定的索引號(hào)為2,那么對(duì)應(yīng)的段描寫(xiě)敘述符地址是0x00020000 + 2*8

TI ? ?TI(Table Indicator)標(biāo)志;指明段描寫(xiě)敘述符是在GDT中(TI=0)或在LDT中(TI=1)

RPL ? 請(qǐng)求特權(quán)等級(jí)(Requested Privilege Level):當(dāng)對(duì)應(yīng)的段選擇符裝入到CS寄存器中時(shí)指示出CPU當(dāng)前的特權(quán)等級(jí)。優(yōu)先級(jí)范圍從0到3,0代表最高優(yōu)先級(jí)。而3代表最低優(yōu)先級(jí)。Linux僅僅用到0級(jí)和3級(jí),分別稱(chēng)之為內(nèi)核態(tài)和用戶態(tài)


為了高速方面地找到段選擇符,處理器提供段寄存器,段寄存器的唯一目的是存放段選擇符。這些寄存器稱(chēng)為cs,ss,ds,es,fs和gs。

6個(gè)寄存器中有3個(gè)有專(zhuān)門(mén)用途:

cs ?代碼段寄存器,指向包括程序指令的段。

ss ?棧段寄存器。指向包括當(dāng)前程序的段。

ds ?數(shù)據(jù)段寄存器,指向包括靜態(tài)數(shù)據(jù)或者全局?jǐn)?shù)據(jù)段

對(duì)intel處理器。有兩種類(lèi)型的指令用于載入段寄存器

一類(lèi)是顯式引用,如MOV, POP, LDS, LES, LSS, LGS, and LFS

還有一類(lèi)是隱式載入,如CALL,JMP,RET,SYSENTER,SYSEXIT,IRET,INTn等這些指令都會(huì)附帶改動(dòng)CS或者其它段寄存器內(nèi)容


段描寫(xiě)敘述符表(Segment Descriptor Tables)

段描寫(xiě)敘述符表是一個(gè)段描寫(xiě)敘述符的數(shù)組,一個(gè)描寫(xiě)敘述符表的大小最多為8192(2^13)8byte的描寫(xiě)敘述符

有兩種類(lèi)型的描寫(xiě)敘述符表

全局描寫(xiě)敘述符表(Global Descriptor Table,GDT)

局部描寫(xiě)敘述符表(Local Descriptor Table,LDT)



通常僅僅定義一個(gè)GDT。而每一個(gè)進(jìn)程除了存放在GDT中的段之外還須要?jiǎng)?chuàng)建附加的段。就能夠有自己的LDT。GDT在主存中的地址和大小存放在gdtr控制寄存器中,當(dāng)前正被使用的LDT地址和大小存放在ldtr控制寄存器中。


段描寫(xiě)敘述符(Segment Descriptor)


Base ?包括段的首字節(jié)的線性地址,處理器把3個(gè)base address域形成一個(gè)32bit值,段基地址應(yīng)該是要16字節(jié)邊界對(duì)齊的但不是必須的,由于16字節(jié)對(duì)齊能夠使程序性能最大化通過(guò)代碼與數(shù)據(jù)16字節(jié)邊界對(duì)齊

G ? ? 粒度(granularity)標(biāo)志:假設(shè)該位清0,則段大小以字節(jié)為單位,否則以4096字節(jié)的倍數(shù)計(jì)

D/B ? 稱(chēng)為D或B的標(biāo)志,取決于是代碼段還是數(shù)據(jù)段。D或者B的含義情況在兩種情況下稍有差別,可是假設(shè)段偏移量的地址是32位長(zhǎng),就是基本上把它置為 ? ? ? 1,假設(shè)這個(gè)偏移量是16位長(zhǎng),它被清0

Limit 存放段中最后一個(gè)內(nèi)存單元的偏移量,從而決定段的長(zhǎng)度。假設(shè)G被設(shè)置為0,則一個(gè)段的大小在1個(gè)字節(jié)到1MB之間變化;否則。將在4KB到4GB之間 ? ? ? 變化 ? ?

P ? ? Segment-Present標(biāo)志:等于0表示段當(dāng)前不在主存中。Linux總是把這個(gè)標(biāo)志設(shè)置為1,由于它從來(lái)不把整個(gè)段交換到磁盤(pán)上去。

DPL ? 描寫(xiě)敘述符特權(quán)級(jí)(Descriptor Privilege Level)字段:用于限制對(duì)這個(gè)段的存取。它表示為訪問(wèn)這個(gè)段而要求的CPU最小的優(yōu)先級(jí)。因此,DPL設(shè) ? ? ? 為0的段僅僅能當(dāng)CPL為0時(shí)(即在內(nèi)核態(tài))才干夠訪問(wèn)的,而DPL設(shè)為3的段對(duì)不論什么CPL值都是能夠訪問(wèn)的

S ? ? 系統(tǒng)標(biāo)志:假設(shè)它被清零。則這是一個(gè)系統(tǒng)段,存儲(chǔ)諸如LDT這樣的重要的作用結(jié)構(gòu),否則它是一個(gè)普通的代碼段或數(shù)據(jù)段

Type ?描寫(xiě)敘述了段的類(lèi)型特征和它的存取權(quán)限

有幾種不同類(lèi)型的段以及和它們相應(yīng)的段描寫(xiě)敘述符。

以下列出了Linux中被廣泛採(cǎi)用的類(lèi)型:

代碼段描寫(xiě)敘述符

表示這個(gè)段描寫(xiě)敘述符代表一個(gè)代碼段,它能夠放在GDT或者LDT中。

該描寫(xiě)敘述符置S標(biāo)志位1

數(shù)據(jù)段描寫(xiě)敘述符

表示這個(gè)段描寫(xiě)敘述符代表一個(gè)數(shù)據(jù)段,它能夠放在GDT或者LDT中。該描寫(xiě)敘述符置S標(biāo)志位1。棧段是通過(guò)一般數(shù)據(jù)段實(shí)現(xiàn)的

任務(wù)狀態(tài)段描寫(xiě)敘述符(TSSD)

表示這個(gè)段描寫(xiě)敘述符代表一任務(wù)狀態(tài)段(Task State Segment,TSS),也就是說(shuō)這個(gè)段用于保存處理器寄存器的內(nèi)容。它僅僅能出如今GDT中。

依據(jù)對(duì)應(yīng)的進(jìn)程是否正在CPU上執(zhí)行,其Type字段的值分別為11或9.這個(gè)描寫(xiě)敘述符的S標(biāo)志置為0

局部描寫(xiě)敘述符表描寫(xiě)敘述符(LDTD)

表示這個(gè)段描寫(xiě)敘述代表一個(gè)包括LDT的段,它僅僅能出如今GDT中。對(duì)應(yīng)的Type字段的值為12,S標(biāo)志位0。


總結(jié)一下分段單元是怎樣把邏輯地址轉(zhuǎn)換成線性地址的

a、先檢查段選擇符的TI字段,以決定段描寫(xiě)敘述符保存在哪個(gè)描寫(xiě)敘述符表。

b、從段選擇符的Index字段計(jì)算段描寫(xiě)敘述符的地址,Index字段的值乘以8,這個(gè)結(jié)果與gdtr或者ldtr寄存器的內(nèi)容相加

c、把邏輯地址的偏移量與描寫(xiě)敘述符Base字段的值相加就得到了線性地址


Linux中的分段

Linux以很有限的方式使用分段。與分段相比,Linux更喜歡使用分頁(yè)方式。由于:

a、當(dāng)全部進(jìn)程使用相同的段寄存器值時(shí),內(nèi)存管理變得更簡(jiǎn)單,也就是說(shuō)它們能共享相同的一組線性地址

b、Linux設(shè)計(jì)目標(biāo)之中的一個(gè)是能夠把它移植到絕大多數(shù)流行的處理器平臺(tái)上。

然而。RISC體系結(jié)構(gòu)對(duì)分段的支持有限

2.6版本號(hào)的Linux僅僅有在80x86結(jié)構(gòu)下才須要使用分段。


執(zhí)行在用戶態(tài)的全部Linux進(jìn)程都使用一對(duì)同樣的段來(lái)對(duì)指令和數(shù)據(jù)尋址。

這兩個(gè)段就是所謂的用戶代碼段和用戶數(shù)據(jù)段。類(lèi)似地,執(zhí)行在內(nèi)核態(tài)的全部Linux進(jìn)程都使用一對(duì)同樣的段對(duì)指令和數(shù)據(jù)尋址:它們分別叫做內(nèi)核態(tài)代碼段和內(nèi)核數(shù)據(jù)段。

四個(gè)基本的Linux段的段描寫(xiě)敘述符字段的值

段 ? ? ? ? Base ? ? ? G ?Limit ? ?S ?Type ?DPL ?D/B ?P

用戶代碼段 ?0x00000000 ?1 ?0xfffff ?1 ?10 ? ?3 ? ?1 ? ?1

用戶數(shù)據(jù)段 ?0x00000000 ?1 ?0xfffff ?1 ?2 ? ? 3 ? ?1 ? ?1

內(nèi)核代碼段 ?0x00000000 ?1 ?0xfffff ?1 ?10 ? ?0 ? ?1 ? ?1

內(nèi)核數(shù)據(jù)段 ?0x00000000 ?1 ?0xfffff ?1 ?2 ? ? 0 ? ?1 ? ?1


對(duì)應(yīng)的段選擇符由宏__USER_CS、__USER_DS、__KERNEL_DS、__KERNEL_CS。比如,為了對(duì)內(nèi)核代碼段尋址,內(nèi)核僅僅須要把__KERNEL_CS宏產(chǎn)生的值裝進(jìn)cs段寄存器就可以

注意,與段相關(guān)的線性地址從0開(kāi)始。達(dá)到2^32-1的尋址限長(zhǎng)。

這意味著在用戶態(tài)或者內(nèi)核態(tài)下的全部進(jìn)程能夠使用同樣的邏輯地址。

全部段都從0x00000000開(kāi)始,這能夠得出還有一個(gè)重要結(jié)論,那就是在Linux下邏輯地址與線性地址是一致的。即邏輯地址的偏移量字段的值與對(duì)應(yīng)的線性地址的值總是一致的

摘自linux-2.6.32/arch/x86/include/asm/segment.h

#define GDT_ENTRY_DEFAULT_USER_CS 14 #define GDT_ENTRY_DEFAULT_USER_DS 15 #define GDT_ENTRY_KERNEL_BASE 12 #define GDT_ENTRY_KERNEL_CS (GDT_ENTRY_KERNEL_BASE + 0) #define GDT_ENTRY_KERNEL_DS (GDT_ENTRY_KERNEL_BASE + 1) #define __KERNEL_CS (GDT_ENTRY_KERNEL_CS * 8) #define __KERNEL_DS (GDT_ENTRY_KERNEL_DS * 8) #define __USER_DS (GDT_ENTRY_DEFAULT_USER_DS* 8 + 3) #define __USER_CS (GDT_ENTRY_DEFAULT_USER_CS* 8 + 3)

Linux GDT

在單處理器系統(tǒng)中僅僅有一個(gè)GDT,而在多處理器系統(tǒng)中每一個(gè)CPU相應(yīng)一個(gè)GDT。

全部的GDT都存放在cpu_gdt_table數(shù)組中。

每個(gè)GDT中包括的18個(gè)段描寫(xiě)敘述符指向下列的段:

a、用戶態(tài)和內(nèi)核態(tài)下的代碼段和數(shù)據(jù)段共4個(gè)

b、任務(wù)狀態(tài)段(TSS),每一個(gè)處理器有1個(gè)。每一個(gè)TSS對(duì)應(yīng)的線性地址空間都是內(nèi)核數(shù)據(jù)段對(duì)應(yīng)線性地址空間的一個(gè)子集。

c、一個(gè)包含缺省局部描寫(xiě)敘述符表的段,這個(gè)段一般是被全部進(jìn)程共享的段

d、3個(gè)局部線程存儲(chǔ)段(Thread-Local Storage,TLS):這樣的機(jī)制同意多線程應(yīng)用程序使用最多3個(gè)局部于線程的數(shù)據(jù)段。

系統(tǒng)調(diào)用set_thread_area()和get_thread_area()分別為正在運(yùn)行的進(jìn)程創(chuàng)建和撤銷(xiāo)一個(gè)TLS段


Linux LDT

大多數(shù)用戶態(tài)下的Linux程序不使用局部描寫(xiě)敘述符表,這樣內(nèi)核就定義了一個(gè)缺省的LDT共大多數(shù)進(jìn)程共享。


轉(zhuǎn)載于:https://www.cnblogs.com/brucemengbm/p/6753685.html

總結(jié)

以上是生活随笔為你收集整理的内存寻址一(分段)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 美女扒开尿口给男人看 | 国产精品女人精品久久久天天 | 黄色片一区 | 黄色特级一级片 | 亚洲字幕成人中文在线观看 | 免费观看理伦片在线播放视频软件 | 美国一级大黄一片免费中文 | 日本美女久久 | 中国少妇初尝黑人巨大 | 少女与动物高清版在线观看 | 日韩特黄 | 免费黄色小视频在线观看 | 成人三级黄色片 | 亚洲天堂视频在线观看 | 一区二区三区精品国产 | 婷婷精品 | 亚洲日本天堂 | 看91| 男人的天堂在线观看av | 无罩大乳的熟妇正在播放 | 亚欧成人精品一区二区 | 男女无套免费视频网站动漫 | 国产欧美一区二区三区在线老狼 | 亚洲视频久久久 | 中文字幕乱码人妻无码久久95 | 国产黄色大片在线观看 | 精品一区二区三区久久 | 亚洲av久久久噜噜噜熟女软件 | 亚洲 小说区 图片区 | tube日本69第一次 | 国产精品羞羞答答在线 | 亚洲大尺度在线 | 欧美4区| 日韩精品在线免费观看 | 欧美精品色婷婷五月综合 | 日韩女优一区 | 亚洲啪啪网站 | 日韩免费播放 | 久久精品视频在线播放 | 国产黄色在线播放 | 青青青操 | 成人性生活免费看 | 精品福利视频一区二区 | 青青草原在线免费观看视频 | 国产情侣一区二区三区 | 无遮挡边吃摸边吃奶边做 | 国产电影一区在线观看 | 日韩国产传媒 | 精品一区二区三区在线观看 | 国产成人啪精品午夜在线观看 | 91琪琪| 欧美性xxxxxx| www.黄色免费 | 中文字幕在线观看av | 在线激情av | 国产美女91呻吟求 | 国产伦精品一区二区三区免费迷 | 国产chinese男男gaygay视频 | 亚洲一区二区三区国产 | 欧美国产一区二区 | 亚洲爆爽 | 亚洲国产剧情在线观看 | 亚洲av无码一区二区乱子伦as | 日本一区二区三区视频免费看 | www.xxxx欧美 | 久久精品视频免费 | 好大好舒服视频 | 亚洲操图| 国产三级国产精品国产国在线观看 | 进去里片欧美 | 国模少妇一区二区 | 一区二区三区四区影院 | 中国黄色一级毛片 | 国产视频第一页 | 99热黄色 | 国产一区二区三区中文字幕 | 蜜臀尤物一区二区三区直播 | 亚洲中出 | 天天射影院 | 中国黄色a级片 | 奇米四色777| 久久精品亚洲精品 | 色婷婷导航 | 抖音视频在线观看 | 亚洲精品综合在线观看 | 国产日韩高清在线 | 国产sm主人调教女m视频 | 在线电影一区二区 | 日本va在线观看 | 老色驴综合网 | 国产黄色在线网站 | 少妇xxx| 可以免费看污视频的网站 | 久久婷婷网站 | 国模私拍一区二区三区 | 成人免费视频免费观看 | 国产亚洲精品久久久久婷婷瑜伽 | 欧美丰满少妇 | 国产精品亚洲天堂 |