(Translated by https://www.hiragana.jp/)
X86記憶體區段 - 维基百科,自由的百科全书 とべ转到内容ないよう

X86記憶きおくたいだん

本页使用了标题或全文手工转换
维基百科ひゃっか自由じゆうてき百科ひゃっかぜん
重定しげさだこう記憶きおくたいだん

x86構中,記憶きおくたいだん英語えいごMemory Segmentationざい改變かいへん16もとだん選擇せんたく时,使用しようたん个索引暫そん保存ほぞんりょうだん内地ないちへんうつり值)しょのう夠定てきてき記憶きおくたい範圍はんい份。也指ざいえいとくx86指令しれいしゅう体系たいけい结构しも記憶きおくたいだんてき实现方式ほうしき

8086开始いたずいきさきてきかく款x86构CPU,无论实模しき还是护模しきうちそん寻址时都使用しよう16だんよせそん(segment register)。だんよせそんだま使用しようじょう况为:

  • だい码段よせそんCSあずかよせそんIPあい配合はいごう获得とうまえ线程だい码执ぎょういたてきないそん位置いち
  • かずすえだんよせそんDSあずかかく通用つうようよせそん配合はいごう访问ないそんちゅうてきすうすえ
  • 栈段よせそんSSあずかよせそん(E)SP、(E)BP配合はいごう访问线程てき调用栈(call stack);
  • 扩展だんよせそんESよう特定とくていくし指令しれい(如MOVSあるCMPS)。
  • 80386引入りょう2个额外的がいてきだんよせそんFSあずかGS,并无特定とくていてきかたけん用途ようと

这些だんよせそんじょりょうゆう16てき部分ぶぶん,还有不可ふか见的隐藏部分ぶぶんしょう为描じゅつ缓存“descriptor cache”ある隐藏よせそん“shadow register”[1]とう一个段选择符(segment selector)そうにゅうだんよせそんてき部分ぶぶん,处理どう时也该段描述てき其它すうすえそうにゅういただんよせそんてき隐藏部分ぶぶん,这包括ほうかつだん开始てき基地きちだん长度、访问ひかえせいしんいきとう。这些しんいき缓存いただんよせそんちゅう,避免りょう处理ざい转址(translate address)时花费额外的がいてき总线周期しゅうき从段选择ひょうちゅう读入すうすえ。处理指令しれいちゅう明示めいじ使用しよう哪些だんよせそん,这将がえ换掉默认使用しようてきだんよせそん[2]

历史

[编辑]

1978ねんてきIntel 8086开始引入りょうないそん分段ぶんだん。这使とく16CPU以访问超过64 KB (65,536节)てきないそん,实际じょう8086 CPUいたうちそんてき总线20そく访问220=1MBないそんざい16もとしきようゆずる應用おうようほどしき使用しよう記憶きおくたいだんためりょうそんにんいち64Kだんかえようだいてき記憶きおくたいこれ相當そうとう複雜ふくざつ。這個問題もんだいてき根源こんげんざい於沒ゆう適當てきとうてき適合てきごう做整記憶きおくたい範圍はんいてき平面へいめんじょうてき算術さんじゅつ指令しれい平面へいめんじょう方式ほうしき也可以乘ほう指令しれいらい完成かんせいただし这會しるべ致較慢的ほどしき執行しっこう速度そくど

1982ねんめんてき80286處理しょりてき真實しんじつしきあずか保護ほごしき,以及80386及其てき處理しょりてききょなずらえ86しき,一個區段的大小是64 KiB使用しよう16もと索引さくいん暫存)。ざいIntelx86てき真實しんじつしきしたてきだん構的ないそんそら间會ゆうしょ重疊ちょうじょう,这是一種いっしゅこのみてき設計せっけい。 80286てき护模しき,16てきだんよせそんちゅうてき13しょうさくだん选择segment selector)描述ひょうてき条目じょうもく(descriptor table entry)てき索引さくいん;该条包含ほうがんりょう24てきだん开始以及16てきだん长度;だん开始あずかだんないへんうつりしょうそく为内そん物理ぶつり。16だんよせそんちゅうてき剩余じょうよ3ぶん别是全局ぜんきょく/局部きょくぶ描述ひょう指示しじ、请求とく权级(request privilege level)。

1985ねんめんてき80386及其處理しょりてき32もと保護ほごしきした,一個區段长度上限是220个粒单位,つぶ以是1节或4K节,いん分段ぶんだん长度上限じょうげん以是4 GB,这与索引さくいん暫存32もとしょう配合はいごう

ずい32もと作業さぎょう系統けいとうてき推出,以及さら舒適てき32もと平面へいめん記憶きおくたいしきいた1990ねん末期まっきいく淘汰とうたりょう使用しようだんじょうしか而,使用しよう32平面へいめん記憶きおくたいしきさんせいてき最多さいたただのう访问4 GBそら间的げんせい并没ゆう远离日常にちじょうてき使用しようだん允許いんきょ作業さぎょう系統けいとう对每行程こうていきょなずらえじょう空間くうかんてききりせい最大さいだい利用りよう64 GBてき系統けいとう記憶きおくたいただし这种最終さいしゅう回歸かいきいただんてき尴尬,经常引述为朝64もと處理しょり发展てき动机。

2003ねん问世てきx86-64构下,强制きょうせい实现りょう平面へいめん記憶きおくたいしきただし保留ほりゅうりょう使用しようだんよせそんFSあるGSてき64てき分段ぶんだん寻址。

实模しき (Real Mode)

[编辑]

じつしきあずかきょなずらえ86しきした访问ないそん固定こてい为1 MB。对于8086处理使用しようよせそん长度为16节,ただし拥有20节的いたうちそん总线。为了使用しよう16节寄そん访问20节地せい个内そん划分为多个区だん。一个区段长65,536节即64 KB。ざい实模しき,访问ないそん必须どおり过segment base addresssegment offset(ぶん别储存在そんざい任意にんいsegmentよせそん任意にんい通用つうようよせそんさと。) 实访问的物理ぶつりよし以下いか公式こうしきいた

物理ぶつり=(segment base address*0x10) + segment offset [3]

注意ちゅういどう样的物理ぶつり以由个不どう对的selector,offset组成。 实模しきにん何程なにほどじょ以访问全部内ぶないそんそら间。ぼつゆう对内そんてき访问权限护。

80286护模しき

[编辑]

Intel 80286处理仍然使用しよう16だんよせそんあずか16てきだんないへんうつりただし护模しき支持しじ访问224(16M)节的ないそん。16だんよせそんないさいだん,16だんよせそんてきだか13しょうさくだん选择(segment selector),其值いただん描述えいsegment descriptorsひょうてき索引さくいん值。だん描述ちゅう包含ほうがんりょう24てきだん开始てき基地きち,20てきだん长度。だん开始あずかだんないへんうつりしょうそく为内そん物理ぶつりだんてき长度上限じょうげん为220=1M节。

80386护模しき

[编辑]

Intel 80386处理继续使用しよう286てき分段ぶんだん护模しきただしだん描述ちゅう包含ほうがんりょう32てきだん开始てき基地きちだんないへんうつり也是32ざい分段ぶんだん转址あずか物理ぶつり间又增加ぞうかりょういち层分页(paging)转址。分段ぶんだん寻址不能ふのう关闭てきぶん页可以使のうある关闭(enabled or disabled),如果关闭就与286护模しきいち样。如果使用しようぶん页机せい,则由だん开始てき基地きちあずかだんないへんうつりしょうとくいたてき线性きょ),线性需要じゅようぶん页转ざいいたうちそん物理ぶつり

386てきだん描述ちゅうてきだん长度为20だん长度てきつぶ设为1节或212节。よし此段长度以为1节-1M节,あるもの为1×4K节-1M×4K节。だん描述てきすうすえ结构为;

  1. Byte offset inside entry.
  2. First range is the bit offset inside entry; second range is the bit offset inside byte.


386处理增加ぞうかりょう两个だんよせそんFS、GS,这两个寄そん并无かたけん绑定てき用途ようと。Windows操作そうさけい统在FS:0ちゅう保存ほぞんりょうとうぜん线程しんいき块。LinuxちゅうGS指向しこうりょう线程局部きょくぶそん

つう过清じょひかえせいよせそんCR0ちゅうてき最低さいていよし386护模しき转为实模しき

Linux操作そうさけい统在386护模しきだんもと设为0,だん长度设为4GiB,从而拟了平面へいめんないそん模型もけい

だんよせそん名字みょうじ 描述 基地きち だん长度 だん描述とく权级
__KERNEL_CS うちかくだい码段 0 4 GiB 0
__KERNEL_DS うちかくすうすえだん 0 4 GiB 0
__USER_CS よう户代码段 0 4 GiB 3
__USER_DS よう户数すえだん 0 4 GiB 3

x86-64てき64しき

[编辑]

ざいx86-64体系たいけい结构64てきlong mode,だんよせそんCS, SS, DS, ES强制きょうせい为0。だん长度强制きょうせい为264形式けいしきじょう还有ないそん分段ぶんだんただし实际じょう所有しょゆうないそんざいただいちてきいち个分段中だんなかだんよせそんFS、GS以有0值,操作そうさけい统用于其它用途ようとそくかたけん支持しじ如“FS:[RAX]”这样てきよせそん间接寻址。

参考さんこう文献ぶんけん

[编辑]
  1. ^ "Intel 64 and IA-32 Architectures Software Developer's Manual", Volume 3, "System Programming Guide", published in 2011, Page "Vol. 3A 3-11".
  2. ^ Intel Corporation (2004). IA-32 Intel Architecture Software Developer's Manual Volume 1: Basic Architecture页面そん档备份そん互联网档あん
  3. ^ OsDev. OsDev Segmentation. osdev.org. [2019-08-08]. (原始げんし内容ないようそん档于2022-05-10).