地址空间细致入微+深入了解页表

目录

地址空间保存了什么?

页表到底是怎么存储的


我们都知道,我们进程看到的空间其实是虚拟内存,真正的内存是需要页表的映射才能找到真正的物理内存,那么我我们有两个问题的引出那么进程地址空间是保存了什么呢?页表是将全部地址都映射了对应到页表项吗?

地址空间保存了什么?

其实地址空间的每个区保存了两个地址。我们拿堆区做例子

mm_struct对堆区其实也只是保存了这个堆区使用的开始与结束,再mm_struct中其实有一个指针,指针指向着一个链双向边表的起始位置

vm_area_struct这个是个结构体

<include/linux/mm_types.h>
struct vm_area_struct {/* The first cache line has the info for VMA tree walking. */unsigned long vm_start;     /* Our start address within vm_mm. */unsigned long vm_end;       /* The first byte after our end addresswithin vm_mm. */
/*[vm_start, vm_end) 这么个情况,表示一块虚拟内存空间*//* linked list of VM areas per task, sorted by address */struct vm_area_struct *vm_next, *vm_prev;
/*在mm->mmap链表中前后节点*/struct rb_node vm_rb;
/*插入到mm->mm_rb红黑树的节点*//** Largest free memory gap in bytes to the left of this VMA.* Either between this VMA and vma->vm_prev, or between one of the* VMAs below us in the VMA rbtree and its ->vm_prev. This helps* get_unmapped_area find a free area of the right size.*/unsigned long rb_subtree_gap;
/*以当前vma为根,左子树中最大可用虚拟内存区域的大小*//* Second cache line starts here. */struct mm_struct *vm_mm;    /* The address space we belong to. */
/*同一进程所有的vma指向的vm_mm是相同的*/pgprot_t vm_page_prot;      /* Access permissions of this VMA. */
/*访问权限*/unsigned long vm_flags;     /* Flags, see mm.h. */
/*属性,详看mm.h*//** For areas with an address space and backing store,* linkage into the address_space->i_mmap interval tree.** For private anonymous mappings, a pointer to a null terminated string* in the user process containing the name given to the vma, or NULL* if unnamed.*/union {struct {struct rb_node rb;unsigned long rb_subtree_last;} shared;const char __user *anon_name;};/** A file's MAP_PRIVATE vma can be in both i_mmap tree and anon_vma* list, after a COW of one of the file pages.  A MAP_SHARED vma* can only be in the i_mmap tree.  An anonymous MAP_PRIVATE, stack* or brk vma (with NULL file) can only be in an anon_vma list.*/struct list_head anon_vma_chain; /* Serialized by mmap_sem &* page_table_lock */struct anon_vma *anon_vma;  /* Serialized by page_table_lock *//* Function pointers to deal with this struct. */const struct vm_operations_struct *vm_ops;
/*该vma操作函数,包括打开、关闭、建立映射三个函数*//* Information about our backing store: */unsigned long vm_pgoff;     /* Offset (within vm_file) in PAGE_SIZEunits */struct file * vm_file;      /* File we map to (can be NULL). */
/*文件映射的文件信息,匿名映射为NULL*/void * vm_private_data;     /* was vm_pte (shared mem) */atomic_long_t swap_readahead_info;
#ifndef CONFIG_MMUstruct vm_region *vm_region;    /* NOMMU mapping region */
#endif
#ifdef CONFIG_NUMAstruct mempolicy *vm_policy;    /* NUMA policy for the VMA */
#endifstruct vm_userfaultfd_ctx vm_userfaultfd_ctx;
#ifdef CONFIG_SPECULATIVE_PAGE_FAULTseqcount_t vm_sequence;     /* Speculative page fault field */atomic_t vm_ref_count;      /* see vma_get(), vma_put() */
#endif
} __randomize_layout;

mm_struct中有个指针mmap指向由vm_area_struct构成的双向链表的头节点。

堆的数据范围其实就是vm_area_struct的多个结构体。

页表到底是怎么存储的

页帧与页框

页帧就是源文件编译完成后存储在磁盘的存储单位,也是以进程地址空间的方式进行编译的。

页框就是物理内存存储单位也是以4kb为单位的存储方式。

计算得知,我们的物理内存页框一共有:1024*1024*1024*4/1024=100w个页框,实际就是1024*1024。

 进程创建/打开文件步骤:

  1. 页表映射,查看对应数据是否在磁盘上。
  2. 发现对应数据存放在磁盘上,然后将数据加载到物理内存中
  3. 然后我们的将页表项的物理映射改为刚刚加载的物理内存地址

这其实就是缺页中断


但是有个问题,32位机器下,虚拟内存有2^32个地址,难道页表需要开辟2^32项吗?

假设一页项有10字节

2^32*10=40G。

但是我们的物理内存就4G,我去哪里搞剩下空间???所以页表其实也是一种复杂的结构,是一种多级页表映射关系。

随便写个虚拟地址0B0000 0000 0100 0000 0030 0000 0000 0012

 这就是实际的页表,这就是虚拟地址的查询逻辑。

假设,一二级页表每个页项20字节

20*1024*1024+1024*20=20MB。一个进程页表最多用这么多空间,相比之前40G好太多了。

一个知识点,二级页表并不是全部都有1024个,而是用按需申请使用。而一级页表是一定需要的。树根都没了,其他都是扯淡。

所以20MB只是最大,而不是一定是

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

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

相关文章

HCIP中期考试实验

目录 考试需求 公司分部&#xff1a; 公司总部&#xff1a; 公司骨干网&#xff1a; 优化&#xff1a; 实验步骤&#xff1a; 步骤一&#xff1a;跟具题意配置IP地址&#xff0c;并创建拓扑 R1~R9配置 R10 &#xff1a;配置同时划分VLAN LSW4&#xff1a;划分VLAN交换…

Android 面试题 虚拟机、进程、线程 七

&#x1f525; 安卓虚拟机 &#x1f525; 虽然Android程序是使用Java语言开发的&#xff0c;当然&#xff0c;现在也可以使用kotlin语言。但是实际上我们开发出来的Android程序并不能运行在JVM上&#xff0c;而是只能运行在一个类似JVM的Android虚拟机上。Android虚拟机有两种&…

Spring Boot 日志

Spring Boot 日志 ​ 在 Spring Boot 里面是有一个内置了的日志框架的&#xff0c;所以才能运行的时候在控制台打印出来。默认情况下的日志是系统定义和打印的&#xff0c;但我们也可以自行自定义打印日志。 日志的好处&#xff1a; 1、发现问题和定位问题&#xff1b;☆&am…

QT编写的串口助手

QT编写的串口助手 提前的知识 创建UI界面工程 找帮助文档 添加串口的宏

亚马逊品牌推荐金计划:通过亚马逊外营销活动赚取奖金!

亚马逊美国站发布公告称新推出的品牌推荐金计划可以让卖家在通过亚马逊外营销活动的销售中获得奖金&#xff0c;当卖家将非亚马逊营销流量引导至亚马逊时&#xff0c;您将获得促销产品以及客户在接下来的两周内购买的任何品牌产品平均销售额的10%的奖金&#xff0c;以下是公告内…

【NLP】训练chatglm2的评价指标BLEU,ROUGE

当进行一定程度的微调后&#xff0c;要评价模型输出的语句的准确性。由于衡量的对象是一个个的自然语言文本&#xff0c;所以通常会选择自然语言处理领域的相关评价指标。这些指标原先都是用来度量机器翻译结果质量的&#xff0c;并且被证明可以很好的反映待评测语句的准确性&a…

ubuntu服务器配置ftp服务

需求&#xff1a;配置ftp服务用于在windows电脑上直接浏览、下载、上传ubuntu服务器上的文件&#xff0c;用于文件共享&#xff0c;方便实用 效果&#xff1a;用户打开windows资源管理器后输入ftp://xxx.xxx.xxx.xxx &#xff08;公网IP地址&#xff09;后&#xff0c;即可浏览…

ChatGPT及其工作原理;OpenAI申请注册商标GPT-5,引发关注

&#x1f989; AI新闻 &#x1f680; OpenAI申请注册商标GPT-5&#xff0c;引发关注 摘要&#xff1a;OpenAI已在上月18日申请注册商标GPT-5&#xff0c;显示该模型将提供文本生成、自然语言理解、语音转录、翻译、分析等功能。此前OpenAI曾表示尚未开始训练GPT-4的后继者GPT…

Atlas200DK A2联网实战

文章目录 1.Atlas原始网络信息2. 开发板联网2.1 使用Type-c 连接开发板2.2 修改本地网络适配器2.3 修改开发板网络信息2.4 测试外网连接 1.Atlas原始网络信息 Type-C 网口 ETH0 网口 ETH1 网口 2. 开发板联网 2.1 使用Type-c 连接开发板 使用xshell 等ssh终端登录开发板&…

(树) 剑指 Offer 33. 二叉搜索树的后序遍历序列 ——【Leetcode每日一题】

❓剑指 Offer 33. 二叉搜索树的后序遍历序列 难度&#xff1a;中等 输入一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true&#xff0c;否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树&#xff1…

Linux lvs负载均衡

LVS 介绍&#xff1a; Linux Virtual Server&#xff08;LVS&#xff09;是一个基于Linux内核的开源软件项目&#xff0c;用于构建高性能、高可用性的服务器群集。LVS通过将客户端请求分发到一组后端服务器上的不同节点来实现负载均衡&#xff0c;从而提高系统的可扩展性和可…

PHP正则绕过解析

正则绕过 正则表达式PHP正则回溯PHP中的NULL和false回溯案例案例1案例2 正则表达式 在正则中有许多特殊的字符&#xff0c;不能直接使用&#xff0c;需要使用转义符\。如&#xff1a;$,(,),*,,.,?,[,,^,{。 这里大家会有疑问&#xff1a;为啥小括号(),这个就需要两个来转义&a…

智能制造企业如何建立大客户管理模型?

01、大客户管理依然是智能制造企业经营的黄金定律 《连线》杂志创始人凯文凯利&#xff08;Kevin Kelly&#xff09;在《技术元素》一书中写道&#xff1a;“数量不是目的&#xff0c;质量才是根本&#xff0c;重视1%的超级用户才是提高效率的关键。” 根据“二八定律”&…

filebeat介绍

1、filebeat概述 Filebeat是用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置&#xff0c;收集日志事件&#xff0c;并将它们转发到Elasticsearch或 Logstash或kafka进行索引 1.1 Filebeat两个主要组件 prospector 和 harvester。 prospector&a…

C++---list常用接口和模拟实现

list---模拟实现 list的简介list函数的使用构造函数迭代器的使用list的capacitylist element accesslist modifiers list的模拟实现构造函数&#xff0c;拷贝构造函数和迭代器begin和endinsert和eraseclear和析构函数 源码 list的简介 list是用双向带头联表实现的一个容器&…

C—数据的储存(下)

文章目录 前言&#x1f31f;一、练习一下&#x1f30f;1.例一&#x1f30f;2.例二&#x1f30f;3.例三&#x1f30f;4.例四 &#x1f31f;二、浮点型在内存中的储存&#x1f30f;1.浮点数&#x1f30f;2.浮点数存储&#x1f4ab;&#xff08;1&#xff09;.二进制浮点数&#x…

提高生产线效率:PDM系统的工艺优化智慧

在现代制造业中&#xff0c;提高生产线效率是企业追求高质量和降低成本的重要目标。PDM系统&#xff08;Product Data Management&#xff0c;产品数据管理&#xff09;作为一款强大的数字化工具&#xff0c;发挥着工艺优化智慧的作用&#xff0c;帮助企业实现生产线效率的提升…

C# 回文链表

234 回文链表 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true 示例 2&#xff1a; 输入&…

TPlink云路由器界面端口映射设置方法?快解析内网穿透能实现吗?

有很多网友在问&#xff1a;TPlink路由器端口映射怎么设置&#xff1f;因为不懂端口映射的原理&#xff0c;所以无从下手&#xff0c;下面小编就给大家分享TPlink云路由器界面端口映射设置方法&#xff0c;帮助大家快速入门TP路由器端口映射设置方法。 1.登录路由器管理界面&a…

性能测试/负载测试/压力测试之间的区别

做测试一年多来&#xff0c;虽然平时的工作都能很好的完成&#xff0c;但最近突然发现自己在关于测试的整体知识体系上面的了解很是欠缺&#xff0c;所以&#xff0c;在工作之余也做了一些测试方面的知识的补充。不足之处&#xff0c;还请大家多多交流&#xff0c;互相学习。 …