免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 瀚海书香

linux内存管理讨论——欢迎大家围观! [复制链接]

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2012-03-29 07:42 |显示全部楼层
回复 18# g__gle
高手都习惯潜水啊,这次终于出来了

   

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2012-03-29 07:45 |显示全部楼层
回复 15# amarant
内存管理一节我也非常感兴趣。瀚海书香版主说的都是x86架构上的内存管理,各种的架构对内存的管理很大的不一样。像mips的内存管理就和X86有很大的不一样。内存管理这一章不深入理解下架构上的实现,总会有一些说不清道不明的感觉。

就我本人来说,真正了解过的只有x86的内存管理,看过一点arm的。其他的由于工作原因,很少接触。
但是这个帖子的目的不局限于某一种硬件平台,期望amarant兄分析一些宝贵资源啊

   

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2012-03-29 07:47 |显示全部楼层
回复 20# 塑料袋
以塑料袋兄在硬件方面的知识,可以把mem/tlb cache这块顺便给大家说说

   

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2012-03-29 08:11 |显示全部楼层
回复 16# dooros
由于不同的操作系统实现不同,而且我手头也没有这本书,这能根据你的描述以x86 linux为例,简单回答几个问题:

一、Page 116 4.3.2 地址变换机构
2.具有快表的地址变换机构
快表用以存放当前访问的那些页表项。
问题:在单处理机系统中,是不是每当进程阻塞、挂起、结束都要清除一次快表,即:快表只保留当前进程的页表项?
当前访问的理解?比如现在进程使用50个页,则快表中只保存50个页的信息,一段时间后,进程使用20个页,则快表立即清除其余30个页的信息,只保留20个页的信息。这样理解对否?
如果在多处理机系统中,进程并发执行,则快表同时保存多个进程的页表项(页号与物理块号的对应信息),如果快表中多个进程的页号相同,岂不乱套?是不是多处理机系统中有多个快表?
所谓的快表,在linux下就是TLB。
当进程的页表发生变化的时候,会修改TLB的内容;当CPU上发生进程切换的时候,会将本地的TLB清空(不考虑惰性TLB的情况)。
在SMP下,每个CPU都有一个本地TLB。但是仍然会出现多个CPU使用同一个页表集的情况,这样每当某一个CPU的TLB发生变化,都会通过IPI通知其他CPU修改各自的TLB项。

二、Page 114 4.3.1 页面与页表
问题:在分页存储管理中是所有的进程的页面大小都相等,还是不同进程有不同的页面大小?
分页存储管理中是不是把所有内存都划分为大小相等的物理块?页表是不是也存储在这样的物理块中?还是页表独立分配空间?
所有进程的页大小是相同的。
分页存储将所有的物理内存划分为大小相等的物理块。页表也是存储在这些物理块中。

三、Page 119 4.3.3 两级和多级页表
2 多级页表
倒数第二段最后一句:
这样的结果显然是不能令人接受的,因此必须采用多级页表,将外层页表再进行分页,也是将各分页离散地装入到不相邻的物理块中,再利用第二级的外层页表来映射它们之间的关系。
问题:这里是不是只能使用将部分页表调入内存这种方法?
不是的。多级页表的使用会减少因为页表管理所占用的物理地址。
四、Page 159 5.3.4缓冲池
第一段的最后一句话:为了提高缓冲区的利用率,目前广泛流行公用缓冲池;在池中设置了多个可供若干个进程共享的缓冲区。
问题:是不是整个缓冲池有一个空缓冲队列emq,而对应每个进程均需要一个输入队列inq和一个输出队列outq?如果整个缓冲区仅有一个输入队列inq 和一个输出队列outq,那么,在进程共享使用时,岂不是无法确定摘取的是否是自己需要的缓冲区?另外,队列的数据结构也不允许随机摘取。
这个不知道描述的什么?难道是linux下的slab
   

论坛徽章:
0
发表于 2012-03-29 09:40 |显示全部楼层
可以看看此书,书名: 深入理解Linux虚拟内存管理
LINUX内存管理代码模块主要分为4个部分:
1.        Out of memory 代码在mm/oom_kill.c 貌似用于杀进程的时候对内存的操作
2.        虚拟内存的分配 代码在mm/vmalloc.c
3.        物理内存页面分配 代码在mm/page_alloc.cVMA(virtual memory addresses)的 创建和进程内的内存区域的管理
4.        这些模块,贯穿与其他kernel代码之中,形成更复杂的系统模块,如页面替换策略,buffer的输入输出等

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2012-03-29 10:55 |显示全部楼层
回复 25# lujian19861986
欢迎分享读后感

   

论坛徽章:
0
发表于 2012-03-29 11:17 |显示全部楼层
强力围观

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
发表于 2012-03-29 11:49 |显示全部楼层
ARM在内存管理上,和x86的区别主要是页表构造不同。

kernel里的注释已经说的比较清楚了,解释arch/arm/include/asm/pgtable.h里的注释如下:

从硬件上说,ARM期望使用二级页表结构:
1) 第一级有4096个目录项
2) 第二级的每个表中,有256个目录项
每个目录项均为32bit。

第二级中,每个目录项指向了4096大小的page。这样,系统共 :pgd的4096项 * pte的256项 * 每页的4096大小 = 4G地址空间。

ARM的问题是,第二级每个目录项的32bit中,绝大部分已经为硬件所使用,并且没有accessed与dirty位。
accessed位为内存回收的依据,确定每个页在LRU链中位置;
dirty位作为内存回写的依据,脏页面应回写至文件或交换区。

因此,linux在构造页表时,制造了一个假象:
1) 硬件PGD还是4096项,每项4字节;但是linux按照PGD共2048项,每项8字节来计算,计算得来的每项中实际都含有两个pgd项。
2) 硬件PTE还是256项,每项4字节;但是linux每次分配pte表时,都分配4K大小的页,页的前2048字节折合512个pte项,即折合两个硬件的pte表;页的后2048字节留作它用,折合为虚拟的512个pte项,即折合两个虚拟的pte表,与前半页对应。

这样,2)中前半页折合出来的两个硬件pte表,正好填入1)中的2个pgd项中。

而且:
2)中前半页折合出来的两个硬件pte表中,每项都包含一些页的属性bit,如是否present,是否可写....这些属性均为ARM硬件支持的属性,命名为PTE_xxx
2)中后半页折合出来的两个虚拟pte表中,每项都包含一些页的属性bit,如是否accessed,是否dirty....这些属性均为ARM硬件不能支持的属性,命名为L_PTE_xxx

这样,就能模拟出来诸如accessed,dirty.....这样硬件还不支持的属性。

比如说模拟dirty:我们可以另页属性为不可写,一个写操作将引发页保护异常,进入到页异常的处理程序handle_pte_fault()后,linux将把虚拟pte项中置上L_PTE_dirty标志,同时将硬件pte项修改为可写;kswapd在操作LRU的时候,将清除掉虚拟pte项中的L_PTE_dirty位,同时也清除掉硬件pte项中的可写属性

比如说模拟access:我们可以清掉硬件pte中的present位,另映射不存在,一个读写操作将引发缺页异常,进入到页异常的处理程序handle_pte_fault()后,linux将把虚拟pte项中置上L_PTE_accessed标志,同时将置位硬件pte项的present位;kswapd在操作LRU的时候,将清除掉虚拟pte项中的L_PTE_access位,同时也清除掉硬件pte项中的present属性

注释中最后还提到,这么搞的话,应注意刷TLB,以另对硬件pte项的修改可见。

论坛徽章:
0
发表于 2012-03-29 13:39 |显示全部楼层
回复 1# 瀚海书香


    LINUX采用的是分页制,而对于CPU提供的分段制,可以理解系统进行了直接的穿透

论坛徽章:
0
发表于 2012-03-29 13:41 |显示全部楼层
现在市面上的很多书,很多都是从内核角度来描述内存管理,包括哪些元素呀,各个元素的关联呀,虚拟地址映射呀等。
但是,内核就是为上层应用程序服务的,我们能否从应用程序的角度来描述内存管理呢?

进程启动的时候,需要把进程image加载到内存,这会涉及到内存管理。
进程从磁盘中读取文件的时候,需要把文件内容读取到内存,这也会涉及到内存管理。
进程加载动态链接库的时候,需要把动态库的代码和数据段加载到进程虚拟地址空间,这也会涉及到内存管理。

纯粹的讨论内存管理,个人感觉不能融会贯通地掌握内存管理的精华。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP