在 2012年6月10日 下午8:22,Peter Chen <hzpeterchen@xxxxxxxxx> 写道: > 2012/6/10 Li Haifeng <omycle@xxxxxxxxx>: >> >> >> 在 2012年6月10日 上午11:47,Cong Wang <xiyou.wangcong@xxxxxxxxx>写道: >> >>> 2012/6/8 Li Haifeng <omycle@xxxxxxxxx>: >>> > mmap映射的文件内容也是通过page fault才建立真正的映射的吧。 >>> >>> 这只是内核的做法,它这么做只是为了效率,你在用户空间 >>> 根本用不着关心是不是page fault,因为你看的就是mmap出来 >>> 内存可以用,就这么简单,至于怎么实现,那是内核的问题。 >>> >>> 另外,不同的文件可能实现了不同的->mmap(),比如/dev/zero, >>> 因此也会有不同。 >> >> >> 恩,我的本意是想弄清楚ARM Linux的user space的物理页映射粒度。 >> >> 在ARM中,采用了1-level的以1MB为页大小的mapping,也同时采用了2-level的以4KB为页大小的映射。在内核态,建立的映射,基本上都是1-level的。 > > 如果内核只有一级页表,如何管理1MB内的多块内存? 你可以看看源码。然后,欢迎讨论 > 我的理解: 一旦内核建立完2级页表之后,内核/用户态都是4KB的页面映射,页表始终 > 只有一份。 > >> 它在建立映射的时候,没有采用ARM提供的ASID(是用来tag >> TLB entry的)。而如果是4KB的大小映射,是采用了ASID机制(这个机制在提高contex >> switch的效率方面有很重要的作用)。如果在user >> space分配的物理页大于1MB,在kernel中是没有采用ASID的,我想,这可能会引起Exception. >> 因为,在切换进程的时候,如果是同一个version的ASID,是不会flush TLB的。 >> >> 从Page Fault的源码看,它分配物理页的粒度都是4KB(32位平台) >> >> 所以,如果用户空间分配页都是通过page fault来实现的话,就和ARM Linux中实现的ASID机制以及ARM core提供的机制相吻合了。 >> >> > > > > -- > BR, > Peter Chen