操作系统内存地址映射

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个重定位地址寄存器

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

这里写图片描述

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


原文地址:https://blog.csdn.net/ZCMUCZX/article/details/80252101
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/155665

相关文章

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

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

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