深入理解Linux内核虚拟内存原理与实现

在早期的计算机中,是没有虚拟内存的概念的。我们要运行一个程序,会把程序全部装入内存,然后运行。

当运行多个程序时,经常会出现以下问题

一.为什么要有虚拟内存

1,进程地址空间不隔离,没有权限保护。

由于程序都是直接访问物理内存,所以一个进程可以修改其他进程的内存数据,

甚至修改内核地址空间中的数据。

2,内存使用效率低

当内存空间不足时,要将其他程序暂时拷贝到硬盘,然后将新的程序装入内存运行。

由于大量的数据装入装出,内存使用效率会十分低下。

3,程序运行的地址不确定

因为内存地址是随机分配的,所以程序运行的地址也是不确定的。

二.虚拟地址和物理地址

对于32位系统,寻址指针为4字节,对应的虚拟地址空间为0-2^32,即0-4G。

对于64位系统,寻址指针为8字节,对应的虚拟地址空间为0-2^64,即0-16G。

要注意的是,这个地址空间是虚拟的,并非实际存在的。

Linux内核把虚拟地址空间分为两部分:用户进程空间,内核进程空间。

如下入所示:

在缓存原理中,换入/换出的数据以块为最小单位。在内存管理时,页是地址空间的最小单位。

虚拟地址空间划分为多个固定大小的虚拟页(VP),物理地址空间(DRAM内存)划分为多个固定大小的物理页(PP),

虚拟页和物理页的大小是一样的,通常为4KB。

虚拟页和物理页存在着以下关系:

虚拟页和磁盘文件映射,然后缓存到物理页。

根据是否映射,是否缓存,可以将虚拟页的状态分为以下三种:

1,未映射的页

即虚拟页没有映射到磁盘文件

2,未缓存的页

虚拟页映射到了磁盘文件,但是没有缓存到物理页,也就是内存上。

3,缓存的页

虚拟页映射到了磁盘文件,并且缓存到物理页

如下图所示:

三.虚拟地址的工作原理

对于进程来说,使用的都是虚拟地址。每个进程维护一个单独的页表。何为页表?

页表是一种数组结构,存放着各虚拟页的状态,是否映射,是否缓存。

1,数组的索引号,表示虚拟页号

2,数组的值

若为null,表示未映射的页

若非null,第一位表示有效位,为1,表明缓存的页;为0,表明未缓存的页。

其余位表示缓存到的物理页号。

页表结构图如下:

进程执行时,当需要访问虚拟地址中存放的值时,步骤如下:

1)CPU会先找到虚拟地址所在的虚拟页(VP3),根据页表,找出页表中第3条的值。

判断有效位,为1,DRMA缓存命中,获根据物理页号,找到物理页中的内容,返回。

2)若有效位为0,产生缺页异常,调用内核缺页异常处理程序。

它会选择一个物理页(如PP4),作为牺牲页,将该页的内容刷新到磁盘文件。然后,把VP3映射的磁盘文件,缓存到该物理页。

页表中的第3条,有效位变1,同时,物理页号表号变为PP4。

3)缺页异常处理完毕后,返回中断前的指令,重新执行,此时缓存命中,执行1)

4)将找到的内容映射到高速缓存,CPU从高速缓存中获取该值,结束。

四.使用虚拟地址需要注意的问题

1)磁盘和主存传送页的活动叫做页面调度。页面调度会引起磁盘流量,如果程序的局部性不好,会频繁进行页面调度,叫做“缓存颠簸”。

操作系统会在内存中分配一块交换区作为缓冲区,来加速页面的调度。

2)一级页表占用的空间是比较大的,根据按需调度的原则,一般使用的是多级页表,即一级页表指向二级页表,这样大大压缩了页表的大小。

五.地址翻译

地址翻译指的是DRAM缓存命中时,由虚拟地址找到物理地址的过程。

该过程是完全由硬件来完成的。

1)CPU有一个专门的页表基地址寄存器(PTBR)指向当前页表的基地址,快速定位到该进程的页表。

2)根据虚拟页号,找到虚拟地址在页表的值。

3)根据值中的物理页号,找到物理地址。

六.Linux中的虚拟内存机制

Linux把虚拟内存划分成区域area的集合,一个area包括连续的多个页。

area的数据结构如下所示:

1,内核为每个进程维护了一个单独的任务结果task_struct

2,task_struct的mm指针,指向了mm_struct,该结构描述虚拟内存的运行状态。

3,mm_struct的pgd指针指向进程的一级页表的基地址。

mmap指针,指向vm_area_struct链表。

4,vm_area_struct描述area的结构,vm_start表示area的开始位置,vm_end表示area的结束位置,vm_prot表示area内的页的读写权限,vm_flags表示area内的页面是进程私有还是共享,vm_next指向下一个area节点。


在Linux中,当发生缺页异常时,步骤如下:

1,缺页异常程序,检查虚拟地址在哪个area内。

2,访问的虚拟页若没有读写权限,则触发一个保护异常,终止进程。

3,选择牺牲页,刷新到磁盘,从磁盘加载缺失的内容到物理页,更新页表。

七.Linux虚拟内存需要注意的问题

内存映射机制:初始化虚拟内存区域时,会把虚拟内存和磁盘文件对象对应起来。

由于内存映射机制,一个磁盘文件对象可被多个进程共享访问,也可被多个进程私有访问。

当共享访问时,一个进程的对该对象的修改会显示到其他进程。

当私有访问时,修改时会产生保护故障,内核会拷贝这个私有对象,修改的是这个新对象,其他进程指向的是原来的对象。

fork函数是说明内存映射机制很好的例子:

fork函数会创建带有独立虚拟地址空间的新进程,内核会把当前进程的虚拟内存中数据结构复制一份给新进程。虚拟内存area包括共享区域和私有区域,新建的进程对私有区域做修改时,会触发写时拷贝,为新进程维护私有的虚拟地址空间。

八.虚拟地址作用总结

1,虚拟内存管理可以控制物理内存的访问权限

访问的虚拟页若没有读写权限,则触发一个保护异常,终止进程。

2,虚拟内存让每个进程有独立的地址空间

对于私有区域来说,当不同进程对该区域做修改时,会触发写时拷贝,为新进程维护私有的虚拟地址空间。

3,VA到PA的映射会给分配和释放内存带来方便。

物理内存不连续的地址,可映射到连续的虚拟内存地址。

4,内存效率高

使用了页面调度,不会造成大量的数据装入装出。

更多Linux内核源码高阶知识请加开发交流Q群篇【318652197】获取,进群免费获取相关资料,免费观看公开课技术分享,入群不亏,快来加入我们吧~


全网最详Linux内核技术解析【附视频教程和源码资料】

Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈-学习视频教程-腾讯课堂


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容