|
楼主 |
发表于 2006-12-17 14:30:33
|
显示全部楼层
很感激各位的回答,我具体说一下我现在面临的情况,拜托各位帮忙看看,谢谢了:
我的毕业设计是在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,不过不确定,请您指点一下。:)谢谢了。 |
|