标签:kernel head phys offset 虚拟地址 物理地址 OFFSET PAGE
1.前言
本文基于高通8996平台,kernel版本为3.18.31。
本文主要介绍head.S的calc_phys_offset执行流程
2. 几个宏定义
- PHYS_OFFSET
#arch/arm64/include/asm/memory.h
/* PHYS_OFFSET - the physical address of the start of memory. */
#define PHYS_OFFSET ({ memstart_addr; })
内存的起始物理地址
- PAGE_OFFSET
#arch/arm64/include/asm/memory.h
#define PAGE_OFFSET (UL(0xffffffffffffffff) << (VA_BITS - 1))
kernel image起始的虚拟内存地址
定义在kernel/arch/arm64/include/asm/memory.h中,我们使用CONFIG_ARM64_VA_BITS为39,PAGE_OFFSET等于0xffffffc000000000
3.__calc_phys_offset代码说明
物理地址相对虚拟地址的偏移保存到x28,计算kernel_image的物理地址保存到x24,这个就是PHYS_OFFSET
/*
* Calculate the start of physical memory.
*/
__calc_phys_offset:
// adr伪指令用于将一个地址加载到寄存器,
// 取到的是相对于PC寄存器的地址,由于此刻PC寄存器中值是物理地址,
// 所以x0中取到的即是标号1处的物理地址
adr x0, 1f
// 将标号1处的的前八字节(.的虚拟地址)给x1,后八字节即PAGE_OFFSET给x2
ldp x1, x2, [x0]
// .处的物理地址减去虚拟地址,即x28中保存的是物理地址相对虚拟地址的偏移
sub x28, x0, x1
// 计算出kernel image起始的物理地址给x24
// PAGE_OFFSET+虚拟地址与物理地址偏移
add x24, x2, x28
ret
ENDPROC(__calc_phys_offset)
.align 3
// 用来定义一个quad word也就是4字(8字节),“.”表示当前虚拟地址
1: .quad .
//此处是说将PAGE_OFFSET放置在这个位置,占用8个字节
.quad PAGE_OFFSE
4.总结
__calc_phys_offset的主要作用就是通过计算物理地址与虚拟地址偏移,保存到x28, 而kernel image的虚拟地址为PAGE_OFFSET,因此可以获知kernel image的物理地址,将kernel image的物理地址保存到x24中
标签:kernel,head,phys,offset,虚拟地址,物理地址,OFFSET,PAGE 来源: https://blog.csdn.net/jasonactions/article/details/111058110
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。