操作系统内存地址映射

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

相关文章

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内存的系统级的调优主要的目的是减少

JVM 常见异常及内存诊断

栈内存溢出 栈内存大小设置:-Xss size 默认除了window以外的所有操作系统默认情况大小为 1MB,window 的默认大小依赖于虚拟机内存。 栈帧过多导致栈内存溢出 下述示例代码,由于递归深度没有限制且没有设置出口,每次方法的调用都会产生一个栈帧导致了创建的栈帧过多,而导致内存溢出(StackOverflowError)。 示例代码: 运行结果: 栈帧过大导致栈内存

理解java虚拟机内存收集

学习《深入理解Java虚拟机》时个人的理解笔记 1、为什么要去了解垃圾收集和内存回收技术? 当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就必须对这些“自动化”的技术实施必要的监控和调节。 2、“哲学三问”内存收集 what?when?how? 那些内存需要回收?什么时候回收?如何回收? 这是一个整体的问题,确定了什么状态的内存可以

NGINX轻松管理10万长连接 --- 基于2GB内存的CentOS 6.5 x86-64

转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=190176&id=4234854 一 前言 当管理大量连接时,特别是只有少量活跃连接,NGINX有比较好的CPU和RAM利用率,如今是多终端保持在线的时代,更能让NGINX发挥这个优点。本文做一个简单测试,NGINX在一个普通PC虚拟机上维护100k的HTTP

PHP原理之内存管理中难懂的几个点

PHP的内存管理, 分为俩大部分, 第一部分是PHP自身的内存管理, 这部分主要的内容就是引用计数, 写时复制, 等等面向应用的层面的管理. 而第二部分就是今天我要介绍的, zend_alloc中描写的关于PHP自身的内存管理, 包括它是如何管理可用内存, 如何分配内存等. 另外, 为什么要写这个呢, 因为之前并没有任何资料来介绍PHP内存管理中使用的策略, 数据结构, 或者算法. 而在我们

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。

PHP内存泄漏问题解析

内存泄漏 内存泄漏指的是在程序运行过程中申请了内存,但是在使用完成后没有及时释放的现象, 对于普通运行时间较短的程序来说可能问题不会那么明显,但是对于长时间运行的程序, 比如Web服务器,后台进程等就比较明显了,随着系统运行占用的内存会持续上升, 可能会因为占用内存过高而崩溃,或被系统杀掉 PHP的内存泄漏 PHP属于高级语言,语言级别并没有内存的概念,在使用过程中完全不需要主动申请或释放内