+ -
当前位置:首页 → 问答吧 → 【LKD疑问】获得页

【LKD疑问】获得页

时间:2010-10-03

来源:互联网

LKD 11.3节里介绍了获得页的几个接口。
1) struct page* alloc_pages(unsigned int gfp_mask, unsigned int order): 获得(1<<order)个连续的物理页。
2) unsigned long __get_free_pages(unsigned int gfp_mask, unsigned int order)
书中这样写道:
这个函数与alloc_pages作用相同,不过它直接返回请求的第一个页的逻辑地址。因为页是连续的,
因此其他页也会紧随其后。

我的疑问是:
我理解页的连续能推导出物理地址连续,但是逻辑地址也连续吗?不一定吧?
如果逻辑地址不连续,那么__get_free_pages返回值是第一个页的逻辑地址,怎么访问后续的页?

作者: Metrotrain   发布时间: 2010-10-03

在低896M内存中,为内核动态分配的物理内存是与内核的虚拟内存严格映射的。也就是说你分到的物理地址是A至B,那么内核通过虚拟地址来访问(A+3G)至(B+3G)。

与为用户空间分配内存一对比就知道了。为用户空间分配内存时,先在进程里的虚拟地址空间中找到合适大小的虚拟地址段,再从可用物理内存中找到合适大小的物理地址段,最后将两者映射。内核要内存时只需要中间那一步。

作者: tempname2   发布时间: 2010-10-03