页表

操作系统核心原理-5.内存管理(中):分页内存管理

北城余情 提交于 2020-01-23 21:24:23
   在上一篇介绍的几种多道编程的内存管理模式中,以交换内存管理最为灵活和先进。但是这种策略也存在很多重大问题,而其中最重要的两个问题就是空间浪费和程序大小受限。那么有什么办法可以解决交换内存存在的这些问题呢?答案是分页,它是我们解决交换缺陷的“不二法门”。 一、分页内存管理 1.1 解决问题之道   为了解决交换系统存在的缺陷,分页系统横空出世。分页系统的核心在于: 将虚拟内存空间和物理内存空间皆划分为大小相同的页面,如4KB、8KB或16KB等,并以页面作为内存空间的最小分配单位,一个程序的一个页面可以存放在任意一个物理页面里 。   (1)解决空间浪费碎片化问题   由于将虚拟内存空间和物理内存空间按照某种规定的大小进行分配,这里我们称之为页(Page),然后按照页进行内存分配,也就克服了外部碎片的问题。   (2)解决程序大小受限问题   程序增长有限是因为一个程序需要全部加载到内存才能运行,因此解决的办法就是使得一个程序无须全部加载就可以运行。使用分页也可以解决这个问题,只需将当前需要的页面放在内存里,其他暂时不用的页面放在磁盘上,这样一个程序同时占用内存和磁盘,其增长空间就大大增加了。而且,分页之后,如果一个程序需要更多的空间,给其分配一个新页即可(而无需将程序倒出倒进从而提高空间增长效率)。 1.2 虚拟地址的构成与地址翻译   (1)虚拟地址的构成   在分页系统下

Linux内存管理概述

a 夏天 提交于 2020-01-23 05:56:03
Linux内存管理概述 2020年悄悄的来了,新年初始正是立flag的好时候,今年的flag是总结完linux内存管理和进程管理两大模块,想法是好的,希望能坚持下去,废话到此为止,今天先来介绍linux内存管理的概述,后续内存相关文章都围绕今天的内容展开。 内存管理架构图 先上图: 用户空间 应用程序并没有直接调用系统调用申请内存,是调用glibc的库函数malloc和free申请和释放内存,malloc和free是glibc的ptmalloc分配器提供的接口,ptmalloc使用系统调用brk和mmap向内核以页为单位申请内存,然后划分成小的内存块分配给用用程序。 除了glibc的ptmalloc,还有google公司的tcmalloc和FreeBSD的jemalloc。 Note: GUN C指的是glibc,ANSI C指的是libc,是标准C库,glibc对libc做了扩展,一般只用于linux 内核空间 虚拟内存管理负责为进程分配虚拟页,内存采用延迟分配虚拟页的策略,进程第一次申请内存页时,会发生页错误异常,异常处理程序从页分配器中分配物理页,并把虚拟页和物理页的映射条目更新到页表中。 页分配器负责分配物理页,内核有多种页分配器,不连续内存页分配器、连续页分配器、引导内存分配器等。 连续内存页分配器(CMA):DMA可以不需要cpu直接控制内存,但是一般需要连续的内存

主存管理

送分小仙女□ 提交于 2020-01-22 08:38:51
1 概念 存储器 storage, memmory 能接收数据和保存数据、而且能根据命令提供这些数据的装置。 存储器分成两类: 内存储器(简称内存、主存、物理存储器) 处理机能直接访问的存储器。用来存放系统和用户的程序和数据,其特点是存取速度快,存储方式是以新换旧,断电信息丢失。 外存储器(简称外存、辅助存储器) 处理机不能直接访问的存储器。用来存放用户的各种信息,存取速度相对内存而言要慢得多,但它可用来长期保存用户信息。在文件系统中介绍。 1.内存的物理组织 物理地址: 把内存分成若干个大小相等的存储单元,每个单元给一个编号,这个编号称为内存地址(物理地址、绝对地址、实地址),存储单元占8位,称作字节(byte)。 物理地址空间: 物理地址的集合称为物理地址空间(主存地址空间),它是一个一维的线性空间。 2.程序的逻辑结构 程序地址:用户编程序时所用的地址(或称逻辑地址 、虚地址 ),基本单位可与内存的基本单位相同,也可以不相同。 程序地址空间(逻辑地址空间、虚地址空间):用户的程序地址的集合称为逻辑地址空间,它的编址总是从0开始的,可以是一维线性空间,也可以是多维空间。 2存储管理的功能 1.存储管理功能 地址映射 将程序地址空间中使用的逻辑地址变换成主存中的地址的过程 (2) 主存分配 按照一定的算法把某一空闲的主存区分配给作业或进程。 (3) 存储保护 保证用户程序

利用上虚拟化,说一下TLB,以及VHE

你说的曾经没有我的故事 提交于 2020-01-15 16:32:06
arm给出了基于虚拟化技术会产生的优势: 1. 隔离: 虚拟化的核心是在单个物理系统上运行的虚拟机之间提供隔离。这种隔离允许在互不信任的计算环境之间共享物理系统。例如,两个竞争对手可以共享一个数据中心中的同一台物理计算机,而不必访问彼此的数据。 2. 高可用性: 虚拟化允许在物理计算机之间无缝,透明地迁移工作负载。此技术通常用于将工作负载从可能需要维护和更换的故障硬件平台上迁移出去。 3. 工作负载平衡: 为了优化数据中心的硬件和电源预算,重要的是尽可能多地使用每个硬件平台。同样,这可以通过迁移虚拟机或在物理机上共同托管合适的工作负载来实现。这意味着物理机将被尽可能多地使用。这为数据中心提供商提供了最佳的电源预算,并为租户提供了最佳的性能。 4. 沙箱: VM可用于为可能干扰其运行的计算机其余部分的应用程序提供沙箱。此类应用程序的示例包括旧版应用程序或正在开发的软件。在VM中运行这些应用程序可防止应用程序中的错误或恶意部分干扰物理机上的其他应用程序或数据。 虚拟化EL2层次是与内核态EL1/用户态EL0相提并论的,也就是说,在引入EL2之后,系统的复杂度是EL2✖️EL1✖️EL0的。 EL1由MMU页表转换将EL0的内存实现了隔离,而EL2就需要再实现一次MMU页表转换实现EL1内存地址的隔离,而内存主要由CPU(cache)访问,但在IOMMU(DMA)之后

操作系统:内存管理(概念)

回眸只為那壹抹淺笑 提交于 2020-01-11 07:40:11
  1、物理地址和逻辑地址    物理地址:加载到内存地址寄存器中的地址,内存单元的真正地址。在前端总线上传输的内存地址都是物理内存地址,编号从0开始一直到可用物理内存的最高端。这些数字被北桥(Nortbridge chip)映射到实际的内存条上。物理地址是明确的、最终用在总线上的编号,不必转换,不必分页,也没有特权级检查(no translation, no paging, no privilege checks)。   逻辑地址:CPU所生成的地址。逻辑地址是内部和编程使用的、并不唯一。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址(偏移地址),不和绝对物理地址相干。   2、连续内存分配方案:   内存必须容纳操作系统和各种用户进程,因此必须尽可能有效得分配内存,在分配内存过程中,通常需要将多个进程放入内存中,前面提到过,我们需要每个进程的空间相互独立,而且我们必须保护每个进程的内存空间的独立性,如果不同的进程间需要通信,可以按照我们前面提到的通信方法进行通信,但是在此时,我们考虑内存空间独立性的实现。这就涉及到内存分配:   我们将整个内存区域多个固定大小的分区,每个分区容纳一个进程,当一个分区空闲时,可以将内存调入内存,等待执行,这是最简单的内存分配方案,但是这种方案存在很多问题

操作系统篇-浅析分页机制

末鹿安然 提交于 2020-01-11 02:31:16
|| 版权声明:本文为博主原创文章,未经博主允许不得转载。   一、前言   在我们进行程序开发的时候,一般情况下,是不需要管理内存的,也不需要操心内存够不够用,其实,这就是分页机制给我们带来的好处。它是实现虚拟存储的关键,位于线性地址与物理地址之间,在使用这种内存分页管理方法时,每个执行中的进程(任务)可以使用比实际内存容量大得多的连续地址空间。而且当系统内存实际上被分成很多凌乱的块时,它可以建立一个大而连续的内存空间的映象,好让程序不用操心和管理这些分散的内存块。分页机制增强了分段机制的性能。页地址变换是建立在段变换基础之上的。因为,段管理机制对于Intel处理器来说是最基本的,任何时候都无法关闭。所以即使启用了页管理功能,分段机制依然是起作用的,段部件也依然工作。    二、页表结构   那么到底如何使用分页机制呢?通过 设置cr0的PG位 可以开启分页机制。页大小是4K,并且是4K对齐的。线性地址通过分页机制转换成物理地址的时候,可能某些线性地址是无效的。如果某个线性地址对应的页不存在,那么访问的时候将产生一个异常。    两级页表结构   内存分页管理的基本原理是将整个主内存区域划分成 4096 字节为一页的内存页面。程序申请使用内存时,就以内存页为单位进行分配。上面提到了线性地址经过分页机制的转换变成物理地址,但是没有提到如何转换。其实是通过两个表,一个是页目录表PDE

PA3.2

十年热恋 提交于 2020-01-11 01:50:04
写在前面的话 如果您对该系列感兴趣的话,推荐您先看一下南京大学的计算机组成原理实验(也就是PA)的讲义,然后再来看这篇文章可能有更多地收获。如果您是要完成该作业的学生,我推荐你先看讲义,或者好好听老师的讲课,然后自己独立完成这个作业,但是如果你没有听懂,或者你无论如何也无法理解讲义上面的字,又或者说对讲义上面的某点知识某个问题不了解而又觉得太简单不好意思问老师,那么您可能会从这篇文章里面获得一些你需要的信息。本篇文章将会包括笔者自己做PA的所有经过,希望你并不将该文章当成抄袭的根源,而是成为你思考的源泉。 现在已经到了PA3的 最后 阶段,经过了PA0的搭建环境、PA1简单的功能函数实现、PA2的机器指令的模拟实现,现在我们已经基本上拥有进行更高级操作的环境,所以这个阶段更关注的是系统层面的实现。 我们已经实现了最困难的部分,也就是PA3.1运行仙剑奇侠传的部分,现在要做的是在分页机制上面运行仙剑奇侠传,让我们的NEMU系统同时支持多个程序运行 PA系列传送门 PA0: https://blog.csdn.net/qq_41983842/article/details/88921427 PA1.1: https://blog.csdn.net/qq_41983842/article/details/88934779 PA1.2: https://blog.csdn.net/qq

《操作系统真象还原》分页

北城余情 提交于 2020-01-06 21:46:06
  本节是阅读第五章的收获。下面将阐述一些分页的相关内容。 分页 什么是分页   分页,顾名思义,就是将内存分成大小相同的页。分页,通过映射的方式,将连续的线性地址转化为不连续的物理地址;这样,在处理器进入分页模式之后,用户直接访问的并不是物理地址,而是分页模式下的虚拟地址。   上面有三个和地址相关的概念,分别为虚拟地址、线性地址和物理地址。   在打开保护模式之前,仅有线性地址和物理地址的概念,物理地址就是CPU最终访问的真正地址,是指令或数据真正保存的数据的地方。而线性地址代表“段基址+段内偏移地址”,由于在实模式下,段基址+段内偏移地址等于物理地址,所以线性地址和物理地址数值上是一样的。   而打开保护模式且打开分页模式之后,用户直接访问的是虚拟地址空间或是线性地址空间,线性地址仍然是段基址+段内偏移地址,虚拟地址数值上与线性地址相同。从概念上线性地址空间和虚拟地址空间有些不同,因为线性地址空间只有段的概念,没有页的概念;通过分页机制,将线性地址空间中大小不等的段转化为虚拟空间中大小相等的页。虚拟地址通过页表和页目录转化为最终的物理地址,分页机制如下图:   总的来说,虚拟地址就是分页后程序或任务访问的地址,线性地址就是段基址+段内偏移地址,物理地址是CPU最终访问的地址。 为什么要分页   那么为什么要分页呢?主要原因是 内存分配的时候存在外部碎片

第 8 章 内存管理策略

二次信任 提交于 2020-01-06 17:49:11
  为了实现性能改进,应将多个进程保存在内存中,也就是说必须共享内存。 8.1 背景   内存是现代计算机运行的核心。内存由一个很大的字节数组来组成,每个字节都有各自的地址。 8.1.1 基础硬件   CPU可以直接访问的通用存储只有内存和处理器内置的寄存器。   每个进程都有一个独立的内存空间,可以保护进程不会互相影响。 基地址寄存器(base register):最小的合法的物理内存地址。 界限地址寄存器(limit register):指定了范围的大小。   合法范围为(base, base + limit)register   内存空间保护的实现是通过CPU硬件对在用户模式下产生的地址与寄存器的地址进行比较来完成的。   只有操作系统可以通过特殊的特权指令,才能加载基地址寄存器和界限地址寄存器。不允许用户程序修改它们。 8.1.2 地址绑定   源程序中的地址通常是用符号表示的,编译器通常将这些符号地址绑定到可重定位的地址。链接程序或加载程序再将这些可重定位的地址绑定到绝对地址。每次绑定都是从一个地址空间到另一个地址空间的映射。   通常,指令和数据绑定到存储器地址可在沿途任何一步中进行: 编译时 加载时 执行时 8.1.3 逻辑地址空间和物理地址空间   CPU生成的地址通常称为逻辑地址,而内存单元看到的地址(即加载到内存地址寄存器)通常称为物理地址。  

PAE 分页模式详解

做~自己de王妃 提交于 2020-01-04 14:33:13
2016-11-18 记得之前看windows内核原理与实现的时候,在内存管理部分,看到涉及到PAE模式的部分,提到此模式下可以让系统在虚拟地址还是32位宽的情况下,支持64GB的物理内存或者更多。当时就没怎么想明白,今天突然想起就结合intel手册仔细研读了一番,但是手册所讲主要是其寻址过程以及各级页表和entry的结构,对如何支持这一说还真没有提到。于是乎,google、上论坛等等,初步对其有了认识,难免让人失望,因为其着实没有我想的那么玄乎,下面还是分享下: PAE模式是基于分页模式的,如果CR.PG=1,CR4.PAE=1,则表示PAE模式被启用。 根据手册介绍,PAE模式下,一个32位的线性地址(虚拟地址)被翻译成一个52位的物理地址,这句话才是整个PAE模式的精髓。52是最大支持的位数,所以按照PAE的思想,其实不只可以支持64GB,还可以更多。至于这个限制,而为何要限制于64GB,这点恐怕又和PAE的工作模式相关。 PAE模式如何支持大于32GB的物理内存? PAE模式下,系统中的进程任意时刻还是只能访问4GB的地址空间,这是虚拟地址宽度所限,但是考虑到一般的页表项结构,低12位做各种标志,高20位作为物理页框号,这样满打满算也就可以定位2^20=1M个物理页面,也就是在普通模式下无论如何最高只能支持4GB物理内存。 PAE模式下就不同了,其稍微改变了下页表结构