GDT和LDT详解

article/2025/9/19 3:28:28

1.GDT

我们回顾一下实际的操作系统的内存关系:

程序/进程 → 映射 段 表 逻辑地址 → segment unit 段 基 址 + 偏 移 地 址 虚拟地址 → page unit 页 表 物理内存地址 \text{程序/进程}\overset{段表}{\xrightarrow[\text{映射}]{}} \text{逻辑地址}\overset{段基址+偏移地址}{\xrightarrow[\text{segment unit}]{}} \text{虚拟地址}\overset{页表}{\xrightarrow[\text{page unit}]{}} \text{物理内存地址} 程序/进程 映射逻辑地址 segment unit+虚拟地址 page unit物理内存地址

这里有一个重要的概念虚拟内存,这个概念是面向软件程序而言,他们希望程序是连续的地址,一段一段的,注意,在32位系统里,一个program仅有3G,(还有1G OS程序占据)

而逻辑地址 由 两个部分组成 Segment SelectorOffset(偏移地址)

其中Segment Selector 指向 Segment Descriptor,一个 Segment Descriptor 完整的描述了一个 Segment 既段的信息.

因为程序中一般将一个程序所使用的部分分为程序段,数据段,堆段和栈段等,这里面每一个段也就会有相应的Base,执行中也会Offset(即Linear Address)

Segment Descriptor

段通过段描述(Segment Descriptor)保存段的信息,每一个 Segment Descriptor 作为一个 entry 保存到 GDT(全局段表)中;总长为64位;Segment Descriptor 由如下部分构成,

img

  • Base
    长度 32 bits,Segment 在虚拟内存中的起始地址;
  • Type
    长度 4 bits,表示访问权限,读、写、执行等权限;
  • S
    长度 1 bit,系统标志位,表示该段是否是系统段,如果是,表示其中保存的是系统核心内容;
  • D Or B
    表示该段包含的是 data 还是 code;

Segment Selector

Segment Selector 又称作 Segment Identifier 既段标识,它作为标识指向段表中该段所在的位置;

Segment Selector 总长 16 bits,由三部分组成,

img

  • index指向的是段描述(Segment Descriptor)在段表(GDT)中的偏移地址(直白点说,就是定位段在段表中的位置),长度 13 位.

    假设求某个段的位置:

    a d d r s = a d d r g + i n d e x ∗ 8 addr_s = addr_g + index * 8 addrs=addrg+index8

    其中 a d d r g addr_g addrg保存在GDTR中

  • TI
    Table Indicator;长度 1 bit,表示它指向的是 GDT 还是 LDT;

  • RPL

    Request Privilege Level;长度 2 bits;指定 CPU 访问的权限级别;

    • 00 表示该段运行在内核态
    • 11 表示该段运行在用户态

这些概念似乎有点太过绕看图

操作系统内存管理 - 全局段表结构

这里就很清楚的表明 segment selector + GDTR 确定了 Segment Description的位置.而Segment Description指向的是段的实际位置…

2.LDT(linear Data Table)

线性地址,既常说的虚拟地址;线性地址由逻辑地址映射而来,物理地址由线性地址映射而来.虚拟地址处于

映射
映射
逻辑地址
线性地址
物理地址

线性地址由两部分组成 段基址(从GDT/LDT中得到) + 偏置

img

而逻辑地址(代码中内容),为Segment Selector : offset

这里我们得清楚LDT和GDT基本结构是类似的LDT内部存储的是进程相关的段的基址内容,GDT存储的是内核代码的段的基址,而下面一张图则会更好的说明LDT以及GDT的关系.

**总结:**系统会给程序自动分配程序段,代码段等,这些段以及偏移组成了逻辑地址,而逻辑地址通过GDTR/LDTR,找到位于虚拟内存的段基址,最后得到虚拟地址.

3.线性地址到物理地址

基于之前的学习我们认知到,一页物理内存大小为4K,而32位操作系统的最大寻址空间是4G(系统总线数目限制),则总共有1 M个页框.

物 理 内 存 = 页 框 号 + 偏 移 地 址 物理内存 = 页框号 +偏移地址 =+

则假设物理地址为 d d d,而页框号为 n n n,偏移地址为 r r r

d 4 K = n . . . . r \frac{d}{4K} = n .... r 4Kd=n....r

结合前面学习的多级也变原理,我们清楚,为了避免储存页框浪费过多内存,所以采用多级页表.

则由上述的线性地址

img

天然形成这样一种对应关系,总共有 1024 个 Directories(目录),每个 Directory 包含 1024 个页表,每个页表对应 4K 个偏移地址(这里这样做是有目的的,这样这好与一个物理页框的偏移地址范围相吻合);那么总共有

1024 × 1024 × 4 K = 4 G 1024\times 1024\times 4\text{K}=4\text{G} 1024×1024×4K=4G

  • 这里就会有一个疑问了注意,逻辑地址中的 Offset 是 32 位的,而基于多级页表的线性地址的 offset 是 12 位的,为什么偏移由此转换呢?

    ​ 因此逻辑地址中 32 位的偏移地址是段内偏移地址,因此它的地址仍然是 32 位,而线性地址的偏移地址需要与物理页框的偏移地址对应起来(一个页为 2 12 = 4 K 2^{12} = 4K 212=4K ),所以,需要设计为 12 位,否则虚拟地址和物理地址基于页框的偏移地址对应不起来,就得不到正确的转换;

  • Directory(目录)记录着上述第一层的地址—>cr3 + directory

  • Table 记录着第二层的地址,即—>Directories entryXX + table

img

  1. 通过控制寄存器 cr3 找到 Page Directory Table 在内存中的起始地址;

  2. 通过线性地址中的 Directory 段从 Page Directory Table 中找到对应的 Directory Entry;

  3. 通过 Directory Entry 的高 20 bits 找到 Page Table 在主存中的起始地址;

  4. 通过线性地址中的 Table 段从 Page Table 中找到对应的 Page Entry;

  5. 从 Page Entry 中通过虚拟页框号找到物理页框号 P F N p PFN_p PFNp

  6. 最后,通过 P F N p × 4 K + O F F S E T = 物 理 内 存 地 址 PFN_p \times 4K + OFFSET = 物理内存地址 PFNp×4K+OFFSET=

这些内容由page unit完成

e Entry;

  1. 从 Page Entry 中通过虚拟页框号找到物理页框号 P F N p PFN_p PFNp

  2. 最后,通过 P F N p × 4 K + O F F S E T = 物 理 内 存 地 址 PFN_p \times 4K + OFFSET = 物理内存地址 PFNp×4K+OFFSET=

这些内容由page unit完成


http://chatgpt.dhexx.cn/article/DjA7gWM5.shtml

相关文章

GDT(全局描述符表)和LDT(局部描述符表)

Home > GDT(全局描述符表)和LDT(局部描述符表) 每个程序都有自己的LDT,但是同一台计算机上的所有程序共享一个GDT。LDT描述局部于每个程序的段,包括其代码、数据、堆栈等。GDT描述系统段&#xff0c…

什么是数据可视化?

到底什么是数据可视化?带你一窥究竟~ 技术人最不该忽视可视化数据分析! 导读:在这个“人人都是数据分析师”的时代,大企业的同学几乎都在参与数据的采集、加工与消费。数据可视化作为连接“加工——消费”的重要一环…

当下最火的中台到底是个什么鬼,看完这一篇最通俗易懂的文章后,你就会彻底明白了!...

公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你提升技术视野! 背景 自从阿里巴巴现任CEO逍遥子在2015年提出”大中台,小前台”战略以来,关于”什么是中台”,可谓是一石激起千层浪,大量文章在描述…

STD::是什么?

【&#xff23;&#xff0b;&#xff0b;】std&#xff1a;&#xff1a;是什么&#xff1f; 引例&#xff1a; #include<iostream> int main() {std::cout<<"我喜欢C";//输出一句话std::cout<<std::endl;//换行return 0; } 1.std是什么&#xff1…

C语言中 1%3,算术什么意思啊 算数什么意思

算术什么意思啊 算数什么意思以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 算术是什么意思 数学 什么是算术和 算术和是正数的和,即绝对值的和,例如2+13.5+7,Ge个数值皆为正且相加。  主要区别于代数和,…

matlab语句temp,maxtemp什么意思 will什么意思

maxtemp什么意思 will什么意思以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Min Temp 和 Max Temp 是什么意思 最小的Temp和最大Temp Temp: Chang用的办公软件和其他应用程序通常会临时保Cun用户的工作结果,…

html 玫瑰花

简易html 代码玫瑰花 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>玫瑰</title><style type"text/css"> #shusheng { position: absolute; width: 100%; height: 100%; text-align: center; } &…

计算并输出所有的玫瑰花数

如果一个n位正整数等于它的n个数字的n次方和&#xff0c;则称该数为n位自方幂数。四位自方幂数称为玫瑰花数。编程计算并输出所有的玫瑰花数。 #include <stdio.h> #include <math.h>int main() {for (int i 1000; i < 10000; i){if (i pow(i%10, 4) pow((i/…

C语言代码:玫瑰花

前文 在古希腊神话中&#xff0c;玫瑰花集爱与美于一身&#xff0c;既是美神的化身&#xff0c;又溶进了爱神的血液&#xff0c;所以它所代表的含义是爱情。 我们应该用玫瑰花来表达我们的爱意&#xff0c;但是好多的恋人都是因为异地而没有办法去买一束新鲜的玫瑰去送给自己的…

七夕玫瑰花合集

图片来源&#xff1a;百度动图 一年一度的七夕又快到了&#xff0c;用Python画一朵玫瑰花送给你的那个TA吧图片。更多表白代码可以到”阿黎逸阳的代码“公众号中翻看表白合集中的文章。 一、绘制结果 1. 玫瑰花1 2. 玫瑰花2 二、画玫瑰花代码 1. 用turtle库画一朵玫瑰花版本1 #…

C++玫瑰花源码

#include "stdafx.h" #include <graphics.h> #include <conio.h> #include <math.h> // 定义全局变量 int rosesize 500; int h -250; // 定义结构体 struct DOT { double x; double y; double z; double red; // 红…

Python玫瑰花

用Python画一朵玫瑰花&#xff08;附带源码&#xff09; 需要的模块包 turtle(内置包) 源码部分 import turtle# 设置初始位置 turtle.penup() turtle.left(90) turtle.fd(200) turtle.pendown() turtle.right(90)# 花蕊 turtle.fillcolor("red") turtle.begin_fill…

C语言玫瑰花

效果图&#xff0c;如果想要更改颜色&#xff0c;可以在代码最后一行system处修改。 #include <stdio.h> #include <math.h>const int max_iterations 128; const float stop_threshold 0.01f; const float grad_step 0.01f; const float clip_far 10.0f;cons…

如何买玫瑰?

代码和任务 /*copyright(c)2015 csdn学院 *All right reserved. *文件名称&#xff1a;main.c *作者&#xff1b;张如田 *完成日期&#xff1a; *版本号&#xff1a; *任务描述&#xff1a;小慧过生日&#xff0c;小明&#xff08;小明真忙&#xff09;要买鲜花送她。每枝红玫瑰…

买玫瑰

要求&#xff1a;小慧过生日&#xff0c;小明&#xff08;小明真忙&#xff09;要买鲜花送她。每枝红玫瑰5元&#xff0c;满5支送1枝&#xff0c;满20枝送5枝。小明一共有n(n>10)元钱&#xff0c;最多能买到多少&#xff1f; 样例输入&#xff1a;135 样例输出&#xff1a;3…

中软国际实训全记录——第三天

中软国际实训第三天——认识ssm与搭建ssm 1、ssm框架基本概念1.1、Spring1.2、SpringMVC1.3、MyBatis 2、建立ssm项目2.1、新建Maven项目2.2、添加项目主要目录2.3、项目内容编码2.4、使用Tomcat运行项目2.5、建立数据库的连接2.6、对数据库中数据进行查询2.7、使用控制器显示查…

中软国际实训全记录——第六天

中软国际实训第六天——SpringSecurity的架构与实现 实现SpringSecurity导入依赖包配置过滤器添加配置文件编码实现 在昨天实现了角色管理的增添查改与分页之后&#xff0c;在今天我们需要将不同的用户分类&#xff0c;以保证在用户是不同权限时&#xff0c;可以对所需的信息进…

中软国际实训全记录——第五天

中软国际实训第五天——实现分页式管理及 实现对用户列表的分页式管理实现角色管理的数据库以及初步操作个人总结 实现对用户列表的分页式管理 在昨天我们实现了对数据库中的增添查改&#xff0c;因此在此处我们不再赘述如何实现&#xff0c;今天我们就主要来实现分页式的管理…

中软国际软件测试培训中心,中软国际准员工培养计划C++开发/软件测试方向开班典礼...

2010年8月31日上午9点半&#xff0c;中软国际准员工培养计划—C开发/软件测试方向开班典礼在无锡ETC隆重举行。 开班典礼在热烈的掌声中拉开了序幕。典礼由教务部经理陈晨老师主持&#xff0c;首先她对近20名学员的到来表示欢迎&#xff0c;并对本次学习班顺利开班表示祝贺。中…

中软国际实训全记录——第七天

中软国际实训第七天——实现多条信息的删除 实现对用户信息的多条删除&#xff0c;我们需要使用到aiax&#xff0c;AJAX不是JavaScript的规范&#xff0c;它是Asynchronous JavaScript and XML&#xff0c;意思就是用JavaScript执行异步网络请求。 如果仔细观察一个Form的提交&…