操作系统内存管理-01分段

news2025/1/31 8:01:40

前言

本文讲述本文博主在学习80386window下段式内存管理。

内存管理往往需要软硬件结合进行管理,CPU定制一套官方规范,要求操作系统按要求实现某些操作即可。本文所述的CPU 分段规范 在intel 第三卷 第三章。

在这里插入图片描述

分段概述

我们知道每一个程序会被赋予一个"虚拟内存",在进行实际对内存写入的时候会进行一次转物理地址转化在进行操作。

下图在来自intel手册,这个转化分为两个部分:段地址转化线性地址(分段机制),线性地址通过页表转化物理地址(分页机制)。
在这里插入图片描述
当然分页机制intel并没有做强制要求开启,但是分段逻辑被强制开启了。分页逻辑没有开启那么分段逻辑转化的线性地址就是物理地址。

intel把内存划分很多个区域每个区域我们把它视为一个段,

在这里插入图片描述
将虚拟内存的段转化为物理的段地址。

每个段都有相关可读可写等属性,这些属性被放入一个叫 段描述符(segment descriptor) 的数据结构中,并且数据结构还承担虚拟内存中的段转化为物理地址中段地址。

在这里插入图片描述
段描述表一般存于两个寄存器中GDTRLDTR。并且这两个寄存器存放的是直接物理地址中的表位置,不然的话会产生先有鸡还是现有蛋问题。

我们可以用windbg调试内核输出相关寄存器

//windbg相关命令
//查看 gdtr寄存器
r gdtr
//查看 ldtr寄存器
l ldtr
//查看当前处理器信息 https://en.wikipedia.org/wiki/Processor_Control_Region
!pcr

在这里插入图片描述
如果是非内核调试可以用

我们可以使用dd命令单独查看这个指向的地址数据
在这里插入图片描述
或者使用dg 查看解析后的段描述符号结果
在这里插入图片描述
一些可视化工具的输出
在这里插入图片描述
看了上面的数据后我们看看段选择子(segment selector)概念。我们知道GDTR存储一个表,里面有很多段描述符,而一个程序里面有很多段我怎么知道这个段跟哪个段描述符相关呢?这关系映射又是靠一个段选择子的数据结构维护的。段选择子必须加载到一个段寄存器中才能使用(这也导致了使用段机制一些缺陷,所以很多操作系都弱化了段的其中一个原因)。

系统预置的段寄存器如下:
CS SS DS ES FS GS

他们存储的数据结构可以存储了相关GDTR表中索引,当然为了加速intel在这些寄存器末尾额外补充了一个64长度的数据用于缓存段描述符(也是64位),当然这部分存储空间对开发者不可见。也有称为影子寄存器或者称为段寄存器不可见部分。

在这里插入图片描述
上图来自intel手册。visible part 大小为16位也就是程序员可以操作的,hidden part就是影子寄存器。

其数据结构如下:

在这里插入图片描述

第0位-第1位 作为权限位 用于权限请求位。
第2位 表示你要去GDTR 还是LDTR查找表。
第15-3位 作为GDT的下标,一共13位共计8192项。

举个例子:
在这里插入图片描述
我们距离如下三个段选择子:
cs=0008
ss=0010
ds=0023


void printSegmentSelector(int16_t ss) {

	int index =ss>>3;
	int TI =ss>>2 & 0x1;
	int PRL = 0x3 & ss;

	char out[100] = { 0 };
	sprintf_s(out, "index=[%d] ti = [%d] prl=[%d]", index, TI, PRL);
	printf("%s\r\n", out);
}
int main()
{
	
	

	printSegmentSelector(0x0008);
	printSegmentSelector(0x0010);
	printSegmentSelector(0x0023);
	return 0;
}
	

输出
index=[1] ti = [0] prl=[0]
index=[2] ti = [0] prl=[0]
index=[4] ti = [0] prl=[3]

我们使用dg命令去查看对应段描述符解析结果
在这里插入图片描述
可见这三个段的范围是0-4G 也就是整个内存,可见分段已经被弱化。

段描述符

数据结构是一个64位大小,如下图所示(来自itnel手册)
在这里插入图片描述

重要字段:
Base Address: 32位的基地址,由描述符的三个部分组成(由于历史因素要向后兼容才会将其分散)。
Segment Limit: 20位的段内偏移,由描述符的两个部分组成(由于历史因素要向后兼容才会将其分散)。
G :设置Segment Limit 粒度是字节为单位还是4kb为单位,1为4kb

我们假设G为 4k为单位那么Segment Limit偏移大小就是0到4G。

这里我们直接使用pchunter查看解析结果即可
在这里插入图片描述

参考链接

现代操作系统内存管理到底是分段还是分页,段寄存器还有用吗?

what-is-the-difference-between-linear-physical-logical-and-virtual-memory-addr

how-are-segment-registers-involved-in-memory-address-translation

GDT_Tutorial

内核_段寄存器|段描述符|段选择子(详解)

Linux 获取虚拟地址对应的物理地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/39795.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

可自定义评教系统(教学质量评估系统)设计与实现(SSM)毕业论文+设计源码+mysql文件

目 录 摘要 I Abstract II 第1章 绪论 1 1.1 课题背景 1 1.2 研究意义 1 1.3 国内外研究现状分析 2 1.3.1 评教指标的过于简单化 2 1.3.2 评教指标的权重过于平均 2 1.3.3 评教结果的可信度和缺乏科学的数据分析 2 1.4 系统开发的主要目标和内容 3 1.4.1 开发目标 3 1.4.2 开发…

C++ 内存模型

1、内存分区模型 C程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理的(所有代码包含中文注释)全局区:存放全局变量和静态变量以及常量栈区:由编译器自…

使用 Clion (cmake) 运行FreeRTOS

这里使用的是 f4071. 先用STM32CubeMX 建立一个可以运行的stm32项目,toolchain选择 SW4STM322. 官网下载源码www.freertos.org我这里下载的是FreeRTOSv202112.00.zip 解压缩后得到需要以下几个文件夹或档案FreeRTOS/Source下的所有的 .c 档案FreeRTOS/Source/includ…

【附源码】计算机毕业设计JAVA在线图书超市

【附源码】计算机毕业设计JAVA在线图书超市 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JAVA mybati…

算法刷题打卡第28天:省份数量---广度优先搜索

省份数量 难度:中等 有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。 省份 是一组直接或间接相连的城市,组内不…

BP神经网络PID控制从Simulink仿真到PLC控制实现(含博途PLC完整SCL源代码)

单神经元自适应PID控制博途PLC完整源代码,请参看下面的文章链接: 博途PLC单神经元自适应PID控制_RXXW_Dor的博客-CSDN博客_单神经元pid控制1、单神经元作为构成神经网络的基本单位,具有自学习和自适应能力,且结构简单易于计算,传统的PID具有结构简单、调整方便和参数整定…

数据结构 | 树和二叉树的基本概念和性质【考点精析】

树和二叉树🌳树🍃树的概念🍃树的相关概念🍃树的性质和常用公式总结 ⭐⭐⭐⭐⭐🍃树的表示🍃树在实际中的运用(表示文件系统的目录树结构)🌳二叉树🍃二叉树的概…

我与世界杯足球那些事——世界杯征文

征文活动链接: https://bbs.csdn.net/topics/609601920 目录 第一次了解世界杯 第一次观看世界杯 世界杯主题曲 我最热爱的球员 今年世界杯 预测冠军 第一次了解世界杯 提起世界杯,我可能了解的比较晚一些,是在2014年的巴西世界杯的时…

浏览器扩展课程Manifest V3升级版

大家好,经过一段时间的整理,我的《浏览器扩展插件开发》视频课程做了全新的升级。之前的课程也收到了很多反馈。因为Chrome浏览器扩展发布了最新的Manifest V3标准,简写MV3,也发布了新的路线图。2022年1月份开始不接受新的MV2版本…

人工智能CV应用现状与发展 - 讲座记录

简单介绍 ✅CV应用现状与发展前景如何? ✅算法工程师如何自我修炼? CV应用现状与发展前景如何? 模型训练好后,新增场景case,则需要再次进行模型训练。模型固化。 硬件部署,也固化,不同模型部署在不同硬件…

12.PGL图学习之项目实践(UniMP算法实现论文节点分类、新冠疫苗项目实战,助力疫情)[系列九]

原项目链接:https://aistudio.baidu.com/aistudio/projectdetail/5100049?contributionType1 1.图学习技术与应用 图是一个复杂世界的通用语言,社交网络中人与人之间的连接、蛋白质分子、推荐系统中用户与物品之间的连接等等,都可以使用图…

高并发场景下更新数据库报错,记录一次 MySQL 死锁问题的解决

今天隔壁项目组的开发小姐姐找到我,说她们项目正在做压力测试,更新 MySQL 数据库的一张表时,总是发生死锁,日志大概是这个样子的: org.springframework.dao.DeadlockLoserDataAccessException: ### Error updating d…

Java常用类(一)

目录 字符串相关的类 一、String String的特性 String不可变性的体现 String的实例化方式一:字面量的定义方式 String实例化方式二:通过new构造器的方式 字符串的特性 String使用陷阱 面试题 String的常用方法 ​编辑 String与基本数据类型转换 …

TFT-LCD LVGL官方例程的应用

TFT-LCD LVGL官方例程的应用 移植完lvgl的源码和驱动后,就可以试着调用lvgl的官方例程来运行了;例程的目录如下 官方demo是一些比较完整的界面,文件夹里面有.gif的动态图展示,而类型和小部件适合根据需要做一个自己喜欢的界面&am…

TensorRT--学习笔记

官方文档是最权威的TensorRT是可以在NVIDIA各种GPU硬件平台下运行的一个C推理框架。利用Pytorch、TF或者其他框架训练好的模型,可以转化为TensorRT的格式,然后利用TensorRT推理引擎去运行我们这个模型,从而提升这个模型在英伟达GPU上运行的速…

【学习笔记38】JavaScript中的本地存储

一、localStorage 浏览器的本地存储(永久存储), 打开浏览器存储上之后, 关闭浏览器, 信息还在语法:window.localStorage.setItem(key, value)注意: value的值必须为字符串key的书写符合见名知意 window.localStorage.setItem(ceshi1, 1111111);window.localStorage.…

16.预处理、动态库、静态库

C语言编译过程 1.预处理 将.c中的头文件展开、宏展开 生成的文件是.i文件 2.编译 将预处理之后的.i文件生成.s汇编文件 3.汇编 将.s汇编文件生成.o目标文件 4.链接 将.o文件链接成目标文件(可执行程序) Linux下GCC编译器编译过程 gcc -E hello.c -o he…

C++11标准模板(STL)- 算法(std::upper_bound)

定义于头文件 <algorithm> 算法库提供大量用途的函数&#xff08;例如查找、排序、计数、操作&#xff09;&#xff0c;它们在元素范围上操作。注意范围定义为 [first, last) &#xff0c;其中 last 指代要查询或修改的最后元素的后一个元素。 返回指向第一个大于给定值…

[附源码]Python计算机毕业设计钓鱼爱好者交流平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Java项目:电器商城系统(java+SSM+JSP+jQuery+javascript+Mysql)

源码获取&#xff1a;俺的博客首页 "资源" 里下载&#xff01; 项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 修改个人信息,员工信息管理,商品管理,图片管理,图表管理,用户…