操作系统储存管理功能

操作系统的存储管理功能分为四个部分

  • 地址映射
  • 虚拟储存
  • 内存分配
  • 储存保护

一:地址映射

1. 固定地址映射

在编程或编译确定逻辑地址和物理地址的映射关系
特点:程序加载时必须放在指定的内存区域
容易产生地址冲突,运行失败

2. 静态地址映射

程序装入时由操作系统完成逻辑地址到物理地址的映射
MA = VA + BA
特点:程序运行之前确定映射关系,装入后不能移动,占用连续的内存空间

3. 动态地址映射

在程序执行过程中把逻辑地址转换为物理地址
MA = VA + BA
特点:程序占用的内存空间可动态变化,不要求连续的内存空间,便于多个进程共享代码,缺点是硬件支持(MMU),软件复杂

二:虚拟存储

借助辅存在逻辑上扩充内存,解决内存不足的问题
过程:

  • 迁入:将要运行的部分装入内存
  • 迁出:把不运行的部分暂时放在辅存
    前提
    短时间内进程不运行的部分往往占大部分

程序局部性原理
时间局部性
空间局部性

实现虚拟存储的前提:
足够的辅存
适当容量的内存
地址变换机构

三:内存分配

为程序分配足够的内存空间

1. Windows虚拟地址空间分配

在32位的机器上,地址空间从0x00000000~ 0xFFFFFFFF,总大小为4GB。一般而言,低地址空间,从0x00000000~ 0x7FFFFFFF使用户空间,高地址空间被分配给系统。

总体:

虚拟内存范围功能
0x00000000 ~ 0x0000FFFF这段内存为空指针区,不可以同时访问
0x00010000 ~ 0x7FFEFFFF这段供进程使用,包括所有的数据,静态或动态加载的exe和dll模块,以及内存映射文件
0x7FFF0000 ~ 0x7FFFFFFF此64KB是禁止访问的,因为它挨着内核区域,防止内核区域被覆盖,以破坏内核的正确性和完整性,试图改写此区域,会产生异常,以阻拦进一步改写内存区域
0x80000000 ~ 0xFFFFFFFFF内核区域,用于线程调度,内存管理,文件系统支持,网络支持和所有设备驱动的代码全部在次分区加载,驻留在这个分区中的一切均可被所有进程共享

用户低2GB空间分配:

虚拟内存地址范围功能
0x0 ~ 0xFFFF拒绝访问区域,用于帮助程序员避免引用错误的指针
0x00010000 ~ 0x7FFEFFFF专用进程地址空间
0x7EFDE000 ~ 0x7EFDEFFF用于第一个线程的线程环境块(TEB),系统会在这一页的前面创建附加的TEB(从0x7FFDD000开始向上)
0x7FFDF000 ~ 0x7FFDFFFF进程环境块(PEB)
0x7FFE0000 ~ 0x7FFE0FFF共享的用户数据页,这个只读方式的页面被映射到系统空间中包含系统时间,时钟计数和版本号信息的一个页面,这个页面的存在使数据在用户态下可以直接读取而不必请求核心态的转换
0x7FFE1000 ~ 0x7FFEFFFF拒绝访问区域
0x7FFF0000 ~ 0x7FFFFFFF拒绝访问区域,用于防止线程跨越用户/系统空间边界传送缓存区,在变量MmUserProbeAddress中包含此页的起始地址

核心高2GB空间分配:

虚拟内存地址范围功能
0x80000000 ~ 0xc0000000内核执行体,HAL和硬件驱动程序
0xc0000000 ~ 0xc0800000进程页和超空间
0xc0800000 ~ 0xFFBE000系统高速缓存,分页缓冲池,非分页缓冲池
0xFFBE000 ~ 0xFFC0000崩溃储存驱动程序区域
0xFFC0000 ~ 0xFFFFFFF留给HAL使用

2. Linux虚拟地址空间分配

在 Linux 操作系统中,虚拟地址空间的内部又被分为内核空间和用户空间两部分,不同位数的系统,地址空间的范围也不同。比如最常见的 32 位和 64 位系统,如下所示:

用户空间与内存空间

用户空间与内存空间

通过这里可以看出:

  • 32 位系统的内核空间占用 1G,位于最高处,剩下的 3G 是用户空间;
  • 64 位系统的内核空间和用户空间都是 128T,分别占据整个内存空间的最高和最低处,剩下的中间部分是未定义的。

再来说说,内核空间与用户空间的区别:

  • 进程在用户态时,只能访问用户空间内存;
  • 只有进入内核态后,才可以访问内核空间的内存;

虽然每个进程都各自有独立的虚拟内存,但是每个虚拟内存中的内核地址,其实关联的都是相同的物理内存。这样,进程切换到内核态后,就可以很方便地访问内核空间内存。
Linux进程在内存中的详细存储方式:
在这里插入图片描述

通过这张图你可以看到,用户空间内存,从低到高分别是 7 种不同的内存段:

  • 程序文件段,包括二进制可执行代码;
  • 已初始化数据段,包括静态常量;
  • 未初始化数据段,包括未初始化的静态变量;
  • 堆段,包括动态分配的内存,从低地址开始向上增长;
  • 共享库内存映射段,包括动态库、共享内存等,从低地址开始向上增长(跟硬件和内核版本有关);
  • 栈段,包括局部变量和函数调用的上下文等。栈的大小是固定的,一般是 8 MB。当然系统也提供了参数,以便我们自定义大小;

在这 7 个内存段中,堆和享库内存映射段的内存是动态分配的。比如说,使用 C 标准库的 malloc() 或者 mmap() ,就可以分别在堆和文件映射段动态分配内存。

内存管理

每个进程都拥有自己的4G(32位机)虚拟内存地址,各个进程之间是相互独立的,每个进程的数据可由其中线程共享。虚拟内存地址本身不对应任何物理地址,直接引用会引发错误,虚拟内存地址必须映射物理地址后才能储存数据。内存分配其实指的是虚拟内存地址映射物理内存,内存回收就是指解除映射关系。

四:储存保护

保证在内存中的多道程序只能在给定的储存区域内活动并互不干扰

  1. 防止访问越界
  2. 防止访问越权

方法:界址寄存器
在CPU中设置一对下限寄存器和上限寄存器存放程序在内存中的下限地址和上限地址
程序访问内存时硬件自动将目的地址与下限寄存器和上限寄存器中存放的地址界限进行比较,判断是否越界

关于计算机硬件存储系统详细见计算机存储系统

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hack Rabbit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值