Chinaunix

标题: 关于分配内存 [打印本页]

作者: jasonsungblog    时间: 2014-06-14 14:12
标题: 关于分配内存
alloc_pages是获取一些连续的page,貌似是可以获取高端内存(不太确定)?那get_free_page是通过alloc_page分配的,那通过get_free_page分配的内存,物理地址和线性地址之间转换不能简单的加减0xc0000000了?
作者: humjb_1983    时间: 2014-06-14 15:33
alloc_page(gfp_mask)         只分配一页,返回指向页结构的指针
alloc_pages(gfp_mask, order)         分配 2^order 个页,返回指向第一页页结构的指针
__get_free_page(gfp_mask)         只分配一页,返回指向其线性地址的指针
__get_free_pages(gfp_mask, order)         分配 2^order 个页,返回指向第一页线性地址的指针
alloc_page分配高端内存肯定是可以的,取决于gfp_mask传入的标志:__GFP_HIGHMEM
alloc_page和get_free_page的区别就在上面了,后者返回的是线性地址。
get_free_page中不能传入__GFP_HIGHMEM标志,内核会给出告警,因为高端内存没有不能进行线性映射。
作者: jasonsungblog    时间: 2014-06-15 20:24
嗯,讲的有道理。
但是“高端内存没有不能进行线性映射”?高端内存不是可以永久映射或者临时映射建立页表映射到线性地址吗?
作者: humjb_1983    时间: 2014-06-16 08:36
jasonsungblog 发表于 2014-06-15 20:24
嗯,讲的有道理。
但是“高端内存没有不能进行线性映射”?高端内存不是可以永久映射或者临时映射建立页表 ...

不好意思打错了,应该是“高端内存不能进行线性映射”。
是的,高端内存是可以通过页表进行非线性映射,但是在get_free_pages中没有这样做,如果需要在内核使用高端内存,应该需要其它方式了,比如vmalloc,或手工映射。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2