关于vmalloc
内核空间中,从3G到vmalloc_start这段地址是物理内存映射区域(该区域中包含了内核镜像、物理页框表mem_map等等)
kmalloc和get_free_page申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在较简单的转换关系,virt_to_phys()可以实现内核虚拟地址转化为物理地址
vmalloc申请的内存则位于vmalloc_start~vmalloc_end之间,与物理地址没有简单的转换关系,虽然在逻辑上它们也是连续的,但是在物理上它们不要求连续。
我的问题是:
1系统初始化的时候,第二次正式初始化页表,应该是对线性地址范围从_end到zone_normal结束(即896m)之间的页面提供了映射.这部分的物理地址和线性地址有简单的转换关系,如上所提到的.
2而在vmalloc()辗转调用vmalloc_area_pages()时,分配所需页面时,这里所用到的page,对应的映射关系是不是没有在前面的系统初始化中完成,而单独在这里实现的?即这里的动作对上面1里的系统页表毫无影响,而仅仅是在1的基础之上另外映射了一个vm_area对应的区域?
3伙伴算法可以分配的页面包括哪些?包括vmalloc_start~vmalloc_end对应的物理页面吗?
恕我愚钝,不知是否表达清楚了我的意思.请大家解惑,谢谢!