Linux虚拟存储系统
来源:互联网 发布:淘宝5金冠店铺排行 编辑:程序博客网 时间:2024/04/27 18:03
Linux为每个进程维持了一个单独的 虚拟地址空间,
内核虚拟存储器包含了内核的代码和数据结构,内核虚拟存储器的某些区域被映射到所有进程的共享的物理界面。例如每个进程共享的内核的代码和全局的数据结构。
Linux也将一组连续的虚拟页面(大小等于系统的DRAM的总量)映射到一组连续的物理页面。这就为内核提供了一种便利的方法访问物理存储器里面任何特定的位置,例如:
当需要访问页表,或者在一些设备上执行存储器影响的IO操作,而这些设备被映射到特定的物理存储器的位置。
内核虚拟存储器的其他区域包含了每个进程都不相同的数据,例如页表,内核在进程的上下文中执行代码使用的栈,以及记录虚拟地址空间当前组织的各种数据结构。
Linux将虚拟存储器组织成一些区域的集合,一个区域就是已经存在着的虚拟存储器连续片,以某种方式相互关联。
linux通过一个虚拟存储器区域与一个磁盘上的对象关联起来,来初始化这个虚拟存储器的内容(存储器映射).
可以映射一个普通磁盘文件的连续部分,例如一个可执行文件。文件区被分成页大小的片,每一片包含一个虚拟页面的初始内容,也可以映射一个匿名文件。
现在重新看某些概念和过程
1.共享对象:
进程这一抽象的概念能够为每个进程提供自己的私有虚拟地址空间,可以免受其他进程 的错误读写,不过许多进程有同样的只读文本区域,如标准函数。如果每个进程的
都在物理存储器保存这同样一份拷贝是对空间的浪费。一个对象可以被映射到虚拟存储器的一个区域,要么作为共享的对象,要么作为私有对象。如果进程对共享区域的任何操
对于其他的进程来说都是可见的,也会反映在磁盘的原始文件里面。
2.私有对象:
只要不发生写 ,和前面的共享没有什么区别。在物理存储区只有一份共享对象的拷贝,私有对象的进程相应区域的页表条目都被标记为只读,但是如果一个进程发出写操
作,必定会除法保护机制,当故障处理程序发现是因为进程写私有对象区域的一个页引起的,就会在物理存储器拷贝这个页面。当故障处理程序返回时,CPU重新执行这个操
就在创建的页面上正常执行了。 (这样写的时候在copy,尽可能的拖到最后时刻,充分使用了稀有的物理存储器)
3. fork函数
当fork函数被当前的进程调用的时候,内核为新进程创建各种数据结构,并分配一个唯一的PID,为了给这个新进程创建虚拟存储器,创建了mm_struct,区域结构,和页表的
拷贝,将两个进程的每个页面标记为只读,并将两个进程每个区域结构都标记为私有的写时拷贝. 当fork函数在新的进程返回,新进程现在的虚拟存储器刚好和调用fork函数时候
的 存在的虚拟存储器相同,当两个进程中任一个后来进行写操作时,写时拷贝机制就会创建新页面,因此也为每个进程保持了私有地址空间的抽象概念。
4.execve函数
假设执行
Execve("a.out",NULL,NULL);execve函数在当前进程加载并运行包含可执行目标文件a.out的程序,用a.out代替了当前的程序。
步骤:
1.先删除已经存在的用户区域。删除当前进程虚拟地址的用户部分中已经存在的区域结构,就是清除了起始和结束地址,描述区域包含页的读写权限,共享私有标志位。
2.删除私有区域:为新程序的文本数据,bss段和栈区域创建新的区域结构,所有的这些新的区域都是私有的,写时拷贝的,文本和数据区域被映射为a.out。栈和堆区域也是请
求二进制零的,映射到匿名文件,其大小包含在a.out 里面,堆和栈区域也是请求二进制零的,初始长度为零。
3.映射共享区域:如果a.out程序与共享对象链接,那么这些对象是动态链接到这个程序的,然后在映射到用户虚拟地址空间的共享区域。
4.设置程序计数器:execve最后一件事情就是设置当前的进程上下文的程序计数器,使它指向文本区域的入口点。下一次调度这个进程的时候,从这个入口点开始执行。
- Linux虚拟存储系统
- 存储系统-Linux磁盘分区管理
- 存储系统
- 存储系统
- 存储系统
- 存储系统
- 存储系统
- 存储系统
- 操作系统存储管理之分段式与段页式虚拟存储系统
- 虚拟 Linux
- 虚拟 Linux
- 虚拟 Linux
- 虚拟 Linux
- 虚拟 Linux
- 虚拟Linux
- 虚拟Linux
- 操作系统存储管理之虚拟存储与分页式虚拟存储系统
- 基于PVFS(并行虚拟文件系统)的并行网络存储系统 _浪潮
- VS2012 编译程序时报无法加载PDB文件错误解决方案
- VO(DTO)模式在分层架构设计中是否需要的扯淡
- C的堆栈,内存分配
- Sort List
- Git Learning
- Linux虚拟存储系统
- 自定义圆形ImageButton
- 第十三章 处理用户输入
- KVC
- django中文件下载(HttpResponse)
- 数据库中存储日期的字段类型到底应该用varchar还是datetime ?
- Android 应用签名并发布(APK-keystore)
- Codeforces Round #256 (Div. 2)A-D
- VS中的路径宏