内存管理---分页机制

news2024/10/2 18:20:43

目录

物理内存管理带来的问题

直接映射

一级页表

二级页表


参考:

(C语言内存七)分页机制究竟是如何实现的? - Smah - 博客园

物理内存管理带来的问题

  • 比如4GB的flash, 如果应用程序可直接访问物理内存,那么可能一个非法的操作会导致程序无法正常工作,常见于跑裸机的单片机程序。
  • 而操作系统为了保护程序可正常运行,引入了虚拟内存的概念,换句话说:对应用程序来讲:操作的内存是虚拟内存。
  • 而操作系统做的事情就是把虚拟内存映射到物理内存。那么如何映射就是需要设计的关键。即物理地址 = func_map(虚拟内存); 这个func_map就叫页表,以下有常见的现有的设计实现

直接映射

  • 页表方案:比如一个4GB的flash,那么需要2^32个地址去访问,而地址从0-2^32,这么大的数需要4字节的数据去存,也就是需要 uint64 flash[2^32]; 
  • 内存开销:这样的数组去访问每个物理地址。这样的数组有多大呢? 4*4GB = 16GB, 就是说访问4GB的flash需要16GB的内存,这肯定是不可以的。

这一样的实现是 physical_addr = flash[virtual_addr];

一级页表

  • 页表方案:
  1. 为了减少内存开销,有了分页机制:把4GB的flash,分为一页4K。
  2. 如果需要访问flash的物理地址,需要页数+页内偏移。
  3. 一页大小为4K,需要访问所有内存,即0-2^12,即至少12位来得到偏移量
  4. 而访问所有的页数:4GB/4K = 2^32/ 2^12 = 2^20页,故需要20位来访问所有的页
  5. 综上:可设计虚拟地址的31-12位得到页表数,11-0得到页内的偏移。

这样的实现通过虚拟地址访问物理地址的伪代码如下:

#define PAGE_SIZE 2^12 // 4K大小的页
//通过传入的virtual_addr访问物理地址
uint32 Func_map(uint32 virtual_addr)
{
    // 得到高20位
    uint32 page_Number = virtual_addr & 0xfffff000;  
    // 得到低12位
    uint32 ofst= virtual_addr & 0x00000fff; 
    // 得到页表位置
    uint32 phy_page = page_Number * PAGE_SIZE;
    // 返回页表内存+偏移得到具体的物理位置
    return phy_page + ofst;
}
  • 页表的开销:一个虚拟地址为4字节,共需要4GB/4K = 2^32/ 2^12 = 2^20个虚拟地址,一共占4*2^20字节== 4M,即维护一级页表:可访问4G的物理内存,开销为4M

二级页表

前人又设计了二级页表实现:

  1. 将虚拟地址分割为三分部,高10位作为页目录中元素的下标,中间10位作为页表中元素的下标,最后12位作为页内偏移

  2. 其中通过页表下标和页内偏移得到物理内存地址和一级页表的方法是一样的。
  3. 一级页表可知:4M的页表开销,并不需要完全使用(物理内存用不到4G)。而二级页表就是通过页目录来管理。需要使用物理内存,则通过页目录记录下页表,通过页表访问一段内存。
  4. 页表需要4M来感知4G的物理内存,而页目录需4K+ 页目录4M--》可访问4K个页表。
  5. 一个页目录下标可访问一组页表(页表下标是10位,共2^10个),即可访问2^10个页表,而每个页表配合页内偏移12位( 2^12的地址,即4M的内存),所以一个页目录可访问2^12 * 2^10=4M的内存。
  6. 而一共可以有2^10个页目录,而一个页目录可用2^10个页表,而一个页表占4K,故共可访问2^10 * 2^10 * 4K = 4GB 的物理内存。
  7. 伪代码如下:
    uint32 g_pageDir[2^12]; //4K的页目录
    
    //传入虚拟地址,得到物理地址
    uint32 func_map(uint32 virtual_addr)
    {
        // 得到高10位
        uint32 page_dir= virtual_addr & 0xffC00000;  
        // 得到中10位
        uint32 page_tbl= virtual_addr & 0x002ff000; 
        // 得到低12位
        uint32 ofst= virtual_addr & 0x00000fff;
    
        uint32_t* pageTable = g_pageDir[page_dir];//指向页表块
        uint32 phy_addr = pageTable [page_tbl];  //指向物理块
        return (phy_addr  + ofst);  //得到物理内存的具体位置
    }

综上:可通过32位的虚拟地址 + 二级页表访问4GB的物理内存,

  • 为什么需要额外的4K的页目录来操作物理内存呢?因为实际使用中,我们并不需要用完4GB的flash, 所以并不需要4M的开销。用多少页表生成多少,而需要的额外开销就是找到页表index的页目录,远小于4M+4K,更加灵活。

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

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

相关文章

云小课|基于华为云WAF的日志运维分析,构筑设备安全的城墙

阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说)、深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云。更多精彩内容请单击此处。 摘要:云日志服务用于收集来自主机和云服务的日志数据&#x…

windows安装docker版青龙面板

1.下载docker Docker Desktop 官方下载地址: windows docker 2 管理员运行PowerShell,执行下面的命令(Hyper-V 和容器特性) Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All3.运行第一步下载好的exe 双击下载的 Docker fo…

springboot基于vue.js的掌上博客系统的设计与实现毕业设计源码063131

Springboot掌上博客系统的设计与实现 摘 要 掌上博客系统是当今网络的热点,博客技术的出现使得每个人可以零成本、零维护地创建自己的网络媒体,Blog站点所形成的网状结构促成了不同于以往社区的Blog文化,Blog技术缔造了“博客”文化。 本文课…

恶补了 Python 装饰器的八种写法,你随便问~

对于每一个学习 Python 的同学,想必对 符号一定不陌生了,正如你所知, 符号是装饰器的语法糖,符号后面的函数就是我们本文的主角:装饰器。 装饰器放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个…

Java---File详解

目录 一、File的概述 二、File的创建 三、File的常见成员方法 1:判断和获取 2:创建和删除 (1)createNewFile() (2)mkdir() (3)delete() 3&#xff1a…

高新技术企业认定条件

主要是评估企业的以下几个条件: 一是企业成立满一年以上,并且符合高企八大领域; 二是拥有核心自主知识产权,并且近一年高新产品的收入啊,需要占总收入的60%以上; 三是科技人员占当年职工总数的比例不低于…

mybatis学习:四、关联查询、缓存

7. 关联查询 7.1 准备工作: 数据库表: #订单表: create table tb_order (id INT AUTO_INCREMENT PRIMARY KEY,userid INT,createtime DATETIME,state VARCHAR(20) ) ENGINEInnoDB AUTO_INCREMENT1;#订单详情表 CREATE TABLE tb_orderdetail(…

[附源码]Python计算机毕业设计SSM酒店式公寓服务系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

[LeetCode 1769]移动所有球到每个盒子所需的最小操作数

题目描述 题目链接:[LeetCode 1769]移动所有球到每个盒子所需的最小操作数 有 n 个盒子。给你一个长度为 n 的二进制字符串 boxes ,其中 boxes[i] 的值为 ‘0’ 表示第 i 个盒子是 空 的,而 boxes[i] 的值为 ‘1’ 表示盒子里有 一个 小球。…

Gradle简单配置

写在前面:一开始配置gradle的时候,最好不要把他maven仓库配置在一起,前段时间配置公司项目身心俱疲。大部分公司里面用gradle都是配置的自己的仓库地址,所以有的东西就不要和网上的配置保持一致了,比如说这个仓库地址。…

网站都变成灰色了,它是怎么实现的?

大家好,我是二哥呀。 想必大家都感受到了,很多网站、APP 在昨天都变灰了。 先来感受一下变灰后的效果。 这种灰色的效果怎么实现的呢?如何做到图片、文字、按钮都变灰的效果呢? 方案 1,换一套灰色的 UI,…

Github限时开源24小时,Alibaba架构师内部最新发布SpringCloud开发手册

前言 微服务是SOA之后越来越流行的体系结构模式之一! 如果您关注行业趋势,就会发现,如今商业机构不再像几年前那样,开发大型应用程序,来管理端到端之间的业务功能,而是选择快速灵活的微服务。 ​ 通过微服务&#x…

Unity 之 后处理实现界面灰度效果(PostProcessing实现 | Shader实现)

Unity 之 后处理实现界面灰度效果前言一,Post Processing1.1 设置组件1.2 代码控制二,Shader材质实现2.1 原理API2.2 编写Shader2.3 编写代码2.4 实现效果效果展示前言 在Unity中实现后处理效果有两种方式:一种是通过使用Unity官方提供的Pos…

H3C AC三层组网架构,AP自动上线自动固化

核心交换机: [HX]dis cu [HX]dis current-configuration version 7.1.075, Alpha 7571 sysname HX irf mac-address persistent timer irf auto-update enable undo irf link-delay irf member 1 priority 1 dhcp enable lldp global enable system-working-mode standard xbar…

[附源码]计算机毕业设计仓库管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

C#连接MySql数据库

C#连接MySql数据库 具体步骤如下 第一步:提前将mysql服务打开,用xampp的需要将Mysql服务开启; 第二步:新建一个C#项目 第三步:在项目中下载:MySql.Data的NuGet,作者为Oracle; 第四布…

免息配资天宇优配|世界杯与A股有何关系?券商这样分析!

世界杯与A股有何联系? 卡塔尔世界杯开幕近两周,世界各地球迷热切关注。与此一起,不少金融机构“频频出镜”,多家券商发布了世界杯相关论题研究报告,讨论“世界杯效应”是否存在、世界杯期间是否利好大消费板块等论题。…

代码随想录刷题|LeetCode 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费

目录 309.最佳买卖股票时机含冷冻期 思路 1、确定dp数组以及下标含义 2、确定递推公式 3、初始化 4、遍历顺序 5、获取结果 最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费 思路 买卖股票的最佳时机含手续费 309.最佳买卖股票时机含冷冻期 题目链接:力扣…

Kafka的存储机制和可靠性

Kafka存储机制前言一、Kafka 存储选择二、Kafka 存储方案剖析三、Kafka 存储架构设计四、Kafka 日志系统架构设计4.1、Kafka日志目录布局4.2、Kafka磁盘数据存储五、Kafka 可靠性5.1、Producer的可靠性保证5.1.1、kafka 配置为 CP(Consistency & Partition tolerance)系统5…

【正厚软件】0基础学IT,来Linux的发展历史吧

本文来源:正厚软件沙老师 Linux 的发展历史 1991年林纳斯.托瓦兹开发了Linux内核,宣布它的诞生。 1999年,IBM宣布于RedHat公司建立伙伴关系,以确保RedHat在IBN机器上的正确运行。 2001年,IBM决定投入10亿美元扩大Linux…