arm64_linux head.S的执行流程(3.18)- 4.stext之calc_phys_offset

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中

参考文档

1.https://blog.csdn.net/xichangbao/article/details/51568782
2.https://www.cnblogs.com/smartjourneys/diary/2017/04/27/6774121.html
3.http://www.wowotech.net/armv8a_arch/arm64_initialize_1.html ARM64的启动过程之(一):内核第一个脚印
3.http://www.wowotech.net/armv8a_arch/create_page_tables.html ARM64的启动过程之(二):创建启动阶段的页表
4.http://www.wowotech.net/armv8a_arch/__cpu_setup.html ARM64的启动过程之(三):为打开MMU而进行的CPU初始化
5.http://www.wowotech.net/armv8a_arch/turn-on-mmu.html ARM64的启动过程之(四):打开MMU
6.https://blog.csdn.net/xichangbao/article/details/51568782 Kernel启动流程源码解析 1 head.S
7.https://blog.csdn.net/xichangbao/article/details/51605462 Kernel启动流程源码解析 2 head.S

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值