免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: luoyan_xy
打印 上一主题 下一主题

关于linux高端内存管理的疑问 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2011-08-01 11:02 |只看该作者
1.内核在初始化的过程中会为内核建立好页目录表,建立物理地址到虚拟地址的固定线性映射,[0--len]::[3G--3G+len](len <=896MB),那么可不可以这样理解,对于内核空间给定的线性地址,比如0xc1234567,它就必须映射到实际的物理地址0x1234567处,但是系统却不能保证包含此地址的物理页一定能够分配给内核空间使用,因为这个物理页可能恰好分配给了用户空间,那么这种情况下对于内核空间中给定地址的访问就会失败,接下来会发生什么呢? oops,还是会有一系列的页切换去保证内核空间分配到该页?
为什么会失败呢?对于内核空间的固定映射区而言,如果内核愿意,它可以随便修改映射的物理页面,而不管物理页面属于谁的
    2. get_free_pages函数用于分配物理页,并且返回逻辑地址,其中的分配物理页是通过alloc_pages函数调用实现,页地址到逻辑地址的转换是通过page_address函数实现,在page_address函数中直接返回page->virtual,返回物理页的虚拟地址,但是我没有找到这个值是在什么地方赋值的。
     物理页的分配是从free_list中选择的空闲页,这个页结构在mem_map数组中应该只有物理地址才对,因为用户空间、内核空间都会用到这些页,虚拟地址是在建立映射时分配的,那么对于get_free_pages函数中是怎样直接获取逻辑地址的,难道直接加上0xc000000的偏移?

如果get_free_pages申请的是normal,则返回映射的固定区虚拟地址,normal区的virtual是系统初始化时赋值的,如果是high,有可能导致内核失去对这个物理页面的跟踪,因为这个物理页面可能还未映射到虚拟空间的高端映射区。此时get_free_pages返回null,但这个函数却申请了物理页面,内核永远不知道到底是哪个页面。high区物理页面的virtual是在kmap时赋值的

论坛徽章:
0
12 [报告]
发表于 2011-08-01 11:47 |只看该作者
回复 10# allen303allen


    我其实就是这个意思。

   既然内存中的地址映射是固定的已经映射好的,那么其实所属的页结构也是映射好的,但是这些页却可能被用户空间使用,那么这个时候对这些页对应地址的操作会发生什么?

论坛徽章:
0
13 [报告]
发表于 2011-08-01 13:00 |只看该作者
我的理解是这样的:
0-896的线性映射只表明内核对0-896内存有管理权,而管理和使用是两个概念,内核要使用内存时也通过伙伴系统分配的.
如果某些页面已经被分配给了用户空间,那么伙伴系统当然不会再把它分配给内核,所以不会出现内核随便操作用户空间内存页的情况.
当然,内核硬要操作也不会有问题吧,因为映射是存在的.

欢迎高手指正

论坛徽章:
0
14 [报告]
发表于 2011-08-01 13:55 |只看该作者
  ~~~我越看越糊涂了~~~  向学习各位~

论坛徽章:
0
15 [报告]
发表于 2011-08-01 15:54 |只看该作者
回复 12# luoyan_xy

我的看法跟13楼类似,normal区的内存在内核地址空间是映射好的,但是不代表建立了死链接内核任何时候都可以用,只有内核确实分配了那些page,其对应的链接好的内核地址才会被使用。
如果这个page事先已经被用户态程序使用了,他在用户地址空间就有了新的映射,那么他映射好的内核空间地址就不会被访问了,对内核来说,他并没有获得对应的物理页,当然不会去访问那个地址了。

论坛徽章:
0
16 [报告]
发表于 2011-08-01 20:49 |只看该作者
我一直在论坛,想看看谁能回答我的问题,可看见一堆人为这个问题讨论不休
LZ可能有一个惯性思维,认为物理页面必须先申请,再映射,所以才会认为如果物理页面被用户申请了,内核就无法访问。但实际上物理页面完全可以先映射,而不必申请。
内核空间的3G~3G+896M就是在系统初始化时直接建立了到物理内存0~896M(normal区)的映射,如果拿PowerPC为例,Linux使用了TLB1的前三个entry,每个映射256M(总共768M,这个和X86的896M不同)。也就是说内核如果想修改这个896M的任意一个页面,它就可以。如果这个页面被分配给了用户进程,只不过增加了一个映射关系,相当于多个虚拟页面同时映射到这个物理页面。

论坛徽章:
0
17 [报告]
发表于 2011-08-02 14:45 |只看该作者
ULK里说过高端内存映射中任何一种技术都不可能满足对整个RAM同时寻址...

论坛徽章:
0
18 [报告]
发表于 2011-08-02 16:51 |只看该作者
回复 16# qswul


    貌似我的想法一直没能转过来弯。

  我的意思是,内核在启动时会对896MB大小的内存地址做映射,这个映射关系是固定的。

  但同时这个映射关系所关联到的物理页面却还可能被用户空间分配时给使用掉,那么此时这个物理页的访问权应该是用户空间进程。

  那么,假如在这个时候,假设我们得知了这个物理页面的地址,按照内核固定映射得出其逻辑地址,通过逻辑地址进行一次写操作,那么这个时候系统会报错吗?

  我感觉不会,因为内核存在这样的映射关系,按理说能访问这个页面,但实际上这个页面暂时并不属于内核访问,这样不就破坏了其他进程的数据了吗。。。

  这就是我纠结的问题所在。。

论坛徽章:
0
19 [报告]
发表于 2011-08-02 16:54 |只看该作者
回复 15# allen303allen


    这个问题基本上跟你的看法一样,疑问在于,对于被用户空间使用了的normal页面,其在内核空间的映射关系应该还存在,假如我们能够得到这个地址,那内核也就能修改这个页面的内容了,这样就破坏了其他进程的内容了吧。。。

论坛徽章:
0
20 [报告]
发表于 2011-08-02 17:06 |只看该作者
回复 19# luoyan_xy

已经被分配出去的页面当然不会分配给另外一个进程了,不然还怎么管。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP