操作系统内存地址映射

2023-10-07 03:10

本文主要是介绍操作系统内存地址映射,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

内存管理的机制

这里主要是做个知识点的记录,方便以后查看

内存是现代计算机的运行的中心,内存是由很大的一组字或者是字节组成的,每个字或者是字节都是有它们自己的地址,以及CPU会根据程序计数器(PC)的值从内存中提取指令,这些指令可能会引起进一步对特定内存地址的读取和写入

在一个典型的指令执行周期当中,首先会从内存中去读取指令。接着这个指令被解码,以及可能需要从内存中读取操作数,在指令对操作数执行之后,其的结果可能被存到内存中

需要注意的是CPU能直接访问的存储器只有内存和处理器内的寄存器,机器指令可以用内存地址作为参数,但是不能用磁盘的地址作为参数,所以其实CPU在执行指令的时候一定要保证所要用的数据在CPU可以直接访问的存储设备当中

CPU的内置寄存器通常可以在一个CPU的时钟周期当中完成访问,对于寄存器当中的内容,绝大多数CPU可以在一个时钟周期内去解析并且去执行一个或者是多个指令,但是对于内存的访问则是可能需要多个CPU的时钟周期,而CPU执行有些指令的时候是需要数据的,如果没有数据的话有些指令就执行不了,所以CPU的效率就会受到影响,所以为了解决内存访问频繁的情况,解决方法就是在CPU和内存之间去增加高速内存,这种协调速度差异的内存的缓冲区被称为是高速缓存

我们除了去保证访问物理内存的相对的速度之外,我们还要确保操作系统所在的内存空间不被用户的进程所访问,以及确保用户进程不被其他用户进程访问,这种保护可以通过硬件来实现,方法有多种,这里就介绍一种可能的情况

为了确保每个进程都有独立的内存空间,所以我们需要去确定进程可访问的合法地址的范围,并且确保进程只访问其的合法地址,我们可以通过两个寄存器拿来当做基地址寄存器以及界限地址寄存器,基地址寄存器当中包含最小的合法物理内存地址,界限地址寄存器决定了范围的大小,就比如说如果基地址寄存器中是3000,界限地址寄存器中是1000,那么程序可以访问的内存地址范围就为3000-4000。这种内存空间的保护是通过CPU硬件对用户模式所产生的每一个地址与寄存器的地址进行比较来完成的,如果说用户模式下要去访问操作系统的内存和其他用户进程的内存就会报错

关于内存地址的访问范围
这里写图片描述

在上述的保护模式下,只有操作系统可以通过特殊的特权指令去加载基地址寄存器和界限地址寄存器,所以用户进程是无法改变的,只有操作系统可以去修改基地址寄存器和界限地址寄存器的值,操作系统在内核模式下执行,可以无限制的去访问操作系统和用户的内存,所以操作系统可以将用户程序装入用户内存,在出错的时候输出这些程序,访问并修改系统调用的参数等

通常情况下,程序以二进制可执行文件的形式存储在磁盘上,为了执行,程序被调入内存并放在进程空间内。根据所使用的内存管理方案,进程在执行时可以在磁盘和内存之间进行移动,在磁盘上等待调入内存以便执行的进程形成输入队列

一般来说用户程序在执行前,需要经过好几个步骤(如下图所示),其中有些是可选的,在这些步骤当中地址可能有不同的表示形式,源程序中的地址

这里写图片描述

通常我们将指令和数据绑定到内存地址有以下的几种情况

  • 编译时:如果在编译的时候就知道进程将在内存当中的驻留地址,那么就可以生成绝对的代码,比如说我们事先就知道用户进程驻留在内存地址1000,那么所生成的编译的代码就可以从该位置开始往后扩展
  • 加载的时候,如果编译的时候并不知道进程将驻留在内存的什么地方,那么编译器就必须去生成可重定位的代码,对于这种情况的话,由于源程序中的地址通常是用符号来表示的(比如a),这样的话编译器通常会将这些符号地址绑定在可重定位的地址(比如说从本模块开始的第14个字节),然后加载程序再将这些可重定位的地址去绑定成绝对地址
  • 执行时,如果进程在执行时可以从一个内存段转移到另一个内存段,那么绑定就必须延迟到执行时才会进行,这个绑定就是指的是绑定成绝对的地址,采用这种方案是需要特定的硬件的,绝大多数通用计算机操作系统采用这种方法

逻辑地址空间与物理地址空间

CPU生成的地址通常称为逻辑地址,而加载到内存地址寄存器的被称为物理地址,运行时从虚拟地址到物理地址的映射是被称为内存管理单元的硬件设备来完成的

从虚拟地址到物理地址的映射我们可以通过去使用重定位寄存器,就是说用户进程所生成的地址在递交内存之前,都会加上重定位寄存器的值,就比如说如果说重定位寄存器当中的值为14000,然后我们用户对用户进程位置0的访问就会动态地重定位为14000,对地址346的访问就会将其映射为14345,运行于Intel 80x86系列的CPU的MS-DOS操作系统在加载和运行进程的时候,就可以使用4个重定位地址寄存器

内存管理单元利用重定位寄存器做的地址映射

这里写图片描述

这篇关于操作系统内存地址映射的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/155665

相关文章

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

五大特性引领创新! 深度操作系统 deepin 25 Preview预览版发布

《五大特性引领创新!深度操作系统deepin25Preview预览版发布》今日,深度操作系统正式推出deepin25Preview版本,该版本集成了五大核心特性:磐石系统、全新DDE、Tr... 深度操作系统今日发布了 deepin 25 Preview,新版本囊括五大特性:磐石系统、全新 DDE、Tree

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

Linux操作系统 初识

在认识操作系统之前,我们首先来了解一下计算机的发展: 计算机的发展 世界上第一台计算机名叫埃尼阿克,诞生在1945年2月14日,用于军事用途。 后来因为计算机的优势和潜力巨大,计算机开始飞速发展,并产生了一个当时一直有效的定律:摩尔定律--当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。 那么相应的,计算机就会变得越来越快,越来越小型化。

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

JVM内存调优原则及几种JVM内存调优方法

JVM内存调优原则及几种JVM内存调优方法 1、堆大小设置。 2、回收器选择。   1、在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。   2、对JVM内存的系统级的调优主要的目的是减少