alloc_pages与page_address

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)。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值