操作系统 3.1-内存使用和分段
如何简单使用内存

这张幻灯片展示了计算机如何开始执行程序的基本过程,涉及到存储器、指令寄存器(IR)、运算器和控制器等计算机组件。
-
存储器:程序被加载到内存中。图中显示了一个指令
mov ax, [100],它的作用是将内存地址100处的值移动到寄存器ax中。内存地址100处的值是0。 -
指令寄存器(IR):指令从内存中取出后,被放入指令寄存器(IR)中,然后由运算器和控制器解析并执行。
-
运算器和控制器:这些组件负责解析指令并执行相应的操作。在这个例子中,指令被解析后,将内存地址100处的值(0)移动到寄存器ax中。
-
程序执行:幻灯片下方展示了一个C语言程序的例子,该程序定义了一个
main函数,其中包含了一些变量和对atoi函数的调用。程序的输出显示了不同的输入(如sum 12345)和相应的结果(如76205685)。 -
内存使用:内存的使用方式:将程序放到内存中,程序计数器(PC)指向开始地址。这意味着程序的执行是从内存中的某个特定地址开始的,这个地址由PC指示。
内存使用
程序放入内存

这张幻灯片讨论了程序如何被加载到内存中,以及程序计数器(IP)如何指向程序的入口地址。幻灯片中展示了两种不同的内存布局方式,以及它们对程序执行的影响。
-
程序结构:
-
程序包含一个
main函数,以及一些其他函数如call_xx和call_40。 -
.text段包含了程序的代码和入口点_entry。
-
-
内存布局:
-
第一种布局(左上角):
-
_entry是程序的入口地址。 -
call_main和call_exit是调用main函数和其他函数的指令。 -
_main函数的偏移量是40。
-
-
第二种布局(右下角):
-
_entry仍然是程序的入口地址,但是_main函数的偏移量变成了1040。
-
-
-
程序计数器(IP):
-
IP指向程序的入口地址,即
_entry。 -
在第一种布局中,IP正确地指向了
_entry,程序可以正常执行。 -
在第二种布局中,如果IP仍然指向
_entry,那么call 40指令将尝试调用一个不存在的地址,导致程序错误。
-
-
问题:
-
幻灯片右侧的问题指出,虽然内存可以使用了,但是存在一个问题,即在第二种布局中,调用指令没有正确地考虑
_main函数的实际偏移量,导致程序可能无法正确执行。
-
重定位

重定位的概念
重定位是指修改程序中的地址,使其适应内存中的不同位置。这些地址通常是相对地址,即相对于程序在内存中的起始位置的偏移量。
编译时重定位
-
定义:在编译时完成重定位,即在编译过程中就确定了程序在内存中的绝对地址。
-
特点:
-
程序只能在内存的固定位置运行。
-
优点是加载速度快,因为不需要在加载时进行地址调整。
-
缺点是缺乏灵活性,因为程序不能被加载到任意内存位置。
-
载入时重定位
-
定义:在程序加载到内存时完成重定位,即在加载过程中根据实际的内存地址调整程序中的相对地址。
-
特点:
-
程序可以被加载到内存的任意位置。
-
优点是灵活性高,因为程序可以适应不同的内存布局。
-
缺点是加载速度可能较慢,因为需要在加载时进行地址调整。
-
图示解释
-
左侧图示:显示了编译时重定位的错误示例,其中
call 40指令指向了错误的地址(1000),导致程序无法正确执行。 -
右侧图示:显示了载入时重定位的正确示例,其中
call 1040指令正确地指向了新的地址(1040),确保程序可以正确执行。
运行时重定位

运行时重定位是在程序执行过程中,每执行一条指令时才完成地址的重定位。这种方法允许程序在内存中的加载位置更加灵活,因为程序中的逻辑地址可以在运行时被转换为物理地址。
图示解释
幻灯片中的图示展示了运行时重定位的过程:
-
逻辑地址:程序中的地址是相对于某个基地址的偏移量(offset),例如
_sum: .int 0和_main: mov [300], 0。 -
基地址(base):每个进程都有一个基地址,这是进程在内存中的起始地址。
-
物理地址:通过将逻辑地址与基地址相加,得到实际的物理内存地址。
进程控制块(PCB)
-
基地址存储:PCB中存储了进程的基地址,这是运行时重定位的关键信息。
-
地址翻译:在执行指令时,操作系统首先从PCB中取出进程的基地址,然后根据指令中的逻辑地址计算出物理地址。
运行时重定位的步骤
-
取出基地址:从PCB中取出进程的基地址。
-
地址翻译:将逻辑地址与基地址相加,得到物理地址。
-
执行指令:使用物理地址访问内存,执行指令。
交换

交换(Swap)的概念
交换是操作系统用来管理内存的一种技术,它涉及将暂时不活跃的进程从内存移动到磁盘上,以便为其他进程腾出内存空间。当需要再次运行被交换出去的进程时,操作系统会将其从磁盘重新加载到内存中。
可重定位性的重要性
幻灯片中提到“程序1仍应该是可重定位的”,这意味着程序在被加载到内存中时,其地址可以被动态调整以适应内存中的不同位置。这对于交换过程至关重要,因为:
-
当进程被从磁盘重新加载到内存时,它可能被放置在与之前不同的内存位置。
-
当一个进程被重新换入内存时,由于之前占据的内存空间可能已不再可用,因此需要进行运行时重定位,确保进程的地址在内存中被正确更新,以便能够根据当前内存地址找到相应的数据或指令,从而保证进程的正常执行。
总结-内存使用的详细过程

-
创建进程和PCB:
-
为了执行程序,操作系统需要创建一个进程,并为该进程创建一个进程控制块(PCB)。
-
PCB中存储了进程的状态信息,包括程序的基地址。
-
-
在内存中找到空闲区域:
-
操作系统在内存中寻找一个足够大的空闲区域来加载程序。
-
找到的空闲区域的起始地址被设置为程序的基地址。
-
-
加载程序:
-
程序被加载到内存中找到的空闲区域。
-
程序中的逻辑地址需要根据基地址进行调整,以确保程序可以正确执行。
-
-
执行程序:
-
程序开始执行,每次执行指令时,都需要进行地址翻译,将逻辑地址转换为物理地址。
-
地址翻译涉及到基地址和偏移量的计算。
-
-
进程切换和内存管理:
-
在多任务操作系统中,进程可能会被切换出去,释放内存,或者被换入,重新加载到内存中。
-
运行时重定位允许进程在内存中移动,而不影响其执行。
-
分段
程序员眼中的程序

-
程序的组成:
-
程序由若干个部分(段)组成,每个段具有不同的特点和用途。
-
例如,代码段是只读的,而数据段可能会动态增长。
-
-
程序的分段案例:
-
主程序(main):程序的入口点,通常包含程序的主要逻辑。
-
变量集(data):存储程序中使用的变量。
-
函数库(如sin):程序可能调用的函数集合,例如数学函数库。
-
动态数组(array):程序中动态分配的数组,其大小可能在运行时改变。
-
栈(stack):用于存储函数调用时的局部变量和返回地址,通常具有后进先出(LIFO)的特性。
-
-
分段的优点:
-
符合用户观点:用户可以独立考虑每个段,这有助于分治和模块化编程。
-
独立管理:每个段可以独立地加载、卸载和保护,提高了程序的安全性和稳定性。
-
-
地址定位:
-
程序中的指令和数据可以通过段号和段内偏移来定位。
-
例如,
mov [es:bx], ax指令中,es表示段寄存器,bx表示段内偏移。
-
程序的分段存储
-
内存布局:
-
程序在内存中被分为多个段,每个段从0开始,以便于管理和访问。
-
这种布局方式简化了内存管理,因为每个段可以独立地加载到内存中的任何位置。
-
-
段表:
-
操作系统维护一个段表,记录每个段的基地址和其他属性。
-
在进程切换时,操作系统会更新段表,以反映当前进程的内存布局。
-
-
地址翻译:
-
当程序访问内存时,操作系统使用段表将逻辑地址转换为物理地址。
-
程序分段如何放入内存

程序分段放入内存
-
分段存储:
-
程序不是作为一个整体被加载到内存中,而是将其分为多个段,每个段独立加载到内存的不同位置。
-
图中显示了四个段(0, 1, 2, 3),它们被加载到内存中的不同区域。
-
-
内存布局:
-
内存被划分为多个区域,每个区域存储程序的一个段。
-
比如图中案例,段0被加载到内存的180K位置,段1被加载到360K位置,段2被加载到70K位置,段3被加载到460K位置。
-
运行时重定位
-
指令示例:
-
mov [DS:100], %eax:这条指令表示将寄存器eax的值移动到数据段(DS)偏移100的位置。 -
jmp 100, CS:这条指令表示跳转到代码段(CS)偏移100的位置。
-
-
段表:
-
段表列出了每个段的基址、长度和保护属性。
-
例如,段0的基址是180K,长度是150K,保护属性是只读(R)。
-
-
地址计算:
-
运行时重定位涉及将逻辑地址转换为物理地址。
-
逻辑地址由段号和段内偏移组成。物理地址通过将段基址与偏移相加得到。
-
示例计算
-
假设DS=1,CS=0:
-
对于
mov [DS:100], %eax,如果DS=1,则物理地址为段1的基址(360K)加上偏移100,即360K+100=360100。 -
对于
jmp 100, CS,如果CS=0,则物理地址为段0的基址(180K)加上偏移100,即180K+100=180100。
-
-
jmp 500K的重定位:-
如果直接跳转到物理地址500K,需要确定500K属于哪个段,然后使用该段的基址和偏移进行跳转。
-
GDT和LDT的在内存使用的作用

在x86架构的操作系统中,GDT(全局描述符表)和LDT(局部描述符表)是用于内存管理和段式内存保护的关键数据结构。它们在内存使用和地址转换中扮演着重要角色。以下是对GDT和LDT作用的分析:
GDT(全局描述符表)
-
全局性:GDT是全局的,意味着它对系统中的所有进程都是可见的。它包含了操作系统内核和所有用户进程共享的段描述符。
-
内核空间:GDT通常包含了内核代码段和数据段的描述符,这些段描述符定义了内核的内存布局。
LDT(局部描述符表)
-
用户空间:LDT通常包含了用户进程的代码段、数据段、堆栈段等描述符,这些描述符定义了用户空间的内存布局。
地址转换过程
-
段选择子:在x86体系结构中,段选择子(如CS、DS、SS等)包含了段号,用于在GDT或LDT中索引对应的段描述符。
-
GDT和LDT的查找:当一个进程执行时,其段选择子中的段号首先在GDT中查找。如果该段号对应的描述符的局部描述符表(LDT)有效位被设置,则在该进程的LDT中查找对应的段描述符。
-
基地址计算:一旦找到段描述符,CPU会使用该描述符中的基地址和段内偏移来计算物理地址。
-
内存访问控制:段描述符中的段限长和访问权限位用于控制内存访问,确保进程不能访问不属于它的内存区域。

相关文章:
操作系统 3.1-内存使用和分段
如何简单使用内存 这张幻灯片展示了计算机如何开始执行程序的基本过程,涉及到存储器、指令寄存器(IR)、运算器和控制器等计算机组件。 存储器:程序被加载到内存中。图中显示了一个指令 mov ax, [100],它的作用是将内存…...
禅道MCP Server开发实践与功能全解析
一、简介 1、MCP Server核心定义 MCP Server(Meta Command Protocol Server)是一种基于客户端-服务器架构的轻量级服务程序,采用统一的mcp协议格式,通过连接多样化数据源和工具为AI应用提供扩展能力。它作为中间层,实…...
Spring Boot 3.5新特性解析:自动配置再升级,微服务开发更高效
📝 摘要 Spring Boot 3.5作为Spring生态的最新版本,带来了多项令人振奋的改进。本文将深入解析其中最核心的自动配置增强特性,以及它们如何显著提升微服务开发效率。通过详细的代码示例和通俗易懂的讲解,您将全面了解这些新特性在…...
GNSS静态数据处理
1 安装数据处理软件:仪器之星(InStar )和 Trimble Business Center 做完控制点静态后,我们需要下载GNSS数据,对静态数据进行处理。在处理之前需要将相关软件在自己电脑上安装好: 仪器之星(InS…...
java家政APP源码,家政预约平台源码,家电上门维修、家电上门清洗
家政上门预约服务APP源码,开发功能涵盖了用户注册与登录、家政服务分类与选择、预约管理、支付与交易、地图与导航、评价与反馈、个人信息管理、消息通知、营销工具以及数据分析等多个方面。这些功能的实现不仅提高了家政服务的便捷性和效率,还为用户提供…...
LangGraph 架构详解
核心架构组件 LangGraph 的架构建立在一个灵活的基于图的系统上,使开发者能够定义和执行复杂的工作流。以下是主要架构组件: 1. 状态管理系统 LangGraph 的核心是其强大的状态管理系统,它允许应用程序在整个执行过程中维护一致的状态&…...
【LLM基础】Megatron-LM相关知识(主要是张量并行机制)
系列综述: 💞目的:本系列是个人整理为了Megatron-LM的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于Megatron-LM相关材料进行的,每个知识点的修正和深入…...
动力电池自动点焊机:新能源汽车制造的智能焊接利器
在新能源汽车产业蓬勃发展的今天,动力电池作为其核心部件,其性能与安全性直接关系到整车的续航里程和使用寿命。而动力电池的制造过程中,焊接工艺是至关重要的一环。这时,动力电池自动点焊机便以其高效、精准、智能的特点…...
解决vcpkg使用VS2022报错问题
转自个人博客:解决vcpkg使用VS2022报错问题 最近,在把Visual Studio2019完全更新到最新Visual Studio2022后,原使用的vcpkg无法正常安装包,会报如下与Visual Studio 2022相关的错误: error: in triplet x64-windows-m…...
Next.js 简介
Next.js 是一个由 Vercel 开发的基于 React 的 Web 开发框架,旨在简化 React 应用的开发流程,提供更好的性能和开发体验。 🌟 Next.js 的核心特点 1. 文件系统路由(File-system Routing) 在 pages/ 目录中创建文件就…...
一文详解ffmpeg环境搭建:Ubuntu系统ffmpeg配置nvidia硬件加速
在Ubuntu系统下安装FFmpeg有多种方式,其中最常用的是通过apt-get命令和源码编译安装。本文将分别介绍这两种方式,并提供安装过程。 一、apt-get安装 使用apt-get命令安装FFmpeg是最简单快捷的方式,只需要在终端中输入以下命令即可: # 更新软件包列表 sudo apt-get updat…...
MySQL逻辑架构有什么?
1. MySQL逻辑架构分层 MySQL的逻辑架构可分为三层(自上而下): 连接层(Client Layer)服务层(Server Layer)存储引擎层(Storage Engine Layer) -----------------------…...
AI应用企业研发方案
一、引言 在当今数字化时代,人工智能(AI)技术正以前所未有的速度融入各个行业,推动着企业的创新与变革。对于医药流通行业批发公司而言,面对日益激烈的市场竞争和不断变化的客户需求,借助AI技术提升企业的…...
【15】Strongswan watcher详解2
watcher的核心业务函数watch: (1)如果count为0,没有要监听的句柄,则watcher状态设置为WATCHER_STOPPED,返回,返回值为JOB_REQUEUE_NONE,这会返回到“【11】Strongswan processor 详解…...
linux shell编程之条件语句(二)
目录 一. 条件测试操作 1. 文件测试 2. 整数值比较 3. 字符串比较 4. 逻辑测试 二. if 条件语句 1. if 语句的结构 (1) 单分支 if 语句 (2) 双分支 if 语句 (3) 多分支 if 语句 2. if 语句应用示例 (1) 单分支 if 语句应用 (2) 双分支 if 语句应用 (3) 多分支 …...
uniapp uni-collapse动态切换数据时高度不能自适应
需单独调用方法更新 this.$nextTick(() > {if (this.$refs.collapseBox) {this.$refs.collapseBox.resize()} })...
递归?递推?
前言:递归、递推是两种非常常见基础的算法了,但我之前忘了从这基础的先讲起了,大家应该也都略有了解吧!今天突然想写点相关延伸内容,所以还是完整介绍一些吧 递归 递归是一种通过函数调用自身解决问题的算法。在递归…...
蓝桥杯--结束
冲刺题单 基础 一、简单模拟(循环数组日期进制) (一)日期模拟 知识点 1.把月份写为数组,二月默认为28天。 2.写一个判断闰年的方法,然后循环年份的时候判断并更新二月的天数 3.对于星期数的计算&#…...
【ChCore Lab 01】Bomb Lab 拆炸弹实验(ARM汇编逆向工程)
文章目录 1. 前言2. 实验代码版本问题3. 关于使用问题4. 宏观分析5. read_line 函数介绍6. phase_0 函数6.1. read_int 函数6.2. 回到 phase_0 函数继续分析6.3. 验证结果 7. phase_1 函数7.2. 验证结果 8. phase_2 函数8.1. read_8_numbers 函数8.2. 回到 phase_2 函数继续分析…...
Android-应用签名
1 需求 Android 支持以下三种应用签名方案: v1 方案:基于 JAR 签名。v2 方案:APK 签名方案 v2(在 Android 7.0 中引入)。v3 方案:APK 签名方案 v3(在 Android 9 中引入)。v4 方案&…...
二分答案----
二分答案 - 题目详情 - HydroOJ 问题描述 给定一个由n个数构成的序列a,你可以进行k次操作,每次操作可以选择一个数字,将其1,问k次操作以后,希望序列里面的最小值最大。问这个值是多少。 输入格式 第一行输入两个正…...
AI前沿周报:2025年3月技术深度解析
以下是基于2024-2025年AI技术前沿动态的深度技术周报示例,结合行业最新突破与研究进展,突出技术原理与应用场景分析: AI前沿周报:2025年3月技术深度解析 时间范围:2025年3月1日-3月31日 本期焦点:模型透明…...
Android Coil 3默认P3色域图加载/显示不出来
Android Coil 3默认P3色域图加载/显示不出来 解决,需要在Androidmanifest.xml使用Coil 3的activity配置属性: <activityandroid:colorMode"wideColorGamut"...</activity>...
Linux 系统管理常用命令
以下是 Linux 系统管理常用命令 的详细介绍,涵盖 IP地址查看、端口管理、进程监控 等核心操作,并附上实际示例: 一、查看网卡 IP 地址 1. 使用 ip 命令 # 查看所有网络接口信息(包括 IP 地址) ip addr show# 查看特定…...
Transformer多卡训练初始化分布式环境:(backend=‘nccl‘)
Transformer多卡训练初始化分布式环境:(backend=‘nccl’) dist.init_process_group(backend=nccl)在多卡环境下初始化分布式训练环境,并为每个进程分配对应的 GPU 设备。下面为你逐行解释代码的含义: 1. 初始化分布式进程组 try:dist.init_process_group(backend=nccl) e…...
Kubernetes集群环境搭建与初始化
1.Kubernetes简介: Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。 在Kubernetes中,我…...
Jetson AGX Xavier开发套件使用方法
Jetson AGX Xavier是一款由NVIDIA推出的一款强大的嵌入式AI开发平台,适合边缘计算和目标检测任务。如果你手上有一台 Jetson AGX Xavier Developer Kit,就可以使用它进行明火烟雾目标检测实验。以此为例,为了使你能够从零开始设置设备并完成实…...
erlang的安装-linux
1:解压 tar -zxvf 安装包 2:进入解压的目录执行: ./configure --prefix/usr/local/erlang --with-ssl --enable-threads --enable-smp-support --enable-kernel-poll --enable-hipe --without-javac 3:编译安装: m…...
Windows 图形显示驱动开发-WDDM 1.2功能_WDDM 1.2 和 Windows 8
简介 WDDM 是随 Windows Vista 一起引入的,以取代 Windows XP 或 Windows 2000 显示驱动程序模型 (XDDM) 。 随着 Windows Vista 中的引入,WDDM 体系结构提供了启用新功能的功能,例如桌面组合、增强的容错、视频内存管理器、GPU 计划程序、D…...
数据可视化 —— 多边图应用(大全)
一、介绍: 多边形图,也就是在数据可视化中使用多边形来呈现数据的图表,在多个领域都有广泛的应用场景,以下为你详细介绍: 金融领域 投资组合分析:在投资组合管理中,多边形图可用于展示不同资…...
