操作系统内存管理

操作系统之内存管理 内存的管理 一、单项选择题 1.2011年计算机联考真题】在虚拟内存管理中,地址变换机构将逻辑地址变换为物理地址,形成该逻辑地址的阶段是(C )。 A.编辑 B.编译 C.链接 D.装载 2.下面关于存储管理的叙述中正确的是( D)。 A.存储保护的目的是限制内存的分配 B.在内存为M,有N个用户的分时系统中,每个用户占用M/N的内存空间 C.在虚拟内存系统中,只要磁盘空间无限大,作业就能拥有任意大的编址空间 D.实现虚拟内存管理必须有相应硬件的支持 3.【2009年计算机联考真题】分区分配内存管理方 阅读详情

物理内存

Linux为了有效使用机器中的物理内存,在系统初始化阶段内存被划分成几个功能区域:


其中,Linux内核程序占据在物理内存的开始部分,接下来是供硬盘等块设备使用的高速缓冲区部分(其中要扣除显卡内存和ROM BIOS所占用的内存地址范围)

当一个进程需要读取块设备中的数据时,系统会首先把数据读到高速缓冲区中。当有数据需要写到块设备上去时,系统也是先将数据放到高速缓冲区中,然后由块设备驱动程序写到相应的设备上。

内存的最后部分是可供所有程序随时申请和使用的主内存区。内核在使用主内存区时,首先要向内核内存管理模块提出申请,并在申请成功后方能使用。

 

在Intel 80386及以后的CPU中提供了两种内存管理(地址变换)系统:内存分段系统和分页系统。其中分页管理系统是可选择的,由系统程序员通过编程来确定是否采用。Linux同时采用了分段和分页机制。

内存地址空间概念

在Linux内核中,在进行地址映射操作时,我们要分清3种地址的概念:进程的虚拟(逻辑)地址、CPU的线性地址、实际的物理地址。


虚拟地址

虚拟地址是指由程序产生的由段选择子和段内偏移地址两部分组成的地址。

(因为这两部分组成的地址并没有直接用来访问物理内存,而是需要通过分段地址变换机制或映射后才对应到物理内存地址上,故被称为虚拟地址。)

虚拟地址空间由GDT映射的全局地址空间和由LDT映射的局部地址空间组成。

【关于GDT和LDT,请移步-<CPU的实模式与保护模式>】

Intel 80x86 CPU可以索引16384个选择符。若每个段的长度都取最大值4GB,则最大虚拟地址空间范围是16384*4GB=64TB

CPU的内存管理给程序员提供了这样一个抽象的内存模型:


即程序员(无论是汇编的还是高级语言的)可以把内存分布看做是如上图所示,可以认为内存中只有自己的程序,自己独占CPU。

这是硬件和操作系统一起提供给程序员的简单抽象。

(底层的实现:地址变换、任务切换等对程序员是透明的)

逻辑地址是指由程序产生的与段相关的偏移地址部分。在Intel保护模式下即是指程序执行代码段限长内的偏移地址。

应用程序员仅需与逻辑地址打交道,而分段和分页机制对他来说完全透明的。(由加载器来设置分段)

Linux 0.12给每个进程都划分了容量为64MB的虚拟内存空间。因此出现的逻辑地址范围是0x0000000到0x4000000。(即设置一个LDT所管辖的范围为64MB)

(现在的操作系统给进程划定的虚拟内存是4GB,当然也可以更多。)

有些资料不区分逻辑地址和虚拟地址的概念,统称逻辑地址。

线性地址

线性地址是虚拟地址到物理地址变换之间的中间层,是CPU可寻址的内存空间中的地址。

程序代码会产生逻辑地址(或者说是段中的偏移地址),加上相应段的基地址就生成了一个线性地址。(一个段最大有4G的虚拟地址空间,在加载器把程序加载时,很容易选择一个空闲的段,填好GDT和LDT)

如果启用了分页机制,那么线性地址可以再经变换产生一个物理地址。若没有启用分页机制,那么线性地址直接就是物理地址。

Intel 80386的线性地址空间容量为4GB。

物理地址

物理地址是指出现在CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址。

内存分段机制

在实模式下,寻址一个内存地址主要是使用段基址和偏移值,段基址被存放在段寄存器中(如ds),并且段的长度被固定为64KB。段内偏移地址存放在任意一个可用于寻址的寄存器中(如si)。


在保护模式下,段寄存器中存放的不再是被寻址段的基地址,而是一个段描述符表中某一描述符项在表中的索引值。索引值指定的段描述符项中含有需要寻址的内存段的基地址、段的长度值、段的访问特权级等信息。(这样通过段描述符访问段中的信息,可检查安全性,则就是所谓的保护模式) 

这样,在保护模式下寻址一个内存地址就需要比实模式下多一个环节,即需要使用段描述符表。

注意,如果你不在一个段描述符中定义一个内存线性地址空间区域,那么该地址区域就完全不能被寻址,CPU将拒绝访问该地址区域。


保存描述符项的描述符表有3种类型,每种用于不同目的。

IDT中断描述符表(Interrupt Descriptor Table),该表保存了定义中断或异常处理过程的段描述符。IDT表直接替代了8086系统中的中断向量表。(使得在跳转到中断程序时也进行权限检查。)

GDT全局描述符表(Globle Descriptor Table),该表可被所有程序用于引用访问一个内存段。

LDT局部描述符表(Local Descriptor Table),通常每个任务使用一个LDT表。每个LDT表为对应任务提供了更多的可用描述符项,因为也为每个任务提供了可寻址内存空间的范围。 

这些表可以保存在线性地址空间的任何地方。为了让CPU能定位GDT表、IDT表和当前的LDT表,需要为CPU分别设置GDTR、IDTR和LDTR三个特殊寄存器。


可以看出,每个任务的局部描述符表LDT本身也是由GDT中描述符定义的一个内存段,在该段中存放着对应任务的代码段和数据段描述符,因此LDT段很短。同样,每个任务的任务状态段TSS也是由GDT中描述符定义的一个内存段。(TSS用于在任务切换时CPU自动保存或恢复相关任务的当前执行上下文)

内存分页管理

内存分页管理机制的基本原理是将CPU整个线性地址内存区域划分成4KB为1页的内存页面。程序申请使用内存时,系统就以内存页为单位进行分配。

为了在80x86保护模式下使用分页机制,需要把控制寄存器CR0的最高位置位。


对于Intel 80386系统,其CPU可以提供多达4GB的线性地址空间。

操作系统的内存管理(以下为一家之言,仅供参考)

有两套对内存管理的方式:

一、以Linux 0.12 内核为例(点我)
二、以Linux 2.x 内核为例(点我)

unity打包流程整理-Windows/Mac/Linux平台 1.Platform(平台)功能: 选择目标构建的目标平台选项PC, Mac & Linux Standalone: 适用于 Windows、Mac 和 Linux 平台2.Target Platform(目标平台)功能: 选择具体的操作系统版本选项Windows: 针对 Windows 操作系统Mac: 针对 macOS 操作系统Linux: 针对 Linux 操作系统3.Architecture(架构)功能: 选择应用程序的目标处理器架构选项x86: 针对 32 位系统。 阅读详情

相关推荐

【上海大学计算机组成原理实验报告】七、程序转移机制

学习实现程序转移的硬件机制//掌握堆栈寄存器的使用//手动方式实现子程序调用转移过程//手动方式实现子程序返回转移过程//编程实现`OUT`寄存器交替显示`11`和`55`//若要求`11`和`55`各显示`50`次后停机,应该如何修改程序?//根据实验指导书的相关内容,实验箱系统的程序转移硬件机制在于,当`LDPC`有效时,如果此时`DUBS`上的值就是转移的目标地址,则此目标地址被打入`PC`,从而实现程序的转移;若`LDPC`为`0`是附带条件的,就形成“条件转移”。

HackerKevon的博客 2473

操作系统_内存管理(一)

12 位,页号部分为 20 位,若不采用分级页表,则仅页表就要占用 220x4B/4KB = 1024 页,这大大超过了许多进程自身需要的页面,对于内存来说是非常浪费资源的,而且查询页表工作也会变得十分不便、试想若把这些页表放在连续的空间内,查询对应页的物理页号时可以通过页表首页地址+页号x4B的形式得到,而这种方法查询起来虽然相对方便,但连续的1024 页对于内存的要求实在太高,并且上面也说到了其中大多数页面都是不会用到的,所以这种方法并不具有可行性。下图是一个进程在内存中的映像。

light_2025的博客 1897

手把手教你用UC3842搭建12V/5A反激电源(附PSIM仿真文件)

本文详细介绍了基于UC3842的12V/5A反激电源设计与PSIM仿真实践。从UC3842芯片选型、高频变压器计算到PSIM仿真模型搭建,提供完整的开关电源设计流程。特别包含PCB布局要点和实测优化建议,帮助工程师快速掌握反激电源开发技巧。

u6v7w8x的博客 1203

Windows管理内存的3种方式——堆、虚拟内存、共享内存

本文主要介绍了Windows管理内存的3种方式——堆、虚拟内存、共享内存

Tandy12356_的博客 5750

软件设计师高频考点—套路题

学习交流的总结

秩沅 2539

DDR5 输入时钟抖动规范全解析!技术宅必看

简单说,时钟抖动就是时钟信号边沿的“颤抖”——信号本来应该在某个固定时间跳变,但实际时刻可能会前后波动。这种波动可能是随机的,也可能是确定性的。随机抖动(Random Jitter, Rj):符合高斯分布,像是你家猫咪不经意的晃动。确定性抖动(Deterministic Jitter, Dj):受限于特定周期或模式,像是邻居装修时的规律敲击声。⚠️ 注意,如果时钟抖动超出规格,DDR5可能无法正确接收或发送数据,内存错误、系统崩溃可就跟着来了!

weixin_43199439的博客 391

【学习总结】操作系统(内存布局)

内存如何布局

王同学的博客 2041

Unity 之jenkins自动打包

1.Jenkins 是什么? jenkins官方网址:https://www.jenkins.io/zh/ Jenkins是一款开源 CI&CD(持续集成&持续部署) 软件,用于自动化各种任务,包括构建、测试和部署软件。 简易安装:Jenkins 是一个基于 Java 的独立程序,可以立即运行,包含 Windows、Mac OS X 和其他类 Unix 操作系统。Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。 插件扩展:通过更新中心中的

TxNet 2132

Windows操作系统存储管理——实存管理和虚存管理

Windows操作系统存储管理——实存管理和虚存管理

荔园微风的博客 2983

【Python_PySide6学习笔记(二十四)】菜单栏QMenuBar类的基本用法

此篇文章中介绍 PySide6 中 QMenuBar 类的基本用法,包括"创建菜单栏"、"创建一级菜单"、"创建二级菜单"等,会持续更新,有需要的读者可以点赞收藏,也欢迎在评论区进行讨论。

禾戊之昂的博客 1624

循环神经网络(RNN)原理及BPTT算法

因循环神经网络基于ANN之上,理解ANN有助于理解RNN,所以阅读此文,建议先阅读。

L 1768

操作系统-内存管理

内存抖动通常发生在系统内存不足时,导致操作系统频繁地将页面从物理内存中换出到磁盘(页面置换),而后又需要将其重新调入内存,这样频繁的置换操作会消耗大量的计算资源和时间,影响系统的性能。通常,操作系统会被加载到计算机的物理内存中,并占用一定的地址空间。通过这种方式,双向链表可以根据页面的访问顺序进行排序,最近访问的页面始终位于链表的头部,而最久未使用的页面位于链表的尾部。内存管理是操作系统中一个非常重要的功能,它主要负责管理计算机系统中的内存资源,包括内存的分配、回收、保护和共享等。

captain 3080

数学建模之0—1规划(Python)

目录 1、概述 (1)知识框架 (2)线性整数规划模型 (3)分支定界法 2、案例 (1)案例1​ (2)案例2 3、遗传算法—sko-GA包实现 (1)代码 (2)结果 4、PuLp实现 (1)代码 (2)结果 5、致谢 1、概述 (1)知识框架 (2)线性整数规划模型 (3)分支定界法 2、案例 (1)案例1 (2)案例2 3、遗传算法—sko-GA包...

weixin_46039719的博客 4112

操作系统之内存管理详解

1 内存管理概念 1.1 基本原理和要求 内存管理: 操作系统对内存的划分和动态分配 内存管理的功能有: 内存空间的分配与回收 由操作系统完成主存储器空间的分配和管理,使程序员摆脱存储分配的麻烦,提高编程效率。 地址转换 在多道程序环境下,程序中的逻辑地址与内存中的物理地址不可能一致因此存储管理必须提供地址变换功能,把逻辑地址转换成相应的物理地址。 内存空间的扩充 利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存 存储保护 保证各道作业在各自的存储空间内运行,互不干扰 程序的装

weixin_46640184的博客 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

操作系统的内存管理

操作系统内存管理:总的来说,操作系统内存管理包括物理内存管理和虚拟内存管理 物理内存管理: 包括程序装入等概念、交换技术、连续分配管理方式和非连续分配管理方式(分页、分段、段页式) 虚拟内存管理: 虚拟内存管理包括虚拟内存概念、请求分页管理方式、页面置换算法、页面分配策略、工作集和抖动。 一、 计算机的存储体系 内存是计算机很重要的一个资源,因为程序只有被加载到内存中才可以运行;此外,CPU所需要的指令与数据也都是来自内存的。可以说,内存是影响计算机性能的一个很重要的因素 分层存储器体系 在介绍内存管理的细

qq_40813329的博客 3178

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【操作系统内存管理】

内存管理是操作系统中的核心功能之一,它负责为进程分配和回收内存,同时提供内存保护与共享机制。本文将介绍内存管理的主要内容,包括内存分配、内存保护、地址映射、分页与分段机制,以及虚拟内存等内容。

武帝为此的博客 925

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

操作系统——内存管理策略

解决方法是采用两层分页算法,即将页表再分页,具体过程是:每个页面大小与内存物理块大小相同,并为它们进行编号,可以离散地将各个页面分别存放在不同物理块中,为此再建立一张页表,称为外层页表(页表目录),即第一级页表,其中的每个表目是存放某个页表的物理地址。若有,则可分配给新进程。交换时间的主要部分是转移时间,总的转移时间直接同交换的内存的数量成比例,例如用户进程大小为100MB,并且备份存储是传输速度为50MB/s的标准硬盘,则100MB进程传入或传出内存的时间为2s,总交换时间为4s(忽略磁盘性能问题)。

天問*的后花园 884

操作系统内存管理_图解操作系统知识总结之内存管理

点击上方“五分钟学算法”,选择“星标”公众号重磅干货,第一时间送达转自小林coding前言之前有不少读者跟我反馈,能不能写图解操作系统?既然那么多读者想看,我最近就在疯狂的复习操作系统的知识。操作系统确实是比较难啃的一门课,至少我认为比计算机网络难太多了,但它的重要性就不用我多说了。学操作系统的时候,主要痛苦的地方,有太多的抽象难以理解的词语或概念,非常容易被劝退。即使怀着满腔热血的心情...

weixin_39860975的博客 166

操作系统——内存管理(一文搞懂操作系统的内存管理)

操作系统——内存管理(一文搞懂操作系统的内存管理)

xdx_dili的博客 1万+

【操作系统】内存管理

期待您的一键三连!欢迎指正!

Guiat的博客 1147

操作系统——内存管理篇

快表,又称联想寄存器(TLB,translation lookaside buffer),是一种访问速度比内存快很多的高速缓存(TLB不是内存!),用来存放最近访问的页表项的副本,可以加速地址变换的速度。与此对应,内存中的页表常称为慢表。基于局部性原理,在程序装入时,可以将程序中很快会用到的部分装入内存,暂时用不到的部分留在外存,就可以让程序开始执行在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。

m0_63596031的博客 1139

操作系统:内存管理

操作系统:内存管理

xike1024的博客 1882

万字长文!非常详细!操作系统【内存管理】

推荐关注博主!随时获取更多关于操作系统的最新技术分享!

m0_51574586的博客 7081
上一篇: 操作系统对内存的管理
下一篇: Linux 2.x 内核对内存的管理
coo1fish
博客等级 码龄14年 22粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值