alloc_pages分配2^order个物理页,返回指向第一页结构的指针
eg,
page_address返回给定page的线性地址,如果给定的page还没有映射则返回NULL(linux-2.6.11.12\mm\highmem.c
)
其中:
内核用数据结构page描述一个页框的状态信息,所有的页描述符存放在全局mem_map数组中,其数组的下标为页框号(pfn),就代表了page结构对应第几个物理页面。pfn就是指page结构对应的物理页面序号。
内核中有一个mem_map,这是一个全局变量,是一个指针,指向一个page数据结构的数组,每个page数据结构代表着一个物理页面,整个数组代表着系统中的全部物理页面,因此,页面表项的高20位对于软件和MMU硬件有着不同的意义,对于软件,这是一个物理页面的序号,将这个序号用作下标就可以从mem_map找到代表这个物理页面的page数据结构,对于硬件,则(在低位补上12个0后)就是物理页面的起始地址。
通过__var宏做计算:__var(pfn<<PAGE_SHIFT) = (void*)(pfn<<PAGE_SHIFT + PAGE_OFFSET)
如果pfn=2,因为PAGE_OFFSET = 0xC0000000(偏移掉3G用户空间)PAGE_SHIFT=12(表示页大小是4k) ,则计算出的线性地址就是:2<<12 + 0xC0000000 = 0xC0002000。
即
返回页面物理地址加上固定的偏移
(
典型情况下,偏移值是3G
)
,即返回其内核线性地址(如,0xC0000000-0xFFFFFFFF)。