IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> linux内核学习1:内存地址(1) -> 正文阅读

[系统运维]linux内核学习1:内存地址(1)

1. 程序反汇编

机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地址,再经过MMU(CPU中的内存管理单元)转换成物理地址才能够被访问到。

我们写个最简单的hello world程序,用gccs编译,再反编译后会看到以下指令:

mov 0x80495b0, %eax

这里的内存地址0x80495b0 就是一个逻辑地址,必须加上隐含的DS 数据段的基地址,才能构成线性地址。也就是说 0x80495b0 是当前任务的DS数据段内的偏移

2. LINUX地址分类

当使用80x86微处理器时,必须区分以下三种不同的地址:

  1. 逻辑地址(logical address),每一个逻辑地址都由一个段(segment)和偏移量(offset或者displacement)组成,偏移量指明了从段开始的地方到实际地址之间的距离。
  2. 线性地址(linear address),也称虚拟地址(virtual address),是一个32bit无符整数,可以用来表示4G的地址,通常由16制数字表示。可以认为是cpu执行程序过程中的一种中间地址。
  3. 物理地址(physical address),用于内存芯片级内存单元寻址,与地址总线相对应。他们与从微处理器的地址引脚范松到内存总线上的电信号相对应,物理地址由32bit或36bit无符号整数表示。

逻辑地址——>【分段单元】——>线性地址——>【分页单元】——>物理地址

2.1 实模式和保护模式

具体区别查看:https://zhuanlan.zhihu.com/p/42309472
实模式的"实"更多地体现在其地址是真实的物理地址。
保护模式,实现更大空间的,更灵活也更安全的内存访问。

2.2.逻辑地址转换成线性地址

在 80386中,有6个16位的段寄存器,但是,这些段寄存器中存放的不再是某个段的基地址,而是某个段的选择符(Selector)。因为16位的寄存器 无法存放32位的段基地址,段基地址只好存放在一个叫做描述符表(Descriptor)的表中

我们在寻址的时候,一般是从段寄存器拿到段选择符,然后再根据选择符的索引号,找到段描述符,然后从段描述符中取出段基址,加上偏移就形成了我们要访问的地址

段选择符

段选择符(或称段选择子)是段的一个十六位标志符,段选择符用来表示指向哪个段描述符,即用来在段描述符中寻址

索引号:给出了描述符在GDT或LDT表中的索引项号。 TI : TI([2])TI = 0 ,表示描述符在GDT中
TI =1,表示描述符在LDT中。
RPL :请求特权级,装在cs寄存器中,值为0代表最高优先级,为3代表最低优先级。linux中只用哪0级和3级,分别称之为内核态和用户态

在这里插入图片描述

为了更方便的找到段选择符,处理器提供了段寄存器,段寄存器的唯一目的就是存放段选择符。

段寄存器

段寄存器:有6个段寄存器,分别为:
cs(代码段寄存器)——包含程序指令的段
ss(栈段寄存器)——包含当前程序栈的段
ds(数据段寄存器)——包含静态数据或者全局数据的段
es、fs和gs,用于存放段选择符。——一般用途,指向任意的数据段

cs除了是包含程序指令的段,还包含前面提到的请求特权级(RPL),值为0代表最高优先级,为3代表最低优先级。linux中只用哪0级和3级,分别称之为内核态和用户态

段描述符

段描述符8个字节,描述了段的特征。段描述符存放在全局描述符(GDT)或者局部描述符(LDT)中

GDT在主存中的地址和大小存放在gdtr控制寄存器中,当前正在被使用的LDT的地址和大小放在ldtr控制寄存器中。

段描述符具有64位在GDT表中结构如下:
在这里插入图片描述

P位:段描述符中高4字节中的15位P位是最重要的1位,如果P=0代表这个段描述符不用看了无效是个无效描述符

          P=1代表这个段描述符有效(如果P=0其它的所有操作比较啊都没有意义)

G位:是粒度G=0代表20位的Limit的单位是BYTE,G=1代表20位的Limit的单位是4KB一个页

        G=0或1只会决定能访问的大小,不会决定段的大小,只决定Limit的范围(而Limit决定你能访问段的大小)

D/B位:会在后面进行讲解比较复杂

DPL:在段描述符的高4字节的13-14位,表示段描述符特权级,只有想要加载这个段描述符的选择子的请求特权级别高于

        或者等于DPL才能加载这个段(也就是你达到了女方要求的条件了)RPL(权限大于)>=DPL只是条件之一,下一篇帖子

        段权限检查会给大家全面的讲述,加上实践检验

S位: S=0代表这个描述符是系统段描述符,S=1代表这个段描述符是代码段描述符或者数据段描述符

      GDT中的描述符分为两类一类是系统段描述符,另一种数据段描述符或者代码段
Type:描述段的类型特征和它的存取权限,4-bit

还有其他的这里不详细讲,看上面的图

常见的几种段描述符Type(即上面Type字段):

  • 代码段描述符(Code Segment Descriptor),代表一个代码段,可以放在GDT或者LDT中,该描述符S标志为1(非系统段)。、-
  • 数据段描述符(Data Segment Descriptor),代表一个数据段,可以放在GDT或者LDT中,S标志为1。
  • 任务状态段描述符(Task State Segment Descriptor,TSSD),代表一个任务状态段(Task State Segment,TSS),也就是说这个段用于保存处理器寄存器的内容,只能出现在GDT中。
  • 局部描述符表描述符(Local Descriptor Table Descriptor,LDTD),代表一个包含LDT的段,只出现在GDT中,S标志为0。

段描述符的地址 = GDT/LDT的值(保持在gdtr/ldtr寄存器) + (段选择符的索引值 * 8)
能够保持在GDT中的段描述符的最大数目是8191,即2^13 -1

分段单元工作步骤

下图显示了一个逻辑地址是怎样转换成对应的线性地址的。

① 检查段选择符的TI字段,以确定段描述符保存在GDT还是LDT中

② 段描述符地址 = gdtr / ldtr + 段选择符index字段 * 8(每个段描述符8B)

③ 线性地址 = 段描述符base字段 + 逻辑地址的偏移量

在这里插入图片描述

对上面的各种地址的阶段性总结如下:

CPU将一个虚拟地址空间的地址转换为物理地址,需要进行两步:首先将给定的逻辑地址,即[段标识符:段内偏移量]这样的形式,利用段式管理单元,转化为线性地址,然后利用页式内存管理单元,转化为最终的物理地址。
  参考https://blog.csdn.net/baidu_35679960/article/details/80463445
   https://blog.csdn.net/wxzking/article/details/5905214

在Linux下,逻辑地址与线性地址总是一致(是一致,不是有些人说的相同)的,即逻辑地址的偏移量字段的值与线性地址的值总是相同的。!!!”所以如果做linux下内核开发,对于上述的x86的段式管理可以完全不用理会,我们可以认为linux根本没有用intel弄出来的这个段式管理,而是以页式管理完成了所有的内存管理工作。
这个在下一个介绍
在这里插入图片描述

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-07-29 12:03:21  更:2021-07-29 12:05:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 10:55:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计