页表

一个操作系统的实现笔记:利用内存的大小设置页表的个数

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-04 15:07:11
这篇文章不长,主要是末尾的代码长,代码有兴趣可以看,没兴趣的看看文章内容便可。 利用内存的大小设置页表的个数的公式是:页表个数=内存大小÷4MB。 为什么是这样呢?首先,80386一个页的大小是4KB,页是通过页表来找到的,而一个页表中有1024个页,所以一个页表对应的物理内存就是4MB,所以页表个数=内存大小÷4MB,这样我们就可以克勤克俭用内存啦。 计算页表个数的代码是这几行: SetupPaging: ; 根据内存大小计算应初始化多少PDE以及多少页表 xor edx, edx mov eax, [dwMemSize] mov ebx, 400000h ; 400000h = 4M = 4096 * 1024, 一个页表对应的内存大小 div ebx mov ecx, eax ; 此时 ecx 为页表的个数,也即 PDE 应该的个数 test edx, edx jz .no_remainder inc ecx ; 如果余数不为 0 就需增加一个页表 其中[dwMemSize]中保存着内存大小的数值,获得内存的大小是程序的主要部分。 此程序采用调用15h中断获得内存大小,在调用中断15h之前,需要填充如下寄存器: ①eax:int 15h可完成许多工作,主要由ax的值决定,我们想要获取内存信息,需要将ax赋值为0E820h。 ②ebx:放置着“后续值(continuation

Linux内存管理(上)

天大地大妈咪最大 提交于 2020-02-04 04:00:08
摘要 : 本章首先以应用程序开发者的角度审视 Linux 的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存地使用方法。力求从外自内、水到渠成地引导网友分析 Linux 地内存管理与使用。在本章最后我们给出一个内存映射地实例,帮助网友们理解内核内存管理与用户内存管理之间地关系,希望大家最终能驾驭 Linux 内存管理。 前言 内存管理一向是所有操作系统书籍不惜笔墨重点讨论的内容,无论市面上或是网上都充斥着大量涉及内存管理的教材和资料。因此我们这里所要写的 Linux 内存管理采取必重就轻的策略,从理论层面就不去板门弄斧,贻笑大方了。我们最想做的和可能做到的是以开发者的角度谈谈对内存管理的理解,最终目的是把我们在内核开发中使用内存的经验和对 Linux 内存管理的认识与大家共享。 当然这其中我们也会设计一些诸如段页等内存管理的基本理论,但我们目的不是为了强调理论,而是为了指导理解开发中的实践,所以仅仅点到为止,不做深究。 遵循“理论来源于实践”的“教条”,我们先不必一下子就钻入内核里去看系统内存到底是如何管理,那样往往会让你陷入似懂非懂的窘境(我当年就犯了这个错误!)。所以最好的方式是先从外部(用户编程范畴)来观察进程如何使用内存,等到对大家内存使用有了较直观的认识后,再深入到内核中去学习内存如何被管理等理论知识。最后再通过一个实例编程将所讲内容融会贯通。

操作系统5——存储器管理

旧巷老猫 提交于 2020-02-03 02:27:01
存储器管理 目录 存储器管理 1、程序的装入与链接 (1)程序的装入 (2)程序的连接 2、连续分配存储管理方式 (1)单一连续分配 (2)固定分区分配 (3)动态分区分配 (4)可重定位分区分配 (5)对换 3、分页和分段方式及其概述 (1)为什么要用分页和分段方式? (2)分段与分页的去区别 4、基本分页存储管理方式 (1)页面与页表 (2)页表 (3)地址变换 (4)地址变换机构 (5)具有块表的地址变换机构 (6)两级页表 (7)反置页表 5、基本分段存储管理方式 (1)分段与分页的区别: (2)分段的基本原理 (3)段表 (4)段表访问数据的过程 6、基本段页式存储管理方式 本章知识点流程图: 层次越高,越靠近CPU,访问速度越快,价格越高。 内存掉电之后信息不保存,除非已经写入到外存中。 1、程序的装入与链接 (1)程序的装入 多道程序环境下,程序要运行必须为之创建进程,而创建进程的第一件事就是分配内存。 将一个装入模块装入内存(第三步开始)时,有三种装入方式: 重定位: 把在装入时对目标程序中指令和数据的地址修改过程称为重定位。 (2)程序的连接 2、连续分配存储管理方式 连续分配方式为一个用户程序分配一个连续的内存空间 连续分配有以下几种: (1)单一连续分配 即将内存分为 系统区和用户区 ,整个内存的用户空间由该程序独占。 优点:易于管理 缺点

32位Linux系统虚拟地址映射

不羁岁月 提交于 2020-02-02 12:37:02
IA32体系即Intel32位体系架构,也被称为i386、X86-32或X86。在Intel公司1985年推出的80386微处理器中首先使用。用以取代之前的X86-16位架构,包括8086、80186、80286芯片。谈到这儿,就不得不说说X86架构的发展历史。 Intel 8086是由Intel于1978年所设计的16位微处理器芯片,是x86架构的鼻祖。8086是16位CPU,数据总线16条,地址总线20条,能保存的地址的大小是2^20=1M。 8086增加了4个段寄存器用来保存各内存段的起始地址,这4个段寄存器分别为CS(代码段寄存器)、DS(数据段寄存器)、SS(堆栈段寄存器)、ES(扩展段寄存器)。 由于地址总线共20条,段地址有20位,但是段寄存器只有16位,不能保存20位的地址。 因此,将内存的大小划分为16的倍数(此时还没有操作系统,直接操作的是物理内存)。每块内存起始地址的后四位都为0,段寄存器只保存地址的高16位。正如前面所讲,8086时,地址总线最多只能保存1M的地址空间。 此时,物理内存=段基址+逻辑地址/偏移量。 此时若要取数据,就需要找到物理内存,方法为从DS寄存器中取值,左移4位,就得到了真正的起始地址(DS<<4),再加上变量在该内存段上的偏移量(IP寄存器保存了当前数据在内存段上的偏移量),就得到了数据的物理内存。 DS<<4 + IP =

ucore lab2 练习2&3

三世轮回 提交于 2020-02-02 09:24:41
ucore lab2 练习2&3 回忆一下之前的练习1,我们填写了default_pmm.c中的一些函数,也实现了内存分配的first fit算法。但是,其实我们并不是很清楚,default_pmm.c这个文件在整个lab2中的位置,也就是说,这个文件中的函数,到底在哪些地方被调用了呢?想要解决这个问题,首先要搞清楚物理内存管理器pmm_manager。 1 物理内存管理器pmm_manager pmm_manager在pmm.h中被声明: struct pmm_manager { const char * name ; void ( * init ) ( void ) ; void ( * init_memmap ) ( struct Page * base , size_t n ) ; struct Page * ( * alloc_pages ) ( size_t n ) ; void ( * free_pages ) ( struct Page * base , size_t n ) ; size_t ( * nr_free_pages ) ( void ) ; void ( * check ) ( void ) ; } ; 这里出现了函数指针,这是以前我们比较少接触的,它是实现面向对象编程的一种很重要的手段,因为它给提供了接口,而在实现这些接口的时候

虚拟存储

浪子不回头ぞ 提交于 2020-01-31 21:30:54
前面的物理内存管理是关于如何给进程分配一块物理内存空间。非连续内存分配是在内存里找存储空间,虚拟存储是在非连续内存存储的基础上,把一部分内容放到外存里的做法,可以让应用程序可使用更大的空间。 用户看到的只是抽象的地址空间,操作系统自动做抽象地址空间映射到存储介质的使用。 内存空间不足,有三种解决方法。 覆盖:一个程序在所有内存空间里内存不够,程序员将一个进程分成多个模块。操作系统不知道进程内模块的逻辑关系 下图展示了覆盖技术实例。物理内存不够190k,就将这个程序分成3组,A自己一组;B、C互相无调用关系,为一组;D、E、F相互无调用关系(不会同时执行),为一组。分配存储空间:A给20k,B、C分50k,D、E、F给40k。B或C(D或E或F)调用谁就把谁放入内存,把其他的挪出去。 交换:是以进程为单位的交换技术。一个程序在内存空间里够用,但多道程序运行过程中其他程序占用了内存空间使这个程序内存空间不够。可以让操作系统完成 交换和覆盖的比较 虚拟存储技术 (1)目标 上面是虚拟的抽象的进程地址空间,下面是实际的物理内存和外存,中间由操作系统完成相应转换。只把部分进程放入内存,不像交换是以整个进程为单位;同时不需要程序员参与。 (2)局部性原理 (3)概念 (4)虚拟页式存储 之前的页式存储是把程序的所有页都加载到内存中,存储可以不连续。 虚拟页表

计算机系统大作业

半城伤御伤魂 提交于 2020-01-27 00:59:48
计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 计算机类 学   号 1180300412 班   级 1803004 学 生 yiguanghui 指 导 教 师 计算机科学与技术学院 2019年12月 摘 要 关键词:计算机系统、编译链接、异常控制流、虚拟内存 摘要:本文较详细地跟踪介绍了hello.c在Linux下的生命周期,从被程序员创建,到在系统上运行,然后输出简单的消息,最后终止。本文通过计算机系统课程中相关的知识来分析hello.c在Linux开发工具下经历预处理、编译、汇编、链接、加载、执行、终止、回收等过程和结果,跟踪程序的链接、进程创建及加载、虚拟内存转换、高速缓存访问、异常控制流、I/O管理等过程。 目 录 第1章 概述… - 4 - 1.1 Hello简介… - 4 - 1.2 环境与工具… - 4 - 1.3 中间结果… - 4 - 1.4 本章小结… - 4 - 第2章 预处理… - 5 - 2.1 预处理的概念与作用… - 5 - 2.2在Ubuntu下预处理的命令… - 5 - 2.3 Hello的预处理结果解析… - 5 - 2.4 本章小结… - 5 - 第3章 编译… - 6 - 3.1 编译的概念与作用… - 6 - 3.2 在Ubuntu下编译的命令… - 6 - 3.3 Hello的编译结果解析… - 6 - 3.4

保护模式 x86 TLB

大兔子大兔子 提交于 2020-01-26 08:34:43
TLB 文章目录 TLB TLB结构 TLB种类 实验 思考: 通过一个线性地址0x12345678访问一个物理页,我们想要读取0x12345678地指处一个字节的数据时, 操作系统是真的只读了一个字节吗? 答:线性地址首先会被拆分,然后读取PDE(4字节),再读取PTE(4字节),最后读取物理页上的1字节,总共读取了8+1字节. 补充提问: 会不会有这种情况,DWORD 大小数据,前两个字节在一个物理页,后两个字节在另一个物理页, 这样当我要读取这DWORD字节大小的数据时,总共读取了多少字节? 答:这种情况肯定存在,并且也存在1个字节在单独物理页,其他三个在一个这种情况,但是不存在连续三个字节存储在分离的物理页的情况.上面说的那种情况,读取4字节PDE,4字节PTE,2字节数据,重复一遍,总共20个字节, 如果是2-9-9-12分页模式, 就会多读8+8+8 = 24字节 这样的效率是非常低的! 为此CPU在内部做了一个表,来记录这些东西 这个表格是CPU内部的,和寄存器一样快 这个表格: TLB (Translation Lookaside Buffer) 思考: 任何一个进程都有4G大小的独立空间,那其中的线性地址最大能有4G个,但是TLB是存储在CPU内部的,大小受限,最多存储几百条记录, 那这几百条相对与4G少之又少,请思考这几百条的意义? TLB结构 LA(线性地址)

存储管理——段式存储管理

故事扮演 提交于 2020-01-25 22:19:58
一、基本思想 分段存储器的逻辑地址由两部分组成 段号:单元号 注:段号加单元号是用户自己设置,而页号加单元号由系统自己切割的。 段式存储管理基于可变分区存储管理实现,一个进程要占用多个分区。 硬件需要增加一组用户可见的段地址寄存器(代码段、数据段、堆栈段、附加段),共地址转换使用 段式存储管理需要增加设置一个段表,每个段占用一个段表项,包括:段始址,段限长,以及存储保护、可移动、可扩充等标志位。 二、地址转换 三、段的共享 不同进程段表中的项指向同一个段基址来实现,对共享段的信息必须进行把平湖,如规定只能读出不能写入,不满足保护条件则产生保护中断,不论是代码段还是数据段,都没要求段号相同 四、段式虚拟存储管理 1、段式虚拟存储管理的基本思想 在进程装入时,把进程的所有分段都存在辅存中,进程运行时先把当前需要的一段或几段装入主存,在执行过程中访问到不在主存的段时再把它们动态装入 段式虚拟存储管理中段的调进调出是由OS自动实现的。 与段覆盖技术不同,段覆盖技术是用户控制的主存扩充技术,OS不感知。 2、段式虚拟存储管理的段表扩充 段表的扩充 特征位:00(不在内存)01(在内存)11(共享段) 存取权限:00(可执行)01(可读)11(可写) 扩充位:0(固定长)1(可扩充) 标志位:00(未修改)01(已修改)11(不可移动) 3、段式虚拟存储管理的地址转换 五、段页式存储管理 1

内存管理

柔情痞子 提交于 2020-01-24 20:02:59
  在Intel 80x86体系结构中,Linux内核的内存管理程序采用了分页管理机制.利用页目录和页表结构处理内核中其他部分代码对内存的申请和释放操作.内存的管理是以内存页面为单位进行的,一个内存页面是指在地址连续的4KB内存.通过也目录项和页表项,可以寻址和管理指定页面的使用情况.   在Intel 80x86 CPU中,程序在寻址过程中使用的是由段和偏移值构成的地址.该地址并不能直接用来寻址物理内存地址,因为被称为 虚拟地址 .为了能寻址物理内存,就需要一种地址转换机制将虚拟地址映射或转换到物理内存中,这种地址转换机制就是内存管理的主要功能之一.内存管理的另外一个重要功能就是内存的值保护机制.虚拟地址通过段管理机制首先变换成一种中间地址形式–CPU32位的线性地址,然后使用内存管理机制将此线性地址映射到物理地址.   在Intel 80x86的系统中,内存管理是通过 页目录表 和 内存页表 所组成的二级表进行.    其中页目录表和页表的结构是一样的,表项结构也相同的.页目录表中的每个表项4B用来寻址一个页表,而每个页表项4B用来指定一页物理内存页面.因此,当指定了一个页目录项和一个页表项,我们就可以唯一确定所对应的物理内存页.页目录表占用一页内存,因此最多可以寻址1024个页表.而每个页表也同样占用一页内存,因此以页表可以寻址最多1024个物理内存页面.这样在80386中