免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1176 | 回复: 4
打印 上一主题 下一主题

事关毕业,请知道的大虾帮个忙,关于内存管理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-16 19:01 |只看该作者 |倒序浏览
最近论文里面要涉及到Linux的内存管理,有一个根本的概念弄不清楚:
就是Linux里面“系统空间”和“用户空间”到底是怎样划分的,基于什么样的标准来划分的?可以动态改变吗?从代码的角度,在哪里说明了哪一段是“系统空间”?哪一段是“用户空间”?

“系统空间和用户空间尽管是开始的时候通过TASK_SIZE的定义把最高的1GB给了系统,但是在系统完成这一部分的初始化之后,在接下来的初始化过程中可以通过别的方式(非修改TASK_SIZE)调整系统空间和用户空间的大小,甚至可使两者交错出现”,这个观点,对吗?

“只有系统态能访问到的空间才能称为系统空间,只要是用户进程可以直接访问的空间都是用户空间,用户进程在不经过系统调用的前提下,无法访问系统空间”,这个观点,对吗?

论坛徽章:
0
2 [报告]
发表于 2006-12-16 21:15 |只看该作者
>>就是Linux里面“系统空间”和“用户空间”到底是怎样划分的,基于什么样的标准来划分的?可以动态改变吗?从代码的角度,在哪里说明了哪一段是“系统空间”?哪一段是“用户空间”?
有各种角度的理解.
1.从虚拟地址的角度,进程的虚拟地址空间分系统空间和用户空间,linux上TASK_SIZE就是分水岭,可以调整.
2.从指令的角度看,系统空间就是可执行特权指令的空间.用户空间只能执行普通指令,可以互相切换.
3.从权限环的角度看,处于内环的是系统空间,处于外环的是用户空间.
4.从物理地址的角度看,物理内存分系统空间映射的内存和用户空间映射的内存,可以共享.
5.从代码的角度,段表和页表指明哪个是系统空间,哪个是用户空间.

>>“系统空间和用户空间尽管是开始的时候通过TASK_SIZE的定义把最高的1GB给了系统,但是在系统完成这一部分的初始化之后,在接下来的初始化过程中可以通过别的方式(非修改TASK_SIZE)调整系统空间和用户空间的大小,甚至可使两者交错出现”,这个观点,对吗?
可以.

>>只有系统态能访问到的空间才能称为系统空间,只要是用户进程可以直接访问的空间都是用户空间,用户进程在不经过系统调用的前提下,无法访问系统空间”,这个观点,对吗?
基本是正确的.但是从物理空间的角度看,用户进程可以和内核共享物理页.

论坛徽章:
0
3 [报告]
发表于 2006-12-17 10:18 |只看该作者

回复 2楼 qtdszws 的帖子

qtdszws,您好!
很感激您的回答,那现在是这样一个具体的情况:
我的毕业设计是在ARM7TDMI(带MMU)上移植的一个ARMLinux(2.40.8版内核),然后在上面做的一些应用。我的试验板上有16M的SDRAM,但是在开始的machine_desc中,只上报给了系统15M,这样系统所管理的内存被我隐藏了1M。在接下来的系统初始化过程中,我在map_desc中把这1M以下面的形式加了上去:{0xC0F00000,0xC0F00000,0,DOMAIN_KERNEL,1,1},而在系统初始化的create_mapping()函数中自然会调用这个生成此时的系统空间映射表项。
当系统初始化完成之后,我调用用户进程,用户进程可以直接访问该段内存(隐藏下来的那1M空间)进行读写。而同时,我在IRQ进程中,其也可以直接访问该段内存进行读写。我现在的问题就是,这1M空间到底是属于系统空间还是用户空间?

我个人的看法是它应该属于“系统空间”,理由有下面几点,不一定对,希望您能帮我指点一下,现在自己是有点迷惑了:
1、因为一开始已经在TASK_SIZE里面定义了0xC0000000UL,而后面并没有作任何改动。所以用户空间的上限就应该只到0xC0000000,并且进程的PCB里面有一个专门的字段addresslimit也说明了只要不修改的话,PCB的用户空间是固定的(0~addresslimit),而我现在这里直接访问的地址是0xC0F00000UL,已经处于了非用户空间的区域;
2、在Linux里面,我认为限制用户进程访问一段系统空间的关键是在于一个访问权限的设置。但是假如我修改了一段系统空间的访问权限,也就是说我让一段系统空间的访问权限低于用户态,这样即使用户进程也可以直接访问系统空间。例如ARM里面,其用来控制访问权限的就是域值和AP值两个手段,假如我让其变成都可以访问的,那这样一来,用户进程也一样可以直接访问系统空间了;
3、Linux中,假如是x86结构,其通过GDT、LDT、IDT和TSS来进行内存管理,其中GDT就只有一张,其映射的空间应该是系统空间,为所有的进程共享。当进程切换的时候,LDT是要随进程更换的,但是GDT不会。而在ARMLinux中,内核进程关于系统空间的映射是放在init_mm里面的一张映射表,所有的进程都会不加修改地继承这张映射表,而在不同的进程切换的时候,其用户空间的映射表是会因为Copy On Write 机制而改变的。并且,我在试验中,我只是修改了内核进程的页面映射表(因为我是在系统初始化的时候进行的这个页面映射表项的生成,这个时候根本还没有用户进程的),假如这个页面映射表不属于系统空间的页面映射表,那如何能够被所有的用户进程所继承并顺利访问该段空间?既然现在能够被用户进程继承并顺利访问,所以我认为这个页面映射表项是在系统空间的页面映射表里面的,这样一来的话,是否能说这段空间就是“系统空间”呢?
4、我想您肯定看到了,我在修改map_desc结构的时候,还专门把它放到了kernel域,不过,试验结果却表明只要我修改了AP值,无论放在kernel或者user、I/O域,都不会影响用户进程的访问。如此看来,是否能够支持我的第二个观点的成立?但是,这样一来,在ARM上,系统空间和用户空间的界定标准到底是什么呢?在毛德操、胡希明老师的《嵌入式系统--采用公开源码和StrongARM/Xscale处理器》的书中第286页开始,说道:“当(ARM)的AP值为0b01时,CPU在用户态是不能访问该页面的,而系统态则不受影响,所以这实际上说明了相应页面是属于用户空间还是系统空间”,所以但我把这1M的内存的AP值改为0b01的时候,确实可以发生用户进程越权访问的错误,这是否说明其确实还是处于系统空间的位置呢?但是当改为0b11的时候,用户进程就可以直接访问了。这是否还能说明该空间还是属于“系统空间”呢?
5、从用户进程不经系统调用而直接访问系统空间,好像是有可能的。曾经在网上看到过,有人利用/proc的特点直接访问系统空间,或者,像我这样的一种方式。不过自己确实是不能肯定,这样的几种方式,访问到的“系统空间”,能称之为“系统空间”吗?我觉得是,毕竟还是经过MMU,同时该地址确确实实是超过了PCB里面的addresslimit,不过不确定,请您指点一下。:)谢谢了。

论坛徽章:
0
4 [报告]
发表于 2006-12-17 12:58 |只看该作者
我怎么觉得机器中的所有内存都是内核所有的,用户进程所用的内存只不过是内核暂时借给用户的。所以,不用过分的去区分系统与用户的区别。
当机器启动之后,内核收编所有的内存页。当用户进程需要内存的时候,内核找到一块大小合适的页,划给用户。修改相应的用户页表,使需要内存的用户地址与所得到的内存建立关系(修改页表 ),用完之后再回收回来,然后销帐。所以,我觉得系统空间和用户空间两者是交错出现,内核并不保证每次都从最低的页开始分配,所以在物理内存中会出现一段是内核的,然后是一段分配给用户的内存,再然后又是内核的。
用户空间就是他那所谓的3G空间,当然这是可以调的。/proc只是一个内核向用户开放的接口,是可以通过他访问内核,但前提是你能访问的只是他所开放的。

论坛徽章:
0
5 [报告]
发表于 2006-12-19 23:08 |只看该作者
其实你的第二点理解已回答了你自己的问题。所谓“TASK_SIZE以上是系统空间”,其实质就是TASK_SIZE以上的虚地址应在映射表中被设置为高权限,但你完全可以将其设为低权限,这样,TASK_SIZE以上的地址名义上还是系统空间,但实际上已和用户空间无异了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP