| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> 14 [虚拟化] 虚存抽象;Linux进程的地址空间 -> 正文阅读 |
|
[系统运维]14 [虚拟化] 虚存抽象;Linux进程的地址空间 |
14 [虚拟化] 虚存抽象;Linux进程的地址空间南京大学操作系统课蒋炎岩老师网络课程笔记。
本讲概述程序 = 状态机;进程 = 状态机的执行(路径)
虚存抽象:
进程的地址空间进程的地址空间中有什么进程的地址空间 = 内存中若干连续的 “段”,每一段是可访问的(读/写/执行)的内存,可能映射到某个文件和 / 或在进程间共享。 进程执行指令需要代码、数据、堆栈:
地址空间中还有:
以上这些都可以直接用指针访问。 那么,这个地址空间是怎么创建的呢?创建之后,我们还可以修改它吗?肯定是能的,如动态链接库可以动态地加载。 管理进程地址空间的系统调用
mmap的作用就是把磁盘文件的一部分直接映射到进程的内存中 说人话:在状态机上增加或者删除一段可访问的内存。 把文件映射到地址空间?它们好像的确没什么区别:
查看进程的地址空间pmap
动态链接 / 静态链接的地址空间我们准备一个死循环C程序:
分别用动态链接和静态链接的方式来编译它:
分别把得到的
分别得到动态链接和静态链接的pmap如下:
可以看到动态链接比静态链接多了很多动态链接库 pmap的实现我们不禁好奇pmap是怎样实现的,可以通过追踪系统调用的
实际上,我们多次强调过的一个概念:程序就是一个状态机,而这样一个状态机想要得到操作系统里的任何东西,都要通过系统调用,所以当我们想知道 言归正传,上述
我们看到, 我们发现了什么宝藏?我们直接看一下上面动态链接的可执行文件的进程:
输出:
前面都好理解,是我们进程执行时的代码、数据、堆栈、动态链接库等,但是最后那三个: vvar、vdso、vsyscall是什么鬼?让内核和进程共享数据 (内核可写,进程只读)
vsyscall 的例子
计算机系统里没有魔法!我们理解了 Linux 进程地址空间的全部! 使用共享内存与内核通信有些系统调用不陷入内核也可以执行,使用共享内存和内核通信!
实现虚拟存储:分页机制需求分析我们的操作系统看到的内存是真实的物理内存,而为各个线程提供的,即线程看到的是虚拟内存。那么,操作系统怎样事项这一虚拟化呢? 操作系统希望实现地址空间的管理(mmap、munmap API)
所以,我们需要一个函数 f : [ 0 , M ) → [ 0 , M ) f : [0,M) \rightarrow [0,M) f:[0,M)→[0,M),把 ”虚拟地址“ 翻译为 ”物理地址“ ,毕竟我们真实的物理内存只有一份, f f f 应当由操作系统控制,即应用程序不可见 f f f。 操作系统为每个进程准备一个映射函数 f f f ,当进程运行时, f f f 被 ”加载“ 到CPU上,此后该进程每次访问内存,都需要通过CPU上对应的 f f f 来进行从该进程可见的虚拟内存到真实物理内存的映射,而该进程的任何越权访问物理内存地址,都将触发异常(缺页?)。 应当注意,我们的 f f f 有以下几方面的要求:
分页机制把地址空间切成大小为 p p p 的 “页面” ,比如在x86中,页面大小为4KiB。只维护以页面为单位的映射,而非整个物理内存大小的虚拟内存到整个物理内存的映射。这样我们要维护: [ 0 , M / p ) → [ 0 , M / p ) [0,M/p) \rightarrow [0,M/p) [0,M/p)→[0,M/p) 的映射。 我们有这样一个基本假设:进程内存地址的空间局部性,即绝大部分页面都没有映射,且映射一般都是连续的空间 Radix Tree(Trie) + TLB(Translation Lookaside Buffer): [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f0EpFhQQ-1632927829290)(14 [虚拟化] 虚存抽象;Linux进程的地址空间.assets/image-20210929213515011.png)] 32位机和64位机的分页寻址过程如图所示:
分页+保护:实现虚拟化映射是页面到页面的,也就意味着映射的低位永远是0,4kiB的页面就会有12bits空闲,可以用来存储页面的存储保护等信息。 分页机制与虚拟存储mmap并不需要为进程分配任何页面,只需要 “让操作系统知道这么映射” 就够了,进程访问页面会进入缺页进入操作系统。 操作系统并不需要在这一段创建的时候,就立即给进程分配内存,而是操作系统完全可以等到进程真正访问这个页面并发生缺页时,再去分配这块内存。当然,如果操作系统根据之前的映射发现进程访问的这块内存是不合法的,就会Segmentation Fault。 缺页缺页时操作系统会得到缺页的地址(%cr2),根据操作系统维护的进程地址信息分配页面。 Memory-Mapped File:一致性这样的设计也有些问题需要明确,比如:
Takeaways and Wrap-up虚拟化
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 16:55:05- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |