页表

又能扯皮了!没内存了还能看片?

拥有回忆 提交于 2020-03-06 15:35:58
虚拟内存 尽管基址寄存器和变址寄存器用来创建地址空间的抽象,但是这有一个其他的问题需要解决: 管理软件的膨胀(managing bloatware) 。虽然内存的大小增长迅速,但是软件的大小增长的要比内存还要快。在 1980 年的时候,许多大学用一台 4 MB 的 VAX 计算机运行分时操作系统,供十几个用户同时运行。现在微软公司推荐的 64 位 Windows 8 系统至少需要 2 GB 内存,而许多多媒体的潮流则进一步推动了对内存的需求。 这一发展的结果是,需要运行的程序往往大到内存无法容纳,而且必然需要系统能够支持多个程序同时运行,即使内存可以满足其中单独一个程序的需求,但是从总体上来看内存仍然满足不了日益增长的软件的需求(感觉和xxx和xxx 的矛盾很相似)。而交换技术并不是一个很有效的方案,在一些中小应用程序尚可使用交换,如果应用程序过大,难道还要每次交换几 GB 的内存?这显然是不合适的,一个典型的 SATA 磁盘的峰值传输速度高达几百兆/秒,这意味着需要好几秒才能换出或者换入一个 1 GB 的程序。 SATA(Serial ATA)硬盘,又称串口硬盘,是未来 PC 机硬盘的趋势,已基本取代了传统的 PATA 硬盘。 那么还有没有一种有效的方式来应对呢?有,那就是使用 虚拟内存(virtual memory) ,虚拟内存的基本思想是,每个程序都有自己的地址空间

MMU内存管理单元

女生的网名这么多〃 提交于 2020-03-03 20:52:13
arm-linux学习-(MMU内存管理单元) 什么是MMU MMU(Memory Management Unit)主要用来管理虚拟存储器、物理存储器的控制线路,同时也负责 虚拟地址映射为物理地址 ,以及提供硬件机制的内存访问授权、多任务多进程操作系统。(来自百度百科, 对其几个点不熟悉,因此可以只考虑加粗部分 ) 发展历史 注意:学习一个知识点,很重要的一步是了解其 为什么而存在?它的存在是为了解决什么问题? 然后,在学习的过程中带着这些问题去理解、去思考。 在许多年以前,还是使用DOS或一些古老的操作系统时,内存很小,同时,应用程序也很小,将程序存储在内存中基本能够满足需要。随着科技的发展,图形界面及一些其他更复杂的应用出现,内存已经无法存储这些应用程序了,通常的解决办法是将程序分割成很多个 覆盖块 ,覆盖块0最先运行,运行结束之后,就调用另一个覆盖块,虽然这些操作由OS来完成,但是,需要程序员对程序进行分割,这非常不高效;因此,人们想出了一个 虚拟存储器(virtual memory) 的方法。虚拟存储器的基本思想是:程序、数据、堆栈的总大小可以超过内存空间的大小,操作系统将当前运行的部分保存在内存中,未使用的部分保存在磁盘中。比如一个16MB的程序和一个内存只有4MB的机器,操作系统通过选择可以决定哪部分4MB的程序内容保存在内存中,并在需要时,在内存与磁盘中交换程序代码

对于流程优化的处理器架构

佐手、 提交于 2020-03-02 15:40:46
在过去的两年里,我学到了很多的代码优化方法的同事,在此汇总了什么。 优化处理器架构可以从下面几个方向展开:高速缓存命中。指令预测。数据预取,数据对齐,内存拷贝优化,ddr访问延迟。硬件内存管理优化,指令优化。叙述工具。 缓存未命中是处理器的主要性能瓶颈之中的一个。在FSL的powerpc上,訪问一级缓存是3个时钟周期,二级是12个,3级30多个。内存100个以上。一级缓存和内存訪问速度差30多倍。 我们能够算一下,假设仅仅有一级缓存和内存,100条存取指令。100%命中和95%命中。前者300周期,后者95*3+5*100=785周期,差了1.6倍。这个结果的前提是powerpc上每一个核心仅仅有1个存取单元,使得多发射也无法让存取指令更快完毕。 当然,假设未命中的指令分布的好,其中穿插了非常多别的非存取指令那就能够利用乱序多做些事情,提高效率。 怎么用代码提高缓存命中率?我们能够用指令预測和数据预取。 指令预測非经常见,处理器预測将要运行的一个分支,把兴许指令取出来先运行。 等真正确定推断条件的时候,假设预測对了,提交结果。假设不正确,丢掉预先运行的结果。又一次抓取指令。 此时,结果还是正确的,可是性能会损失。 有一个经常使用的指令预測机制叫btb(branch target buffer),大致方法是,对于跳转指令,把它近期几次的跳转结果记录下来

armv8虚拟内存架构简述

倾然丶 夕夏残阳落幕 提交于 2020-03-01 19:08:58
粗略看了一下armv8的虚拟内存的文档。记录一下,细节留待以后用到时再去细究。 程序在运行的时候使用的内存一般是虚拟内存,需要经过转换才能接触到物理内存。其中的底层支持就是硬件架构,现代架构都是支持硬件虚拟内存转换的,一般就是说提供MMU。armv8架构作为现代架构也不例外,但是不太一样的是armv8架构支持两级转换:stage 1 和stage 2. 上图包含了安全世界和非安全世界的东西,由于安全世界的东西过于复杂(主要是我也不懂),下面我们就忽略掉安全世界的东西。从上图的第四条:VA->IPA->PA.很明显,VA到PA可以最多经过两次转换,当然每个stage都是可以取消的,比如只有stage1 或只有stage2. 为什么需要两级转换呢?这是为支持虚拟化而设置的,对于虚拟机内的程序一般需要经过两级转换才能访问到主机的物理地址。所以一般地可以认为,对于主机上跑的应用程序只需要一级转换,而在虚拟机中的程序要经过两级转换。那怎样控制这些内存转换机制呢? 控制虚拟内存转换的接口就是一系列寄存器,主要有:SCTLR_EL1,TCR_EL1, TCR_EL2, HCR_EL2,TTBR0_EL1, TTBR1_EL1, VTTBR_EL2。下面分别介绍一下。 SCTLR_EL1:顶级系统控制寄存器,其中Mbit控制MMU 对EL0和EL1的stage 1的使能,一旦置位1

Linux系统内核main函数执行之前

ε祈祈猫儿з 提交于 2020-02-29 09:33:43
1、linux是一个操作系统在机器加电后,需要从硬件通过一个引导程序加载os kernel,那么在os kernel的main函数运行之前,都发生了什么呢? (1)引导BIOS(存储在ROM芯片中,ROM:只读存贮器,现在一般为闪存)的启动(准备实模式下的中断向量表和中断服务程序) 实模式:Intel80x86系列的一种cpu运行模式,特点,20位地址寻址(1MB),可直接访问BIOS和周边的硬件,没有硬件支持的实时多任务和分页机制。 BIOS任务:把os 加载到RAM(随机存取存储器,也就是常见的内存条) 所有的cpu在加电时强行进入16位实模式,此时cpu的一些特殊值: CS:0xF0000,IP:0xFFF0 所以起始地址为CS:IP = 0xFFFF0也就是BIOS的地址。 CS:代码段寄存器 IP:指令指针寄存器(IP对应16位,EIP对应32位,RIP对应64位) 指令的地址:代码段其实地址+指令段内偏移地址 = CS + IP 中断向量表的位置:0x00000 ~ 0x003FF (一共1kb):一共256个中断向量(CS:IP),每个4B(CS:2B;IP:2B) BIOS数据区:0x00400 ~ 0x004FF 中断服务程序:0x0E50B ~ 0x0FFFE 中断int (2)加载第一部分kernel代码(bootsect) BIOS收到int 0x19

操作系统学习笔记3

╄→гoц情女王★ 提交于 2020-02-22 13:57:25
连续内存管理 1、缓存最快,缓存未命中,内存,内存找不到,缺页,外存 2、存储管理单元将虚拟逻辑地址转换为实际物理地址 3、抽象、保护、共享、虚拟化 4、管理方式:重定位、分段、分页、虚拟存储 5、地址生成时机:编译时、加载时、执行时 6、动态分区分配:当程序被加载执行时,分配一个进程指定大小可变的分区 7、动态分区分配策略:最先匹配,最佳匹配,最差匹配 8、最先匹配:第一个可用空间比n大的空闲块 9、最佳匹配:最接近的 10、最差匹配:找最大的 11、碎片整理:紧凑、分区对换 12、内碎片是指分配给任务的内存大小比任务所要求的大小所多出来的内存。外碎片指分配给任务的内存之间无法利用的内存。 非连续内存管理 1、连续分配存在内碎片,外碎片,利用效率低 2、目标:提高利用效率和管理灵活性 允许使用非连续物理地址空间 运行共享代码和数据 支持动态加载和动态链接 3、麻烦:虚拟地址和物理地址的转换 软件实现:灵活,开销大 硬件实现:够用,开销小 4、段式存储管理: 段表示访问方式和存储数据等属性相同的一段地址空间 5、页式存储管理: 页帧:将物理地址空间划分为大小相同的基本分配单位 页面:将逻辑地址空间页划分非相同大小的基本分配单位 帧和页的大小必须是相同的 6、页面到页帧的转换:页表 7、逻辑地址页号连续,物理地址帧号不连续,通过页表转换 8、快表TLB使用关联存储实现

MIT 6.828 JOS/XV6 LAB4-partA

不羁岁月 提交于 2020-02-14 20:17:02
这一部分要实现的是对多核处理器的支持,然后实现系统调用只喜欢用户应用创建新的应用,而且还要实现round-robin调度算法 Multiprocessor support jos中对CPU进行了抽象 要描述一个CPU, 需要知道id,运行状态,当前正在运行的进程 所有的cpu数目放在cpus数组中 接下来则是对有多个cpu的处理器的抽象,这里使用了三个结构体,总之是比较乱,目前还不能完全看懂 多核处理器的初始化都在mp_init函数中完成,首先是调用mpconfig函数,主要功能是寻找一个MP 配置条目,然后对所有的CPU进行配置,找到启动的处理器 接下来就是要完成lapic(local advanced programmable interrupt controller) apic主要是为与其连接的处理器传送中断信号 而CPU控制与其相关联的apic需要通过读写其中的寄存器,而读写寄存器则是通过映射IO(memory mapped IO)的方法来实现的 有一些物理内存是与apic的寄存器硬件相连的,这样可以通过读写内存完成对寄存器的读写 JOS中在ULIM之上,预留了4MB的内存空间来映射APIC的寄存器 所以在使用APIC之前首先要完成映射。首先需要调用mmio_map_region函数来实现 mmio_map_region函数的实现 这部分的实现还是比较简单的

进程的相关概念

∥☆過路亽.° 提交于 2020-02-13 21:02:58
进程:程序的一个执行实例。担当分配系统资源的实体。 1. 进程的创造 当一个程序执行时,首先操作系统会创建一个 PCB ,将 所要执行的数据和代码和PCB一起构成进程 。还会为这个进程创造虚拟地址空间(虚拟内存),并创建与物理内存(真实内存)有映射关系的页表。当有多个进程时,会按照双向链表的方式连接起来。 值哪个 数据转移到物理内存中 首先所要执行的代码和数据经过PCB分配到虚拟地址空间的各个区域, 然后通过页表的映射规则将虚拟地址空间的数据和代码映射到物理内存上。 虚拟内存的相关知识: linux下的虚拟内存,页表,虚拟内存和物理内存的转换 2. 进程的执行 如果进程要执行,操作系统会将执行的进程另取出来作为队列中的一个,并将进程设置为 R (运行)状态,然后根据优先级和时间片来让队列中的每一个进程都放到CPU上执行,并将运算数据加载到CPU的寄存器上,如果一个进程的时间片到了,操作系统会将CPU的寄存器里的数据放到PCB中,同时PCB中还会保存CPU的PC指针所指向的地址,下次再执行该进程时,操作系统会将在PCB保存的数据再恢复到CPU的寄存器和PC指针,进而保证从上次结束的地方继续运行。 3. 进程的结束 进程执行完,操作系统会将进程设置为 Z (僵尸)状态并采集进程的相关信息, 采集完毕后,进程被设为 X (死亡)状态,继而进程结束。 来源: CSDN 作者: 森抛 链接:

《操作系统教程》第5版-Chapter4-存储管理

ⅰ亾dé卋堺 提交于 2020-02-12 02:24:45
存储管理 存储 分配 地址 映射 存储 保护 存储 共享 存储 扩充 存储器层次:寄存器,缓存,内存,磁盘,磁带 寄存器:速度最快最贵 **源程序运行的三个阶段: 编译 :生成目标代码 链接 静态链接 :装载前将目标模块与库函数链接装配成一个完整的可执行程序 动态链接 :程序装载时一边装载一边链接 运行时链接 :目标模块与库函数的链接推迟到执行时才进行 装载 :装入物理空间 绝对装载 :始终与内存地址相同 可重定位装载 :根据内存当前状况决定放入的物理位置。使用的地址为相对地址 动态运行时装载 :允许内存的程序换出到磁盘,适当时再换入内存。前后物理位置可不同。即允许进程的内存映像不同时候在不同位置 **重定位 : 逻辑地址变物理地址 静态地址重定位 动态地址重定位 使用两个控制寄存器:基址寄存器和限长寄存器 运行时链接地址重定位 连续存储管理: 固定分区 缺点: 必须使用覆盖技术 内存利用率不高 无法动态扩充 限制多道程序的道数 动态分区 可变分区分配算法: 最先适应 :未分配区表或链表中的空闲区按地址从小到大排列 下次适应 :上次扫描结束处顺序查找 最优适应 :满足要求的 最小分区 最坏适应 :总是挑 一个最大的空闲区 给作业使用 快速适应 :经常用到的长度的空闲区设立 单独的空闲区链表 管理的数据结构:已分配区表,未分配区表 空闲区管理办法:链表 内存不足处理技术 移动

操作系统7:内存管理

瘦欲@ 提交于 2020-02-09 23:13:42
内存管理 基本概念 内存管理主要分为连续区管理和非连续区管理 注意汇编语言也需要翻译下 ,但不是编译,因为它基本上就是一对一的翻译了下,比编译任务简单的多 base表示该进程的最小的地址位置,limit表示最大的 由存储管理单元在地址送往地址总线之前进行逻辑地址到物理地址的转换 : 两种方法可以实现运行时不将所有代码装入内存: 动态连接提供系统级的支持,操作系统升级时,动态链接库可以直接升级,不需要重新编译应用程序 存储管理的基本内存就是逻辑地址和物理地址之间的映射 交换 后备存储空间一般是一个单独划出的存储空间,要提供直接访问机制 来源: https://zhidao.baidu.com/question/72920995.html 内存交换(对换)的基本思想是,把处于等待状态(或在 CPU 调度原则下被剥夺运行权利) 的程序从内存移到辅存,把内存空间腾出来,这一过程又叫换出;把准备好竞争 CPU 运行的程序从辅存移到内存,这一过程又称为换入。   有关交换需要注意以下几个问题:   1、交换需要备份存储,通常是快速磁盘。它必须足够大,并且提供对这些内存映像的直接访问。   2、为了有效使用 CPU ,需要每个进程的执行时间比交换时间长,而影响交换时间的主要是转移时间。转移时间与所交换的内存空间成正比。   3、如果换出进程,必须确保该进程是完全处于空闲状态。   4