首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >漫画解说 “内存映射”

漫画解说 “内存映射”

作者头像
用户7686797
发布于 2021-05-11 02:18:27
发布于 2021-05-11 02:18:27
9050
举报
文章被收录于专栏:Linux内核那些事Linux内核那些事

虚拟内存空间与物理内存空间

虚拟内存地址就好比每个班的学号,而物理内存地址就好比真实的学生。因为每个学号都对应不同的学生,所以虚拟内存地址也要映射到物理内存地址。

虚拟内存与物理内存的映射关系是通过 页表 来关联的,如下图:

页表 并不是按字节来进行映射的,而是按照 内存页 为单位进行映射,一般一个 内存页 的大小为 4KB(为什么要加一般呢,这是因为除了4KB,还有其他大小的内存页,如2MB,4MB,1GB等),页表 的每一个 页表项 都保存着物理内存页的地址。

所以,4GB 的虚拟内存空间需要 1MB 大小的页表来关联(因为 4GB / 4KB = 1MB)。也就是说,0 ~ 4095 的虚拟内存地址都是使用 页表 的第一个 页表项 来映射的,而 4096 ~ 8191 的虚拟内存地址使用 页表 的第二个 页表项 来映射的,以此类推...

那么,通过什么样的算法能把 0 ~ 4095 的虚拟内存地址转换为页表的第一个页表项呢?其实很简单,只需要把虚拟内存地址的高端 20 位作为页表的索引,而把低端 12 位作为内存页中的偏移量即可,如下图:

在上图中,还看到了一个 cr3 的东西,这是 CPU 中的一个寄存器,用于保存 页表 的物理内存地址,通过这个寄存器就能找到进程的 页表 了。

现在对内存映射的原理有了比较清晰的了解了,但现在有个问题,每个进程都要 1MB 大小的页表,那不是很浪费内存吗?的确是,因为进程很多虚拟内存地址并不会用到,为了节省页表使用的内存,x86 CPU 把页表分为 2 级,如下图:

如上图所示,把原来的 页表 划分为 页目录页表,它们的大小均为 4KB。而虚拟内存地址的高 10 位作为页目录的索引,而中间 10 位作为页表的索引,低 12 位还是作为物理内存页的偏移量。

把原来的 页表 划分为两级后,进程有些不使用的虚拟内存地址就不需要进行映射,从而节省了内存的使用。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Linux内核那些事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
原 荐 用 ActFramework 写一个
看到 t-io 老谭的 用t-io来写一个网页聊天室或客服是个怎样的体验, 一时手痒, 就打算用 ActFramework 来写一个网页聊天室, 看看是什么体验. 废话少说,撸起袖子就是干。 1. 创建项目 运行下面的命令创建一个新的 ActFramework 应用项目: mvn archetype:generate -B \ -DgroupId=com.myproj \ -DartifactId=chatroom \ -DarchetypeGroupId=org.actframew
老码农
2018/06/20
1.1K0
ActFramework 入门指南
这篇文章,将带你体验并展开一个基本的MVC项目。 (Controller,Service,Dao标准结构)
老码农
2019/07/04
7810
ActFramework 入门指南
Spring 全家桶之 Spring Boot 2.6.4(八)- 嵌入式 Servlet 容器(Part B)
Spring Boot除了支持内嵌的Tomcat Servlet容器,还支持Jetty和Undertow两种Servlet容器
RiemannHypothesis
2022/09/26
6290
Spring 全家桶之 Spring Boot 2.6.4(八)- 嵌入式 Servlet 容器(Part B)
JFinal极速开发框架使用笔记
记录第一次使用JFinal,从简单的框架搭建到增删改查,从自带的方法到正常框架习惯的使用方式。  JFinal官网:http://www.jfinal.com/ JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有ruby、python、php等动态语言的开发效率。 JFinal有如下主要特点: MVC架构,设计精巧,使用简单 遵循COC原则,零配置,无xm
二十三年蝉
2018/02/28
2.8K0
JFinal极速开发框架使用笔记
一些流行Java MVC框架的调用栈
今天在ActFramework群里面谈及了Spring的调用栈, 大家都觉得调用栈太长了影响性能,也不利于调试. 我这边刚好有一个Web框架性能测试项目的代码, 其中有一些常见的Java MVC框架,包括Springboot, JFinal, NinjaFramework等, 我在代码中添加了 new RuntimeException().printStackTrace(); 用来打印调用到应用逻辑(控制器)的调用栈.下面是我的测试结果: ActFramework java.lang.RuntimeExce
老码农
2018/06/27
1.1K0
Spring Boot整合模板引擎
Spring Boot支持FreeMarker模板引擎,它是在Spring MVC基础上加入了自动配置的特性,在使用FreeMarker模板引擎的时候,需要在resources文件夹内建立static文件夹存放静态资源(一般包括css、images、js),还要建立一个templates文件,用于存放FreeMarker模板。
itlemon
2020/04/03
6600
基于Spring Boot 的Blog开发 原
之前写过几篇关于利用Spring MVC来开发的博客,从博客下面的评论以及GitHub上的Issues看还是会出现许多的问题,且大部分的问题都出在配置上。虽然说Spring MVC的配置较SSH简化了不少,但是在使用过程中仍然会觉得配置的吃力。
Gaussic
2018/08/17
5330
基于Spring Boot 的Blog开发
                                                                            原
《Kotin 极简教程》第11章 使用Kotlin 集成 SpringBoot开发Web服务端第11章 使用Kotlin集成SpringBoot开发Web服务端《Kotlin极简教程》正式上架:
我们在前面第2章 “ 2.3 Web RESTFul HelloWorld ” 一节中,已经介绍了使用 Kotlin 结合 SpringBoot 开发一个RESTFul版本的 Hello World。当然,Kotlin与Spring家族的关系不止如此。在 Spring 5.0 M4 中引入了一个专门针对Kotlin的支持。
一个会写诗的程序员
2018/08/17
3.3K0
《Kotin 极简教程》第11章 使用Kotlin 集成 SpringBoot开发Web服务端第11章 使用Kotlin集成SpringBoot开发Web服务端《Kotlin极简教程》正式上架:
Spring Boot(1)-构建应用实践
Spring 框架作为目前非常流行的一个 Java 应用开发框架,它所包含的内容是非常繁多的。Spring 框架包含几十个不同的子项目,涵盖应用开发的不同方面。要在这些子项目之间进行选择,并快速搭建一个可以运行的应用是比较困难的事情。
黄规速
2022/04/14
5180
Spring Boot(1)-构建应用实践
Java学习笔记-全栈-web开发-19-SpringBoot入门项目创建与整合
Spring 框架包含几十个不同的子项目,涵盖应用开发的不同方面。如此多的子项目和组件,一方面方便了开发人员的使用,另外一个方面也带来了使用方面的问题。每个子项目都有一定的学习曲线。开发人员需要了解这些子项目和组件的具体细节,才能知道如何把这些子项目整合起来形成一个完整的解决方案。在如何使用这些组件上,并没有相关的最佳实践提供指导。对于新接触 Spring 框架的开发人员来说,并不知道如何更好的使用这些组件。Spring 框架的另外一个常见问题是要快速创建一个可以运行的应用比较麻烦。
devi
2021/08/18
5910
Spring认证指南:了解如何使用 Spring Security 保护您的 Web 应用程序
本指南将引导您完成使用受 Spring Security 保护的资源创建简单 Web 应用程序的过程。
IT胶囊
2022/03/07
1.4K0
Spring认证指南:了解如何使用 Spring Security 保护您的 Web 应用程序
SpringBoot整合Shiro_HelloWorld
Apache Shiro是一个功能强大、灵活的,开源的安全框架。它可以干净利落地处理身份验证、授权、企业会话管理和加密。
CBeann
2023/12/25
2630
SpringBoot整合Shiro_HelloWorld
Spring Security 入门(五):在 Spring-Boot中的应用
前言 本文作为入门级的DEMO,完全按照官网实例演示; 项目目录结构 Maven 依赖 <parent> <groupId>org.springframework.boot</groupId>
程序猿DD
2018/03/26
1.7K0
Spring Security 入门(五):在 Spring-Boot中的应用
《Springboot极简教程》使用Spring Boot, JPA, Mysql, ThymeLeaf,gradle, Kotlin快速构建一个CRUD Web App
使用Spring Boot, JPA, Mysql, ThymeLeaf,gradle, Kotlin快速构建一个CRUD Web App
一个会写诗的程序员
2018/08/20
1.2K0
《Springboot极简教程》使用Spring Boot, JPA, Mysql, ThymeLeaf,gradle, Kotlin快速构建一个CRUD Web App
springboot整合shiro(含MD5加密)写在前面:开发环境:项目开始:
写在前面: 关于shiro介绍以及shiro整合spring,我在另一篇文章中已详细介绍,此处不作说明,请参考spring整合shiro。 开发环境: 1、mysql - 5.7.21 2、navicat(mysql客户端管理工具) 3、idea 2017 4、jdk9 5、tomcat 8.5 6、springboot 7、mybatis 3 8、shiro 9、maven 项目开始: 一、数据库设计: 注:数据库三张表和spring整合shiro中的一模一样,在那边已经详细说明,这里直接
贪挽懒月
2018/05/18
10.5K0
第7章 Spring Boot集成模板引擎小结
因为Spring Boot其实是对Spring生态的封装整合打包,以简化开发中使用Spring框架。所以 Spring Boot在集成模板引擎过程中,其实就是对传统SpringMVC集成对应模板引擎的打包自动化配置。
一个会写诗的程序员
2018/08/20
2.6K0
第7章 Spring Boot集成模板引擎小结
Spring Boot 模拟登陆功能
一个系统,离不开用户的鉴权。本文,我们来讲讲怎么通过 Spring Boot 实现模拟登陆功能~
Jimmy_is_jimmy
2023/07/09
3290
Spring Boot 模拟登陆功能
Spring Boot 与 kotlin 使用Thymeleaf模板引擎渲染web视图
在我们开发Web应用的时候,需要引用大量的js、css、图片等静态资源,使用Spring Boot 与 kotlin如何去支持这些静态资源?,很简单。
全科
2018/08/15
1.6K0
Spring boot之hello word
环境准备 一个称手的IDE(首选Myeclipse,也可以选Eclipse) Java环境(JDK 1.7或以上版本) Maven 3.0+(Eclipse和Idea IntelliJ内置,如果使用I
xiangzhihong
2018/02/05
6730
Jetty入门
总述 同tomcat一样,jetty也是一个servlet引擎,jetty的神奇之处在于,jetty不仅可以作为一个web应用的容器,它甚至还可以作为一个程序中的插件来通过main函数加载web应用程序本身。 Jetty 是一个 Web server/servlet container, 支持 SPDY,WebSocket, OSGi, JMX,JNDI, JAAS 。Jetty非常高效而且灵活,Google App Engine 选择了Jetty,而放弃了Tomcat,或是其他的服务器。 Jetty ha
SecondWorld
2018/03/14
1.8K0
Jetty入门
推荐阅读
相关推荐
原 荐 用 ActFramework 写一个
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档