Linux内存page,Linux虚拟内存管理 - Page Table的作用

虚拟内存的作用:

1.

扩展实际有限的物理内存,当然这种扩展是虚拟的,比如物理内存512M,对于一个需要1G空间的进程来说,照样可以运行。这增加了操作系统是应用范围。

2.

使得进程中的数据空间增大,增大到多少与硬件有关,对于一个32位的芯片,进程中的数据空间可以为4G[2^32],对于64位的芯片则支持2^64大小

的空间。这一点使得进程自身可操作的空间大大增加。

通俗来讲,虚拟内存的管理的核心是解决如何在小的物理内存中运行更大程序的问题。

在Linux中,解决这个问题的关键是一个叫做page

table[PT页面转换表]的结构。Linux把物理内存分为了固定统一大小的块,称为page[页],一般为4KB,并且每个页都有一个编号

[page frame

number]。这样一个512M大小的内存将包括128K个页。这种方式称为paging,使得操作系统对内存的管理更方便。page

table的作用就是将进程操作的地址[虚拟地址]转换成物理地址。

其原理很简单,如下:

用一个32位芯片的系统为例[64位同理],运行的每个进程的可操作数据空间为2^32,即2^20个页,设其物理内存为512M,则物理页有

2^17个,现在就说明如何将2^20个页放入2^17个页中运行。我们把进程操作的地址分为两部分,第一部分为地址的高20位,第二部分为后12位,这

样很容易将第一部分理解为虚拟页标号,第二部分理解为在页中的offset。那么现在我们只需将虚拟页标号对应到物理页号即可,这个对应就是page

table的工作,在这个例子中page

table包括了2^20个记录,每个记录有两部分组成:20位的虚拟标号和17位的物理标号,这样CPU用进程地址的第一部分作为索引找到对应的17位

物理标号,与地址的第二部分一起便组成一个29位的地址,这个地址就是要找的物理地址。因为物理页少于虚拟页,所以page

table中的有些记录的后17位是空的或无效的。

利用这个方法,使得运行的进程无需知道自己操作的地址是虚拟的,和运行在一个真实的大物理内存中效果是一样的。

可以看出,在进程的运行过程中,page table必须一直保存在内存中,在上面的例子中,我们把虚拟地址分了2层,page

table有2^20个记录,需要1M左右的空间,为了节省空间我们可以将地址分为3层,第一层10位,需要1K左右的空间,第二层10位,需要1K左右

的空间,第三层12位,这样在一段时间内只需要2K的空间保存page

table。实际上,Alpha的芯片采用的就是这种3层的分法,Intel的芯片采用的2层的分法。

page-tables.gif

Figure: Three Level Page Tables

Linux assumes that there are three levels of page tables.

Each Page Table contains the page frame number of the next level of Page Table. The

Figure above shows how a virtual address can

be broken into a number of fields; each field providing an offset into a

particular Page Table.

To translate a virtual address into a physical one, the processor must take the

contents of each level field, convert it into an offset into the physical

page containing the Page Table and read the page frame number of the next level of Page

Table.

This is repeated three times until the page frame number of the physical page

containing the virtual address is found.

Now the final field in the virtual address, the byte offset, is used to

find the data inside the page.

Each platform that Linux runs on must provide translation macros that allow

the kernel to traverse the page tables for a particular process.

This way, the kernel does not need to know the format of the page table entries or

how they are arranged.

This is so successful that Linux uses the same page table manipulation code for

the Alpha processor, which has three levels of page tables, and for Intel x86 processors,

which have two levels of page tables.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

entitymanager_实体管理器的类型:应用程序管理的EntityManager

entitymanagerJPA规范定义了几种类型的EntityManagers / Persistence Context。 我们可以有: 扩展和事务范围的EntityManager, 容器管理或应用程序管理的EntityManager。 JTA或本地资源EntityManager, 除了上述区别之外,我们还…

linux安装无法添加挂载,linux-无法在已挂载/ etc / passwd和/ etc / shadow的docker容器中添加新用户...

问题示例:docker run -ti -v my_passwd:/etc/passwd -v my_shadow:/etc/shadow --rm centos[root681a5489f3b0 /]# useradd test # does not work !?useradd: failure while writing changes to /etc/passwd[root681a5489f3b0 /]# ll /etc/passwd /etc/shadow # pe…

CDI中的事务异常处理

在Java EE中,在执行事务性业务方法期间引发的异常导致事务回滚。 但是,只有系统异常(即运行时异常)才是这种情况,该方法异常未在方法签名中声明。 对于应用程序异常(即检查的异常)或任何带Appl…

openoffice+linux+jodconverter+乱码,OpenOffice安装和转换乱码解决方案

前言:OpenOffice项目中用途:word转换pdfWindows安装、转换:安装包下载后一路OK就可以正常安装,转换没有问题Linux安装、转换:安装有分DEB包和RPM包,下面会说明各自安装方法在en_US.UTF-8 系统环境下会出现乱…

linux常用操作符,Shell常用操作符总结

一、算术操作 - * / %二、关系操作> < ! && ||三、测试操作测试命令 : test [ ] [[ ]] (( ))1、测试文件状态-d 目录-b 块设备-s 文件长度 > 0、非空-f 正规文件-w 可写-L 符号连接-u 文件有 suid 位设置-r 可读…

junit 参数化测试用例_JUnit:在参数化测试中命名单个测试用例

junit 参数化测试用例几年前&#xff0c;我写了有关JUnit参数化测试的文章 。 我不喜欢它们的一件事是JUnit使用数字命名了单个测试用例&#xff0c;因此&#xff0c;如果它们失败&#xff0c;您将不知道是哪个测试参数导致了失败。 以下Eclipse屏幕快照将向您展示我的意思&…

华硕台式机安装linux进不去系统,[已解决]求助,无法进入系统

之前一直用arch系统盘&#xff0c;Windows系统盘是在另一台电脑上的&#xff0c;我另外一台电脑昨天摔了&#xff0c;我还以为是硬盘坏了&#xff0c;把这块windows硬盘换到这台华硕主板的电脑&#xff0c;发现硬盘没坏。我于是把windows硬盘从机箱拿出来&#xff0c;现在碰到了…

处理JAX-RS中的自定义异常类型

JAX-RS支持处理自定义异常&#xff08;以EJB或CID Bean形式抛出&#xff09;以处理自定义HTTP响应。 假设我们有一个“异常” EJB&#xff1a; Stateless public class Hello {public String greeting() {if (new Random().nextBoolean())throw new GreetingException("…

MX250和第三方Linux版区别,MX250和MX350哪个好一点,区别和差距在哪里?求推荐?_科技数码通...

MX350系列显卡使笔记本颜值变得更高&#xff0c;性能更强&#xff0c;更轻便&#xff0c;在轻便笔记本需求变得越来越大&#xff0c;但性能也要求越来越高&#xff0c;特别是在图像处理方面&#xff0c;这个时候MX系列的显卡便应运而生&#xff0c;其拥有者超低的功耗&#xff…

linux r包默认安装位置,R-Language(R语言或称r-project)的安装

1、R语言的简介R语言(r-project)是主要用于统计分析、绘图的语言和操作环境。2、配置yum源2.1、安装说明由于编译安装相对繁琐&#xff0c;故而安装使用repoforge的源解决&#xff0c;免去编译的麻烦。注意&#xff1a;请根据实际的系统OS版本选取合适的YUM源。2.3、rpmforge源…

aws s3 命令行_通过命令行界面使用AWS ElasticMapReduce

aws s3 命令行在本文中&#xff0c;我将通过使用EMR的CLI使用AWS MapReduce服务&#xff08;称为ElasticMapReduce &#xff09;。 使用EMR的过程可以大致分为三个步骤&#xff1a; 设置并填充S3存储桶 创建并运行EMR作业 从S3存储桶中获取结果 在开始这三个高级步骤之前&…

在5分钟内将Spring Boot作为Windows服务启动

最近&#xff0c;我不得不将Spring Boot应用程序部署为Windows服务&#xff0c;并且对使用winsw如此容易感到惊讶。 我之前曾写过关于使用procrun – Java程序作为Windows服务的文章 &#xff0c;但是winsw更加容易 入门 Spring Boot文档的第59节是有关安装Spring Boot应用程序…

linux下用c语言打印hellword,用C语言写一个Helloworld_实现第一步编译运行

asp&period;net在线预览txt文件&lpar;简单实现&rpar;最近在做文件的在线预览,发现txt文件没有一个较好的方法去实现,想了想可能是比较简单就直接在后台输出了 txt文件Windows 环境下基于 Redis 的 Celery 任务调度模块的实现搭建环境: Windows-x64 10 Celery 3.1.2…

c语言自动计算时间,C语言 · 计算时间

【工业串口和网络软件通讯平台&lpar;SuperIO&rpar;教程】四&period;开发设备驱动SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1 开发准备 把“开发包”内的所有文件复制到项目的“bin”目录下,或项目下的专用生成目录.开发包 ...java compiler leve…

matchers依赖_Hamcrest Matchers,Guava谓词和Builder设计模式

matchers依赖通常&#xff0c;在编码时&#xff0c;我们必须处理其中包含数十个字段的一些POJO对象。 很多时候&#xff0c;我们通过一个带有数十个参数的构造函数来初始化这些类&#xff0c;这以任何可能的想象的方式都是可怕的。 除此之外&#xff0c;使用这些构造函数的函数…

8255编程c语言程序,51单片机8255驱动C程序

/*----------------------------------------------------------------------------------------------------------------库文件名称&#xff1a;driver8155.h功能描述&#xff1a;驱动8155&#xff0c;不需要了解8255的工作原理&#xff0c;透明操作8255的三个输入输出口PA、…

如何编写更少,更好的代码,或Project Lombok

我长期以来一直打算撰写有关Lombok项目的文章 &#xff0c;以至于每当一个自重的Java开发人员都已经听说过它时&#xff0c;我可能会写它。 尽管如此&#xff0c;值得一提的是&#xff0c;如果只是提醒自己&#xff0c;不要犹豫&#xff0c;尝试性能增强工具并查看它们是否合适…

c语言ue,小话C语言中的cotinue和break

#includeint fun(){ printf("fun\n");return 1;}int main(int argc,char *argv[]){int c0;printf("please input your num ,case 3 to break\n");do{scanf("%d",&c);switch(c){case 0:break; /*这里的break只会跳出swtich*/case 1:continue;…

c语言 at指令,学渣求指教,如何识别字符串中的AT命令并逐个输出,求程序!!!...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Topic – to implement a parser to retrieve AT command line and print out (1) the tokensone by one and (2) the elapse time of each command line (processing).Please submit the solution in 48 hours.- The solution cou…

defender 删除_Java 8中的默认方法(Defender方法)简介

defender 删除我们都知道Java中的接口仅包含方法声明&#xff0c;而没有实现&#xff0c;并且任何实现该接口的非抽象类都必须提供实现。 让我们看一个例子&#xff1a; public interface SimpleInterface {public void doSomeWork(); }class SimpleInterfaceImpl implements …