【OSTEP】分页(Paging) | 页表中究竟有什么 | 页表存在哪 | 内存追踪

这篇具有很好参考价值的文章主要介绍了【OSTEP】分页(Paging) | 页表中究竟有什么 | 页表存在哪 | 内存追踪。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 【OSTEP】分页(Paging) | 页表中究竟有什么 | 页表存在哪 | 内存追踪

💭 写在前面

本系列博客为复习操作系统导论的笔记,内容主要参考自:

  • Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau, Operating Systems: Three Easy PiecesA. Silberschatz, P. Galvin, and G. Gagne,
  • Operating System Concepts, 9th Edition, John Wiley & Sons, Inc., 2014, ISBN 978-1-118-09375-7.Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

0x00 分页介绍(Concept of Paging)

分页并不是将一个进程空间的地址空间分割成几个长度不同的逻辑段(代码,堆,段),而是 分割成固定大小的单元,每个单元称为一

Paging splits up address space into fixed-sized unit called a page

  • Segmentation:逻辑段(代码、堆栈、堆等)的大小可变。

相应的,我们把物理内存看成是定长槽块的阵列,称为 页帧(page frame)。

With paging, physical memory is also split into some number of pages called a page frame.

每个进程都需要一个页表,用于将虚拟地址转换为物理地址。

Page table per process is needed to translate the virtual address to physical address.

关键问题:如何通过页来实现虚拟内存?

如何通过页来实现虚拟内存,从而避免分段的问题?基本技术是什么?如何让这些技术很好地运行?并尽可能地减少时间和空间的开销?

灵活性(Flexibility):有效支持地址空间的抽象性。

  • 不需要假设堆和栈是如何增长和使用的。

简单性(Simplicity):易于自由空间的管理,

  • 地址空间中的页和页框的大小是一样的。
  • 易于分配和保持空闲列表

0x01 一个简单的例子

64 字节的地址空间,有 16 字节的页(4页)。

128 字节的物理内存,有 16 字节的页帧(8个页帧)。

【OSTEP】分页(Paging) | 页表中究竟有什么 | 页表存在哪 | 内存追踪

这里只是为了方便讲解举得例子而已,然而真实的地址空间肯定比这个大得多,通常 32 位有 4GB 的地址空间,甚至有 64 位!(这里插一嘴,64位的地址空间是真他马的大,如果说 32 位地址空间有网球场那么大,那么 64 位地址空间就是整个欧洲的面积那么大)

为了记录地址空间的每个虚拟页放在物理内存中的位置,操作系统通常位每个进程保存一个数据结构,称为 页表(address table),又称页面映像表。页表是一种数据结构,用于将虚拟地址映射到物理地址。 从而让我们知道每个页在物理内存中的位置,起到映射作用。

为了转换该过程生成的虚拟地址,我们将虚拟地址它分为两个部分:

  • 虚拟页面号 (VPN):virtual page number
  • 偏移量 (Offset): offset within the page

【OSTEP】分页(Paging) | 页表中究竟有什么 | 页表存在哪 | 内存追踪

例如:64 位地址空间中的虚拟地址 21(0x15)

【OSTEP】分页(Paging) | 页表中究竟有什么 | 页表存在哪 | 内存追踪

【OSTEP】分页(Paging) | 页表中究竟有什么 | 页表存在哪 | 内存追踪

0x02 页表中究竟有什么?

页表可以变得非常大,一个典型的32位地址空间,带有 4KB 的页。这个虚拟地址分成 20 位的 VPN 和 12 位的偏移量。

一个 20 位的 VPN 意味着操作系统必须为每个进程管理  个地址转换(大约一百万)。

❓ 页表存在哪里?

Page tables for each process are stored in memory.   (每个进程的页表都存储在内存中)

  • 要找到所需PTE的位置,需要页表的起始位置(例如 PTBR - 页表基数寄存器)
  • 对于每一个内存引用,分页需要操作系统执行一次额外的内存引用 → 这太慢了!

【OSTEP】分页(Paging) | 页表中究竟有什么 | 页表存在哪 | 内存追踪

我们知道了 —— 页表就是一种数据结构,用于将虚拟地址映射到物理地址。

  • 因此,任何数据结构都可以采用,最简单的形式就是线性页表(一个数组)。

操作系统通过 VPN 对数组进行索引,并查找页表条目(entry),常见的条目有:

  • Valid Bit: Indicating whether the particular translation is valid.
  • Protection Bit: Indicating whether the page could be read from, written to, or executed from. 
  • Present Bit: Indicating whether this page is in physical memory or on disk (swapped out).
  • Dirty Bit: Indicating whether the page has been modified since it was brought into memory.
  • Reference Bit (Accessed Bit): Indicating that a page has been accessed.

有效位:用于指示特定的地址转换是否有效。

保护位:表明页是否可以读取、写入或执行。

存在位: 表示该页实在物理存储器上还是在磁盘上。

脏位:表明页面被带入内存后是否被修改过。

参考位(访问位) :用于追踪页是否被访问。

【OSTEP】分页(Paging) | 页表中究竟有什么 | 页表存在哪 | 内存追踪

利用分页访问内存:

// Extract the VPN from the virtual address
VPN = (VirtualAddress & VPN_MASK) >> SHIFT
// Form the address of the page-table entry (PTE)
PTEAddr = PTBR + (VPN * sizeof(PTE))
// Fetch the PTE
PTE = AccessMemory(PTEAddr)

// Check if process can access the page
if (PTE.Valid == False)
	RaiseException(SEGMENTATION_FAULT)
else if (CanAccess(PTE.ProtectBits) == False)
	RaiseException(PROTECTION_FAULT)
else
	// Access is OK: form physical address and fetch it
	offset = VirtualAddress & OFFSET_MASK
	PhysAddr = (PTE.PFN << PFN_SHIFT) | offset
	Register = AccessMemory(PhysAddr)

0x03 内存追踪(A Memory Trace)

在结束之前,我们现在通过一个简单的内存访问示例,来演示使用分页时产生的所有内存访问。

需要我们感兴趣的代码片段如下:

💬 代码:array.c

int array[1000];
...
for (i = 0; i < 1000; i++)
    array[i] = 0;

我们用下列指令编译它:

prompt> gcc –o array array.c –Wall –o
prompt>./array

生成的汇编代码如下:

【OSTEP】分页(Paging) | 页表中究竟有什么 | 页表存在哪 | 内存追踪

虚拟(和物理)内存追踪:

【OSTEP】分页(Paging) | 页表中究竟有什么 | 页表存在哪 | 内存追踪

【OSTEP】分页(Paging) | 页表中究竟有什么 | 页表存在哪 | 内存追踪

📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   2022.
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau, Operating Systems: Three Easy Pieces

A. Silberschatz, P. Galvin, and G. Gagne,

Operating System Concepts, 9th Edition, John Wiley & Sons, Inc., 2014, ISBN 978-1-118-09375-7.

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

百度百科[EB/OL]. []. https://baike.baidu.com/.文章来源地址https://www.toymoban.com/news/detail-442033.html

到了这里,关于【OSTEP】分页(Paging) | 页表中究竟有什么 | 页表存在哪 | 内存追踪的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp开发使用插件z-paging实现页面下拉刷新、上拉加载,分页加载

    在uniapp官网有一个比较好用的插件z-paging,可以实现多条数据滚动显示或者自定义下拉刷新,分页显示......在开发消息页面或者app开发需要大量的页面刷新,页面内容过长,减轻服务器的负担就可以使用此插件,进入app智慧加载部分内容,等到再次需要之后的内容就再次加载

    2024年02月11日
    浏览(41)
  • Android Paging3分页+ConcatAdapter+空数据视图+下拉刷新(SwipeRefreshLayout)+加载更多+错误重试 (示例)

    paging 库,目前还是有点小bug ,后面说 布局文件就是显示两个TextView,就不贴了 布局文件: adapter 实现: adapter 继承自 LoadStateAdapter,关联的数据对象 LoadState 有三个状态。 LoadState.NotLoading 表示 非加载中,即加载完成时的状态。如果 displayLoadStateAsItem()中的实现是 || (loadState

    2024年02月14日
    浏览(33)
  • Android笔记(二十三):Paging3分页加载库结合Compose的实现分层数据源访问

    在Android笔记(二十二):Paging3分页加载库结合Compose的实现网络单一数据源访问一文中,实现了单一数据源的访问。在实际运行中,往往希望不是单纯地访问网络数据,更希望将访问的网络数据保存到移动终端的SQLite数据库中,使得移动应用在离线的状态下也可以从数据库中

    2024年01月16日
    浏览(31)
  • 驱动开发:内核解析内存四级页表

    当今操作系统普遍采用64位架构,CPU最大寻址能力虽然达到了64位,但其实仅仅只是用到了48位进行寻址,其内存管理采用了 9-9-9-9-12 的分页模式, 9-9-9-9-12 分页表示物理地址拥有四级页表,微软将这四级依次命名为PXE、PPE、PDE、PTE这四项。 关于内存管理和分页模式,不同的操

    2024年02月06日
    浏览(43)
  • 数字藏品究竟有什么收藏价

    数字收藏品,在海外通常被称为“不可替换的代币”(NFT),而国内由于政策的原因,禁止任何代币的存在,所以国内将所有NFT项目统一称为“数字收藏品”。而数字收藏品的价值则是因为其天然就具备的唯一性与稀缺性。 “数字藏品”是区块链上的一种 数字资产 ,也可以

    2024年02月02日
    浏览(31)
  • “==“和equals方法究竟有什么区别?

    ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用 ==操作符。 如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内

    2023年04月17日
    浏览(24)
  • 时下火热的 NFT 究竟有什么用?

    如今,NFT 正在以一股十分火热的趋势开始席卷全球,无论是个人还是企业,都开始关注起了这个由区块链技术所衍生出来的全新数字生态。 我国为了防止 NFT出现投机、炒作等风险,对于 NFT 二级市场有着严格的监管和限制,使得整个市场并不如国外那般开放,但 NFT 同样如雨

    2023年04月09日
    浏览(24)
  • 云计算和边缘计算究竟有什么不同

           在数据时代,无论是人的活动还是机器的运作都会产生各种各样海量的数据。在对数据梳理和筛选过程中,计算机的运算处理必不可少。为了减少本地计算机算力成本等限制,越来越多的企业选择了云计算和边缘计算。今天, 德迅云安全 就带您来了解下这2者的区别

    2024年04月27日
    浏览(21)
  • ChatGPT的快速发展究竟给我们带来了什么?

    😚一个不甘平凡的普通人,致力于为Golang社区和算法学习做出贡献,期待您的关注和认可,陪您一起学习打卡!!!😘😘😘 🤗专栏:算法学习 🤗专栏:Go实战 💬个人主页:个人主页 人工智能(AI)技术在过去几十年中得到了迅速的发展,其中自然语言处理技术的进展更

    2024年02月05日
    浏览(38)
  • 进入嵌入式之后究竟会干些什么?

    嵌入式被称为互联网、计算机行业的万金油,未来的就业方向多种多样,工作内容也不一而足,但可以分为如下几个角度: 在大型企业中,一个人很难承担过多的任务,因为这会带来很大的风险。大企业更需要在特定领域具备专业知识的人才,从事专业而独立的工作。 为了

    2024年02月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包