linux-----页、页表、页框(块)

内存管理——页表、页表项、页目录、多级页表 我们想申请8M内存,我们就创建2个4K的二级页表。在虚拟地址空间里可按照固定大小来分页,典型的页面粒度为 4 KB,8KB或16KB等,而在物理内存中, 空间也分成和虚拟地址空间大小相同的块, 称为页帧(page frame)。因为页表一定要覆盖全部虚拟地址空间,所以在 32 位的环境下,虚拟地址空间共有 4GB,假设一个页的大小是 4KB(2^12),那么就需要大约 100 万 (2^20) 个页,每个「页表项」需要 4 个字节大小来存储,那么整个 4GB 空间的映射就需要有 4MB 的内存来存储页表。 阅读详情

基本介绍
我们知道,在linux操作系统中,CPU在执行一个进程的时候,都会访问内存。
但CPU并不是直接访问物理内存地址,而是通过虚拟地址空间来间接的访问物理内存地址。
所谓的虚拟地址空间,是操作系统为每一个正在执行的进程分配的一个逻辑地址,在32位机上,其范围从0 ~ 4G-1。操作系统通过将虚拟地址空间和物理内存地址之间建立映射关系,让CPU间接的访问物理内存地址。
通常将虚拟地址空间以512Byte ~ 8K,作为一个单位,称为页,并从0开始依次对每一个页编号。这个大小通常被称为页面
将物理地址按照同样的大小,作为一个单位,称为框或者块,也从0开始依次对每一个框编号。
操作系统通过维护一张表,这张表上记录了每一对页和框的映射关系。如图:
页-页表-框
这张表,称为页表。
在windows系统下,页面为4k,这里我们以4k为例。
一个4G虚拟地址空间,将会产生1024*1024个页,页表的每一项存储一个页和一个框的映射,所以,至少需要1M个页表项。如果一个页表项大小为1Byte,则至少需要1M的空间,所以页表被放在物理内存中,由操作系统维护。
当CPU要访问一个虚拟地址空间对应的物理内存地址时,先将具体的虚拟地址A/页面大小4K,结果的商作为页表号,结果的余作为业内地址偏移。
例如:
CPU访问的虚拟地址:A
页面:L
页表号:(A/L)
页内偏移:(A%L)
CPU中有一个页表寄存器,里面存放着当前进程页表的起始地址和页表长度。将上述计算的页表号和页表长度进行对比,确认在页表范围内,然后将页表号和页表项长度相乘,得到目标页相对于页表基地址的偏移量,最后加上页表基地址偏移量就可以访问到相对应的框了,CPU拿到框的起始地址之后,再把页内偏移地址加上,访问到最终的目标地址。如图:
地址转换过程
注意,每个进程都有页表,页表起始地址和页表长度的信息在进程不被CPU执行的时候,存放在其PCB内。
按照上述的过程,可以发现,CPU对内存的一次访问动作需要访问两次物理内存才能达到目的,第一次,拿到框的起始地址,第二次,访问最终物理地址。CPU的效率变成了50%。为了提高CPU对内存的访问效率,在CPU第一次访问内存之前,加了一个快速缓冲区寄存器,它里面存放了近期访问过的页表项。当CPU发起一次访问时,先到TLB中查询是否存在对应的页表项,如果有就直接返回了。整个过程只需要访问一次内存。如图:
快表
这种方式极大的提高了CPU对内存的访问效率。将近90%。
然而这样的方式还是存在弊端,在物理内存中需要拿出至少1M的连续的内存空间来存放页表。可以通过多级页表的方式,将页表分为多个部分,分别存放,这样就不要求连续的整段内存,只需要多个连续的小段内存即可。
把连续的页表拆分成多个页表称之为一级页表,再创建一张页表,这张页表记录每一张一级页表的起始地址并按照顺序为其填写页表号。
通过这样的方式,CPU从基地址寄存器中拿到了一级页表的地址,从地址结构中取出一级页表的页表号,找到二级页表的起始物理地址;然后结合地址结构中的中间10位(二级页表上的页表号),可以找到对应的框的起始地址,最后结合页内偏移量,就可以计算出最终目标的物理地址。如图:
多级页表

【用unity实现100个游戏之16】Unity程序化生成随机2D地牢游戏1(附项目源码) 关于使用TileMap生成随机2D地图,其实之前已经有做过类似的,感兴趣可以看看 但是随着学习深入,发现之前做的比较粗糙和不够全面,最近又在外网看到 阅读详情

相关推荐

NRF24L01学习操作教程(二)——NRF实现一对一,一对多通讯

以上内容详细介绍了,使用NRF24L01实现1对1单向通讯、1对1双向通讯、1对多双向通讯。

Joseph Wen的博客 7388

内存之页表

内存管理中页表小结

m0_51717456的博客 1万+

π_RL:解锁流匹配VLA强化学习后训练的关键技术与实战解析

本文深入解析了π_RL框架如何通过流匹配(flow matching)与强化学习(RL)的结合,解决视觉语言动作模型(VLA)在后训练中的关键挑战。详细介绍了Flow Noise和Flow SDE两大核心技术,以及它们在机器人控制任务中的实战效果,显著提升了模型的性能、数据效率和泛化能力。

weixin_29061531的博客 220

OS内存管理之页表,页表项以及页目录

页表由多个页表项组成,即页表中每一行的就是一个页表项。 页表项中记录的信息: 页框号:记录虚页面对应的具体哪个物理页面 有效位:标识该页表项对应的虚页面有没有读进内存,否则在磁盘 访问位:引用位,标识该页面有没有被访问过 修改位:此页面在内存中有没有被修改过,如果被修改过,将来是要被持久化到磁盘上的,该标志位就是这个目的 保护位:标识该页面的读写等权限 页表项一般是由硬件设计的,因为地址转换时大多数是由硬件完成的。 引出页目录: 对于32位虚拟地址空间,假设页面大小为4K,页表项大小为4字节: 一个进程

KingOfMyHeart的博客 6007

Unity中Newtonsoft.Json的使用(一)

在Unity中下载Newtonsoft.Json,并进行序列化和反序列化

洛苍离的博客 1万+

ESXI 与 OPNSense 配合

国庆期间在家里更新曾经购买的设备,将曾经的单系统,加固为防火墙,多系统的网络架构,如下图: 网络架构 在 ESXI 系统中默认存在一个 vSwitch0 交换机,且其不能被修改名称,因此在此通过修改其对应绑定的上行网卡即可,具体如下: 设置 vSwitch0 上行链路 将 vmnic 0 (网口...

weixin_34050389的博客 2314

【Linux系统编程】页表工作原理详解

​ 进入了线程这部分内容,我们需要了解更多的知识,大体就是线程概念,线程与进程的区别和联系、线程控制、线程创建、线程终止、线程等待、线程分离、线程安全、线程同步,除此之外我们还得学习互斥量、条件变量、POSIX信号量以及读写锁,最后我们还会介绍一些关于多进程的设计模式比如单例模式等,然后还会了解一下线程池的概念!​ 首先我们不会马上来讲线程的概念,因为不太好理解,我们先引入一个知识点,就是我们之前一直在谈论的页表,它的工作方式大概是怎么样的呢,我们一起来了解一下!Linux从头学15:【页目录和页表】-

lirendada的博客 3269

YOLO26全网首发:CVPR2026 FAA| 解决YOLO Neck跨尺度方向冲突--- FAAFusion频域对齐融合模块 | 暴力涨点篇

本文改进:FAAFusion引入YOLO neck ,代替nn.Upsample和Concat

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 644

内存管理<原理篇>(五、页表和快表)

这一篇,介绍了页表和多级页表还有快表,再加上前面的分段,现在操作系统的内存管理已经出来了,下一篇就开始介绍段页结合的实际内存管理了。

酱油师兄的博客 1万+

手把手教你学Simulink——基于电机驱动系统的场景实例:永磁同步电机(PMSM)在电动汽车中的矢量控制仿真

随着全球对环境保护的关注增加,电动汽车(Electric Vehicle, EV)因其环保特性而受到广泛关注。永磁同步电机(Permanent Magnet Synchronous Motor, PMSM)由于其高效率、高功率密度和良好的动态响应性能,在电动汽车驱动系统中得到了广泛应用。矢量控制(Field-Oriented Control, FOC)是实现PMSM高性能控制的关键技术之一,它能够实现对电机转矩和磁场的独立控制,从而达到类似直流电机的控制效果。本文将详细介绍如何使用来构建一个。

MHD0815的博客 1万+

【数据分析】基于多组学数据整合的微生物与宿主互作网络构建及可视化分析

综上所述,本教程通过详细的步骤和方法,展示了如何整合微生物群落数据、宿主基因表达数据和代谢组数据,构建微生物与宿主互作网络,并进行可视化分析。这种方法为研究微生物与宿主之间的复杂关系提供了一种有力的工具,有助于推动相关疾病的研究和治疗。然而,在实际应用中,需要注意数据处理和分析过程中的各种问题,并结合实验验证来提高研究结果的可靠性和科学性。未来,随着多组学技术的不断发展和完善,以及数据分析方法的创新,相信我们能够更深入地理解微生物与宿主之间的互作机制,为疾病的预防、诊断和治疗提供更有力的支持。

专注生信领域 370

linux 页、页表、页框(块)

我们知道,在linux操作系统中,CPU在执行一个进程的时候,都会访问内存。 但CPU并不是直接访问物理内存地址,而是通过虚拟地址空间来间接的访问物理内存地址。 所谓的虚拟地址空间,是操作系统为每一个正在执行的进程分配的一个逻辑地址,在32位机上,其范围从0 ~ 4G-1。操作系统通过将虚拟地址空间和物理内存地址之间建立映射关系,让CPU间接的访问物理内存地址。 通常将虚拟地址空间以512Byte ~ 8K,作为一个单位,称为页,并从0开始依次对每一个页编号。这个大小通常被称为页面 将物理地址按照同...

liuwg1226的专栏 599

TensorRT的安装:一步一步教会你如何安装TensorRT

TensorRT(Tensor Runtime)是由NVIDIA开发的一个用于深度学习推理(inference)优化的库,它可以在NVIDIA的GPU上加速神经网络模型的推理过程,从而提高模型的性能和效率。安装完成后,需要将CUDA的安装路径添加到系统环境变量中,以便系统能够找到CUDA的库文件。根据你安装的CUDA版本,将CUDNN的库文件复制到CUDA的安装目录中。要使用TensorRT,首先需要安装NVIDIA的CUDA和cuDNN库,并根据NVIDIA官方文档安装TensorRT。

Science prince的博客 2373

Linux-页、页表、页框(块)+虚拟内存

在Linux操作系统中,CPU在执行一个进程的时候,都会访问内存。但CPU并不是直接访问物理内存地址,而是通过虚拟地址空间来间接的访问物理内存地址。 所谓的虚拟地址空间,是操作系统为每一个正在执行的进程分配的一个逻辑地址,在32位机上,操作系统通过将虚拟地址空间和物理内存地址之间建立映射关系,让CPU间接的访问物理内存地址。 通常将虚拟地址空间以512Byte ~ 8K,作为一个单位,称为页,并从0开始依次对每一个页编号。这个大小通常被称为页面 将物理地址按照同样的大小,作为一个单位,称为框或者块,也从0开

kking_edc的博客 2282

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

linux 页、页表、页框(块)-------很有用

我们知道,在linux操作系统中,CPU在执行一个进程的时候,都会访问内存。 但CPU并不是直接访问物理内存地址,而是通过虚拟地址空间来间接的访问物理内存地址。 所谓的虚拟地址空间,是操作系统为每一个正在执行的进程分配的一个逻辑地址,在32位机上,其范围从0 ~ 4G-1。操作系统通过将虚拟地址空间和物理内存地址之间建立映射关系,让CPU间接的访问物理内存地址。 通常将虚拟地址空间以512Byte ~ 8K,作为一个单位,称为页,并从0开始依次对每一个页编号。这个大小通常被称为页面 将物理地址按照同...

小吕的博客 1206

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

linux内存管理伙伴算法(一:基本概念介绍)

在系统初始化进行到伙伴系统分配器能够承担内存管理的责任后,必须停用bootmem分配器,毕竟不能同时用两个分配器管理内存。在UMA和NUMA系统上,停用分别由free_all_bootmem和free_all_bootmem_node完成(前面的博客已经详细讨论过)。伙伴系统基于一种相对简单而令人吃惊的强大算法,它结合了优秀内存分配器的两个关键特性:速度和效率。Linux内核中采用了一种同时适用于

hshopeful 5003

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Linux中线程的基本概念(重要)

在Linux操作系统中线程是进程内部的一个执行分支,是CPU调度的基本单位,而进程是分配系统资源的基本单位(地址空间)(完整的执行流需要PCB、进程地址空间、页表、代码和数据,这些内容线程都有只不过可能是借用了进程的部分内容)(Windows中的线程设计是符合理论的)(新的数据结构TCB)(上图所示)

m0_73975164的博客 662

分页管理是操作系统中一种重要的内存管理技术,它将物理内存和虚拟内存划分为固定大小的块,以实现高效的内存分配和管理

**分页(Paging)** 是将内存划分为固定大小的块的技术: - **页(Page)**:虚拟内存(逻辑地址空间)的固定大小块 - **页框(Page Frame)**:物理内存的固定大小块 - **页表(Page Table)**:记录虚拟页到物理页框的映射关系

[Blog][Domain] programb.blog.youkuaiyun.com 1143

Linux---线程基础

进程:运行起来的程序。(进程=内核数据结构+代码和数据)--->操作系统:承担分配资源的基本实体。线程:线程是进程内部的执行分支。Linux“线程”在进程内部运行,本质是在进程的地址空间内运行。我们一起学习的进程,本质:内部只有一个线程的进程~,进程内部只有一个执行分支。进程=多个线程+地址空间+页表+代码和数据。

2401_90040984的博客 219

linux内核伙伴算法,linux内存管理伙伴算法(基本概念介绍)

在系统初始化进行到伙伴系统分配器能够承担内存管理的责任后,必须停用bootmem分配器,毕竟不能同时用两个分配器管理内存。在UMA和 NUMA系统上,停用分别由free_all_bootmem和free_all_bootmem_node完成(前面的博客已经详细讨论过)。伙伴系统 基于一种相对简单而令人吃惊的强大算法,它结合了优秀内存分配器的两个关键特性:速度和效率。Linux内核中采用了一种同时适...

weixin_39958631的博客 215

Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型

Linux内核中采用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系统中,用到了四级页表,如图2-1所示。四级页表分别为: 页全局目录(Page Global Directory) 页上级目录(Page Upper Directory) 页中间目录(Page Middle Directory) 页表(Page Tab

xueli1991的博客 1047

从虚拟地址到物理页框:Linux 页表与内存管理全解析

本文深入解析了现代操作系统内存管理的核心机制,重点探讨了虚拟内存、物理内存与页表的关系。通过父子进程共享变量的案例,揭示了虚拟地址与物理地址的区别:相同虚拟地址可能映射到不同物理地址。文章详细阐述了虚拟内存的组织结构(mm_struct和vm_area_struct)、页表的多重作用(映射、权限管理、解耦合),以及物理内存以4KB页框为单位的管理方式(struct page数组)。虚拟内存机制实现了内存保护、高效管理,并支持缺页中断和进程挂起等高级功能,在资源利用和性能之间取得了平衡。

2302_80105876的博客 9419
上一篇: C++学习笔记day62-----oracle-select...from...where...order by
下一篇: 学习笔记day63-----oracle-单行函数、表连接
displayMessage
博客等级 码龄11年 34粉丝 114原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值