- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
page address 函数分析 如何通过pa
page address 函数分析 如何通过pa
由于X86平台上面,内存是划分为低端内存和高端内存的,所以在两个区域内的page查找对应的虚拟地址是不一样的。
一.x86上关于page_address()函数的定义
在include/linux/mm.h里面,有对page_address()函数的三种宏定义,主要依赖于不同的平台:
首先来看看几个宏的定义:
CONFIG_HIGHMEM:顾名思义,就是是否支持高端内存,可以查看config文件,一般推荐内存超过896M的时候,才配置为支持高端内存。
WANT_PAGE_VIRTUAL:X86平台是没有定义的。
所以下面的HASHED_PAGE_VIRTUAL在支持高端内存的i386平台上是有定义的
#if defined(CONFIG_HIGHMEM)!defined(WANT_PAGE_VIRTUAL)
#define HASHED_PAGE_VIRTUAL
#endif 1.//所以这里是假的,page_address()在i386上不是在这里定义的
#if defined(WANT_PAGE_VIRTUAL)
#define page_address(page)((page)-virtual)
#define set_page_address(page,address)\
do{\
(page)-virtual=(address);\
}while(0)
#define page_address_init()do{}while(0)
#endif 2.//在没有配置CONFIG_HIGHMEM的i386平台上,page_address是在这里定义的
#if!defined(HASHED_PAGE_VIRTUAL)!defined(WANT_PAGE_VIRTUAL)
#define page_address(page)lowmem_page_address(page)
#define set_page_address(page,address)do{}while(0)
#define page_address_init()do{}while(0)
#endif 3.//所以支持高端内存的i386平台上,page_address()是在这里定义的
#if defined(HASHED_PAGE_VIRTUAL)
void*page_address(struct page*page);
void set_page_address(struct page*page,void*virtual);
void page_address_init(void);
#endif
二.在低端内存中的page对应的page_address()的实现
在没有配置CONFIG_HIGHMEM的i386平台上,page_address()是等同于lowmem_page_address():
#define page_address(page)lowmem_page_address(page)
static __always_inline void*lowmem_page_address(struct page*page)
{
return __va(page_to_pfn(page)PAGE_SHIFT);
}
#define page_to_pfn(page)((unsigned long)((page)-mem_map)+\
ARCH_PFN_OFFSET)
#define __va(x)((void*)((unsigned long)(x)+PAGE_OFFSET))
我们知道,在小于896M(低端内存)的物理地址空间和3G--3G+896M的线性地址空间是一一对应映射的,所以我们只要知道page所对应的物理地址,就可以知道这个page对应的线性地址空间(pa+PAGE_OFFSET)。
那如何找一个page对应的物理地址呢?我们知道物理内存按照大小为(1 PAGE_SHIFT)分为很多个页,每个这样的页就对应一个struct page*page结构,这些页描述结构存放在一个称之为mem_map的数组里面,而且是严格按照物理内存的顺序来存放的,也就是物理上的第一个页描述结构,作为mem_map数组的第一个元素,依次类推。所以,每个页描述结构(page)在数组mem_map里的位置在乘以页的大小,就可以得到该页的物理地址了。上面的代码就是依照这个原理来的:
page_to_pfn(page)函数就是得到每个page在mem_map里的位置,左移PAGE_SHIFT就是乘以页的大小,这就得到了该页的物理地址。这个物理地址加上个PAGE_OFFSET(3G)就得到了该page的线性地址了
在低端
您可能关注的文档
最近下载
- 河南科技大学《物权法》2021-2022学年第一学期期末试卷.doc VIP
- GSP内审检查表完整版.doc VIP
- JJG(交通) 156-2020 -振弦式应变测量系统检定规程.docx VIP
- 福建省晋江市季延中学2024年高考适应性考试英语试卷含解析.doc VIP
- 15《红红火火中国年》第1课时(课件)2025道德与法治二年级上册统编版.ppt
- 2025年连云港专业技术人员公共课程公需考试-学习贯彻党的二十届三中全会精神.docx VIP
- 福建省晋江市季延中学2025届高三下学期期中历史试题模拟试题含解析.doc VIP
- 机械制图习题集(第三版).docx VIP
- 23.黄继光 课件(共45张PPT).pptx VIP
- 大明英烈传京畿歼灭战.pdf VIP
原创力文档


文档评论(0)