与Linux相关的虚拟内存介绍
它需要它的原因是什么
我们知道,程序代码和数据必须驻留在内存中运行,但系统的内存量是有限的,所有的代码和数据往往无法容纳一个完整的程序,更不用说在多任务系统中,可能需要打开子过程,同时绘制程序,浏览器和许多其他的任务,希望所有记忆的计划显然是不可能的。所以,可以想到的第一件事是把程序划分成小的部分,只保留当前系统的运行,和所有需要的部分留在记忆中,剩下的是硬盘上的系统时留下的。完成当前任务的片段,从外部存储器的任务,然后转入运行的下一个环节。事实上,传统的系统是处理大型任务的方式,和工作是由程序员完成的。但随着越来越多的高级编程语言,程序员依赖于系统的程度降低,少数程序员能够很好的控制系统,让程序员将负责程序片段和按需呼叫灯效率低,而机器崩溃;另一个原因是,随着程序越来越丰富,程序的行为是几乎不可能准确地预测,程序员自己来决定下一步需要加载程序非常困难。它静态分配固定大小的内存的可预测性,因此很难,然后机械转动程序装入内存执行该系统必须采用一种新的可按需发布的技术,而不需要程序员干预。
虚拟内存,称为虚拟内存,它与系统中的逻辑内存和物理内存有关。逻辑记忆是从过程的角度看到的记忆,所以它是程序员关心的内容。物理内存是内存,从处理器的角度来看,是由操作系统管理,虚拟内存可以说是一个映射存储技术手段这两个不同的的观点。)技术是一种以根据需要动态分配内存的操作系统,它允许使用存储空间大于在不知不觉中实际的物理空间程序的大小(事实上存储空间的程序需要的形式存储在物理内存和磁盘页),所以对程序员彻底解放的虚拟内存大小。由于程序员不太关心和加载程序,自由编写程序,繁琐的事情交给操作系统去做。
实现虚拟存储器
虚拟内存是系统硬盘空间和系统实际内存为过程提供比内存更多的内存虚拟空间的结合。程序运行时,只要一小部分的虚拟地址空间映射到内存,剩下的都是存储在硬盘上(即也就是说,程序的虚拟空间等于物理内存加上一些硬盘空间)。当虚拟地址不在内存访问的地址没有映射到内存中,而是存储在硬盘的虚拟内存地址,然后转移到所需的内存;在同时,当系统内存时,也可以把虚拟存储空间不到硬盘的电流变化,使物理内存空间,系统运行多少次mdash;mdash;改变,改变,和用户难以查找,这就是虚拟内存机制的礼物。
Linux的交换分区保留为硬盘的虚拟存储空间,经历大小应该大约两倍的内存。如果你有兴趣,你可以使用swapon -s看到交换分区的大小。
大道理很好理解,它无非是内存和硬盘空间虚拟成内存空间的使用。但反复运行地址映射(虚拟地址映射到物理地址)和虚拟地址的更换都值得仔细研究。系统如何映射虚拟地址到物理地址的最后如何在硬盘和虚拟地址之间交换内存
一个分段机制可以用来回答上面的问题吗逻辑地址由段机制成一个32位地址,足以覆盖4G的内存空间,当虚拟地址的程序不需要在内存中,只有依靠一些机制很难被交换在一个虚拟的空间,因为它是不容易对空间大小的整段虚拟内存和硬盘转移到转移到之间(旧系统,将改变整个记忆笨拙甚至整个过程,想想这样做的后果会!)因此,有必要寻找一个更小型、更灵活的存储表示单元,使虚拟地址在硬盘和内存之间传输方便,这个较小的存储管理单元是页面(4K大小),管理页面的变化机制称为页面机制。
由于使用分页机制的原因,通过段机制转换得到的地址是唯一的一个中间地址mdash;mdash;线性地址,这并不代表物理地址,而是代表整个进程的虚拟地址空间。基于网页上的线性地址,然后处理线性地址映射机制:当需要线性地址(虚拟地址空间)不在内存中,然后页面从磁盘虚拟内存需要一个单位;当记忆是不够的,它可以是一个页面在内存中的虚拟空间单元变盘。可以看出,使用页管理内存和磁盘(虚拟内存)大大方便了内存管理。毫无疑问,页面机制和虚拟内存管理是;。
使用页面机制,4G空间分为20倍的4K页面大小(2页也可以设置为4M,所以位置大小)页面需要索引表(页面表),每个索引必须至少为20,但是在页面表条目中往往需要附加页面属性,所以。实际的表中有32, 12是用来存储的,如:页面是否在内存中,或;;权限页信息。
我们提到的线性地址是32 bit.20是页表的一个索引,和较低的12给抵消的页面。在发现一个页面基地址通过页表和添加低12位偏移,最终的物理地址是必要的。
实际上,并非所有的页表项都存储在一个大的页表中,因为每个页表项占用4字节。如果你想在一个表中存储2次20页的页面条目,你需要400万个连续的存储空间。如此大的连续空间很难找到,所以分页表通常被分类,例如两个级别,所以每个页面表只需要4K连续空间。
两级页面表搜索看起来像小说,首先在这一章中找到,然后寻找下一天的章节:
综上所述,地址转换需要两种技术,一个是市场机制,二是分页机制。市场机制解决的逻辑地址到线性地址的映射,和页面的机制是负责映射的线性地址到物理地址的映射。两级一起完成转换被程序员,该处理器将物理地址逻辑地址的艰巨任务。
可以将这两种机制比较为地址转换函数。段机制的变量是逻辑地址,函数值是线性地址,页面机制变量是线性地址,函数值是物理地址。地址转换过程如下所示。
逻辑地址(mdash;mdash;mdash;mdash;分段函数)>线性地址mdash;mdash;mdash;mdash(页面功能);>物理地址。
虽然片段机制和页面机制都涉及映射,但它们有不同的分工,彼此独立,因此不需要知道彼此的存在。
让我们简单地看看页面机制是如何与Linux实例一起使用的。
linux分段策略
部分机构有限公司在Linux还没有被充分利用。每个任务都没有设置独立的数据段,代码段,但最低只使用一些机制来隔离用户数据和系统数据mdash;mdash;Linux只安排了四个系列的同一时期,内核数据段,内核代码,用户数据,用户代码段,包括0-4g空间,这是不同属性的各个时期不同,内核特权级为0,用户段的特权级是3。这种分割避免了从逻辑地址到线性地址的转换步骤(逻辑地址就等于线性地址),但它仍然保留段水平的基本保障。
每一个用户进程可以看到大小4G的线性空间,在0-3g是用户空间,用户可以直接访问状态的过程;从3g-4g空间到内核空间,内核代码和数据的存储,只有内核进程可以直接访问,直接访问用户模式进程不仅通过系统调用和中断内核空间,特权时将开关。
在权限转换方面,我们不能离开任务门、陷阱门、中断门的概念,陷阱门和中断门是在陷阱和中断发生时进入内核空间的通道,呼叫门是用户空间程序相互访问所需要的通道。任务门是特别的。它不包含任何地址,但用于任务切换。然而,它在转换任务时并没有真正使用Linux,这太麻烦了。
各种门系统,会有对应的门描述符,类似的段描述符结构,门描述符也被相应的门选择的字符索引,并最终产生一个指针的偏移地址在一个特定的段。该指针指向入口,你将进入的。门的使用的目的是确保高考是可控的,不进入不应该访问的核心位置。
linux下的分页策略
看看如何在Linux使用分页。
Linux中的每个进程都有不同的页表,也就是说,进程的映射函数是不同的,因此每个进程虚拟地址不会被映射到相同的物理地址,这是因为进程必须相互独立,并且它们的数据必须被隔离以防止信息泄漏。
注意内核作为一个单独的部分必须得到保护,它有自己独立的页表映射到内核空间(不是所有的空间,不仅是物理内存空间的大小),页表(swapper_pg_dir)采用静态分配,它只映射内核空间(swapper_pg_dir只有768后mdash;mdash;768页目录映射3G领域)。独立的页表来确保内核虚拟空间独立于其他用户程序空间,也就是说其他的过程通常与内核无关(编译内核的内核代码时分配一个链接到3G的空间,和上面的内核数据)将自然保护。
那么,当用户进程需要访问内核空间时,您会做些什么呢
Linux使用了一个巧妙的方法:前768个映射过程的用户空间进程的页表(< 3G,因为公司唯一指定的基地址是0,只有0xc0000000),如果进程访问内核空间,如调用系统调用,后768页目录表后768的过程将指向swapper_pg_dir,所以一旦用户进入内核,swapper_pg_dir开始使用内核页表,这意味着你可以访问内核空间。