页表

内存管理

匿名 (未验证) 提交于 2019-12-02 23:57:01
为了让每个进程认为 独占 地使用内存,并且让每个进程看到的内存是 一致 的,操作系统对物理内存、磁盘进行了 抽象 ,抽象出 虚拟内存 。并且把虚拟内存、物理内存以相同固定大小的 ҳ 进行切分管理( 分页 ),虚拟内存中叫页,物理内存中的叫页帧。 每个进程虚拟地址空间是独立的。用户访问的是虚拟内存的地址,即虚拟地址。需要通过 CPU 芯片上的 内存管理单元 MMU 硬件根据页表 翻译 成物理地址,才能真正访问内存。 页表 :每个进程都有它的独立的页表(放在内存里),用来存对虚拟页、物理页的 映射 。页表可以有多级页表,以时间换取空间(实际上,多级页表的地址翻译,并不比单级页表慢很多)。 如果直接按一个个程序加载到内存,会出现内存 碎片 。 后来出现 分段 机制,按程序的各段来存储,从而减少碎片,但是还是有很多。 所以引出分页,把程序分成更小的页(一般大小为 4KB )来管理内存。分得更小,会增加负荷,但实际上利大于弊。 通过虚拟地址 访问 数据: MMU 先通过它里面的 TLB 缓存查询,如果没有,则去内存中的 页表 进行查询。成功翻译成物理地址后,访问 一级缓存 获取数据。如果没有则访问 二级缓存 (可能还有三级缓存)。还是没有就访问 内存 。 物理内存 不够 时: 将不用的页面换出到磁盘中的 swap 分区 里。 包含: 程序代码和静态变量(根据可执行文件进行初始化,并固定了大小

ucore Lab2 实验笔记

匿名 (未验证) 提交于 2019-12-02 23:57:01
ucore Lab2 lab 2 直接执行 make qemu-nox 会显示 assert 失败: kernel panic at kern/mm/default_pmm.c:277: assertion failed: (p0 = alloc_page()) == p2 - 1 对物理内存的管理,为了节省空间,也是为了配合接下来的虚拟内存管理,通常以某个比 byte 大一些的单位进行管理,我们称这一单位内存为一" ҳ(page) ",通常是 4KB.待 pages 初始化完毕后,物理内存示意图如下: 其中绿色代表可以分配的内存,红色代表不可被分配的内存.注意, ucore 规定物理内存可用范围最大不超过 KERNSIZE .函数 page_init 的主要作用就是初始化 pages 也就是所有 page 的所有信息. 注意, pages 以全局指针的形式存在,因为最开始无法知道 page 的数量,所以无法写成数量确定的数组.此数量必须尽快确认,否则后期无法管理. 如何确定 page 的数量 npage 呢? npages 可由最大物理内存边界/PGSIZE 得出. 而最大物理内存边界可以借助 BIOS 可以探测并计算出来,参考 探测系统物理内存布局 和 实现物理内存探测 .可以获取到最大可用物理内存边界 maxpa , 但 maxpa 最终必须<= KMEMSIZE .

DPDK学习开篇

匿名 (未验证) 提交于 2019-12-02 23:42:01
1.前言 说来想学习DPDK已经是很久的事情了,奈何总是被所谓的紧急的事情耽误,故而决心学习一下,记录一下以便总结,知道DPDK已经是很久之前的事情了,记得曾经一次面试就被问到DPDK报文如何走的,也是被问的一脸懵逼甚是尴尬, 主要是工作中用到会比较多, 个人对DPDK的处理机制也是很感兴趣 2.DPDK介绍 3.DPDK 优势 1)轮询与中断 起初的纯轮询模式是指收发包完全不使用任何中断,集中所有运算资源用于报文处理。DPDK纯轮询模式是指收发包完全不使用中断处理的高吞吐率的方 式。DPDK所有的收发包有关的中断在物理端口初始化的时候都会关 闭,也就是说,CPU这边在任何时候都不会收到收包或者发包成功的中 断信号,也不需要任何收发包有关的中断处理。具体收发包流程参见之后的文章单独说明。网络应用中可能存在的潮汐效应,在某些时间段网络数据 流量可能很低,甚至完全没有需要处理的包,这样就会出现在高速端口 下低负荷运行的场景,而完全轮询的方式会让处理器一直全速运行,明 显浪费处理能力和不节能。因此在DPDK R2.1和R2.2陆续添加了收包中 断与轮询的混合模式的支持,类似NAPI的思路,用户可以根据实际应 用场景来选择完全轮询模式,或者混合中断轮询模式。而且,完全由用 户来制定中断和轮询的切换策略,比如什么时候开始进入中断休眠等待 收包,中断唤醒后轮询多长时间,等等。 2)多线程编程:

虚拟化技术概述

匿名 (未验证) 提交于 2019-12-02 23:34:01
虚拟化使用软件的方法重新定义划分IT资源,可以实现IT资源的动态分配、灵活调度、跨域共享,提高IT资源利用率,使IT资源能够真正成为社会基础设施,服务于各行各业中灵活多变的应用需求。 目前虚拟技术主要分为服务器虚拟化(也称操作系统虚拟化)、存储虚拟化、网络虚拟化、应用虚拟化(也称桌面虚拟化)。 服务器虚拟化是将系统虚拟化技术应用于服务器上,将一个或若干个服务器虚拟成若干个服务器来使用。通过虚拟化软件向上提供对硬件设备的抽象和对服务器的管理,目前有两种常见的实现模式。 虚拟机监视器(virtual Machine Monitor,VMM),虚拟机监视器负责对虚拟机提供硬件资源抽象,为客户操作系统提供运行环境。又称寄宿虚拟化。虚拟机监视器是运行在宿主操作系统之上的应用程序,利用宿主操作系统的功能来实现硬件资源的抽象和虚拟机的管理。性能较低,典型实现有VMware Workstation和microsoft Virtual PC。 虚拟化平台Hypervisors,负责虚拟机的托管和管理,它直接运行在硬件之上,因此其实现直接受底层体系结构的约束。又称原生虚拟化。直接运行在硬件之上的不是宿主的操作系统,而是虚拟化平台,虚拟化平台提供指令集和设备接口,以提供对虚拟机的支持,性能较好,实现较为复杂,典型的实现有Citrix Xen 、VMware ESX Server 和Microsoft

linux0.11内存管理与分页机制

匿名 (未验证) 提交于 2019-12-02 21:59:42
在linux0.11中对内存的管理是以页为单位的,一个页面是指连续的4K字节物理内存。 通过页目录和页表项可以寻址或管理指定的页面。 在8086CPU中,程序寻址使用的是由段选择符和偏移地址构成的地址,这个地址并不能直接寻址物理内存,因此被称为虚拟地址。 虚拟(逻辑)地址首先通过分段管理机制首先变换成CPU32位线性地址(称作中间地址) 实际函数中操作的地址为当前进程数据段的段内偏移,然后会根据该段的段基址和段内偏移确定一个线性地址 然后利用分页管理机制将此线性地址映射到物理地址。 分页机制会将线性地址分为页目录项、页表项、和页内偏移三部分。利用这三部分确定该线性地址指向的实际物理地址 一个系统中可以同时存在多个页目录表,在linux0.11中只使用了一个页目录表,当前页目录表用寄存器CR3来确定。 页目录(占用一页内存)中每个页目录项(4字节)用来寻址一个页表 页表(占用一页内存)中的每个页表项(4字节)用来寻址一页物理内存页 所以我们可以用一个页目录项和一个页表项确定一个对应的物理内存页。 因为每页为4K字节,所以页目录=页表=4K字节 而页目录和页表中每项占4字节,所以页目录和页表中最多有1024项 所以一个页目录最多寻址:1页目录×1024页表×1024页表项×4K字节页大小 = 4G的内存空间 为了使用分页管理机制 一个32位的线性地址如下图被分为了三个部分

MIT-6.828 Lab2实验报告

匿名 (未验证) 提交于 2019-12-02 21:53:52
tags:mit-6.828 os 本文主要介绍lab2,讲的是操作系统内存管理,从内容上分为三部分: 第一部分讲的是物理内存管理,要进行内存管理首先需要知道哪些物理内存是空闲的,哪些是被使用的。还需要实现一些函数对这些物理内存进行管理。 第二部分讲的是虚拟内存。一个虚拟地址如何被映射到物理地址,将实现一些函数来操作页目录和页表从而达到映射的目的。 第三部分讲的是内核的地址空间。将结合第一部分和第二部分的成果,来对内核地址空间进行映射。 Part 1: Physical Page Management 通过lab1可以总结出如下的物理内存分布图: 大致上可以分为三部分: 0x00000~0xA0000:这部分叫做basemem,是可用的。 接着是0xA0000~0x100000:这部分叫做IO Hole,不可用。 再接着就是0x100000以上的部分:这部分叫做extmem,可用。 kern/pmap.c中的i386_detect_memory()统计有多少可用的物理内存,将总共的可用物理内存页数保存到全局变量npages中,basemem部分可用的物理内存页数保存到npages_basemem中。 Exercise 1: 需要我们写一个物理内存页的allocator。要求实现kern/pmap.c文件中的boot_alloc(),mem_init(),page_init()

《现代操作系统(中文第四版)》课后习题答案 第三章 内存管理

你。 提交于 2019-12-02 06:53:36
题目略 如有错误答案,请各位评论指出,多谢多谢 1、答:首先,需要特殊的硬件来进行比较,而且它必须很快,因为它用于每个内存引用。第二,使用4位键,一次只能在内存中存储16个程序(其中一个是操作系统)。 2、答:这是一个巧合。基址寄存器的值为16384是因为程序恰好在地址16384上加载。程序可以在任何地方加载。界限寄存器为16384是因为程序具有16384字节的长度。程序可以有任意的长度。加载地址与程序长度相等仅仅是一种巧合。 3、答:由题意得,读或写每个字节需要10/4 = 2.5ns,4GB = 4 1024 1024*1024字节 = 2^32字节,内存紧缩时,几乎整个内存都必须复制,也就是要求读出每一个内存字,然后重写到不同的位置。因此,对于每个字节的压缩需要 5ns。故总共需要的时间为 2^32×5 ns 。 4、第一次安装需要20 MB、10 MB、18 MB。最佳匹配需要12 MB、10 MB和9 MB 。最差的匹配需要20 MB、18 MB和15 MB。下一个匹配需要20 MB,18MB和9MB。 5、实际内存使用物理地址。这些是内存芯片在总线上对其做出反应的数字。虚拟地址是指进程的地址空间的逻辑地址。因此,具有32位字的计算机可以生成高达4 GB的虚拟地址,而不管该计算机的内存是否大于或小于4 GB。 6、对于4kb的页面大小,(page,offset)对是(4,

保护模式中的PDE与PTE

萝らか妹 提交于 2019-12-02 00:05:47
Windows内核分析索引目录 :https://www.cnblogs.com/onetrainee/p/11675224.html 保护模式中的PDE与PTE 1. PDE与PTE的认知    我们在上一节,10-10-12模式中已经见过下表。    PDT(Page Direcotry Table)y页目录表,其中每一个成员被称为页目录表成员。    PTT(Page Table)页表,其中每一个成员被称为页表成员。       页目录表、页表与物理页,本质上都是页。   10-10-12模式遵循4KB大小的机制,即每一个页大小为4KB。     页目录表与页表存内存,所以可以一共有 1KB = 2^10个;而物理页存储字节,共存2^12个;因此10-10-12分页就是这么来的。 二、向零地址读写内存   我们有编程经验的人知道,零地址其实不可以读写的。   其本质原因是因为 00000000h 这个线性地址对应的物理地址没有挂靠物理页,也即对应的PTE=0,自然物理页索引就不存在。   但是,我们可以通过windbg往0地址中挂靠物理页,这样就很容易实现对零地址的内存读写。 测试代码 1 #include "stdafx.h" 2 3 int main(int argc, char* argv[]) 4 { 5 // 将X的物理页挂靠0地址上 6 int x = 1; 7

内存管理

本小妞迷上赌 提交于 2019-12-01 13:20:26
内存 内存使用: 将程序放到内存中,PC指向开始地址,然后取指执行。 物理内存: 实际内存。 虚拟内存: 1. 每一个运行的进程,都会获得一个内存地址空间,这就是所谓的虚拟内存。 2. 这里面的所有地址都是虚拟的,和物理内存并不直接挂钩。 3. 这些虚拟地址所映射到的实际地址,可以是物理内存地址,也可以是页面文件的地址。 4. 如果物理内存小于这个虚拟地址的范围, 使用的时候可以将内存数据写入页面文件,通过清空内存数据,以提高物理内存的利用效率。 页面文件: 硬盘上的一块空间,在Windows下表现为一个文件。 这个页面文件存在的意义就是在物理内存被占用满以后, 将物理内存中的东西移动到硬盘上,腾出物理内存给需要的应用程序来使用。 内存管理 内存管理和虚拟内存管理: 内存管理包括: 程序装入等概念、 交换技术、 连续分配管理方式、 非连续分配管理方式(分页、分段、段页式)。 虚拟内存管理包括: 虚拟内存概念、 请求分页管理方式、 页面置换算法、页 面分配策略、 工作集、 抖动。 程序装入和链接 编译: 由编译程序将用户源代码编译成若干个目标模块。 链接: 由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块。 装入: 由装入程序将装入模块装入内存运行。 重定向(修改程序中的相对地址): 1. 编译时重定位的程序只能放在内存固定位置 2.

操作系统——分页地址转换

守給你的承諾、 提交于 2019-12-01 09:09:59
分页地址转换 页帧 一个地址连续的4K字节大小单元内存,称为页帧。 也即一个页有4K字节大小。 页帧地址 页桢地址指出了一个实物理页的开始地址。因为页的地址是以4K为边界的,所以地址的低12位总是为0。在页目录中,页桢地址是二级页表的起始地址。在二级页表中,页桢地址是所要要访问的物理页的起始地址,该物理页包含了要访问的指令操作数。 页表 一个页表是由很多32位页指示器组成的一个数组。 一个页表本身也是一个页,大小为4K字节,因此最多包含1K个表项(每个页指示器4字节) 页目录 在寻址一个内存页时,使用了两级的页表。高一级的页表也被叫作页目录。页目录可最多寻址1K个二级页表。一个二级页表最多可寻址1K个页面。所以,一个页目录最多可寻址1M个页面。因为每个页面有4K(2^12)字节大小。所以一个页目录可寻址整个80386的实物理地址空间(2^20 * 2^12 = 2^32)。 来源: https://www.cnblogs.com/Ivan-Luo/p/11675017.html