[kerneltech] Re: 问个关于内存映射的问题

  • From: Li Haifeng <omycle@xxxxxxxxx>
  • To: Peter Chen <hzpeterchen@xxxxxxxxx>
  • Date: Sun, 10 Jun 2012 20:44:58 +0800

在 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

Other related posts: