adrp 命令为何能获取符号的地址

news2024/11/19 16:48:41

疑问所在

在linux 启动时,在如下位置会将bootloader 传入的x0 - x3 参数保存到boot_args[] 变量中。代码如下:

/*                                                                                                                                                                                                              
 * Preserve the arguments passed by the bootloader in x0 .. x3                      
 */                                                                                 
preserve_boot_args:                                                                 
    mov x21, x0             // x21=FDT                                              
                                                                                    
    adr_l   x0, boot_args           // record the contents of                       
    stp x21, x1, [x0]           // x0 .. x3 at kernel entry                         
    stp x2, x3, [x0, #16]                                                           
                                                                                    
    dmb sy              // needed before dc ivac with                               
                        // MMU off                                                  
                                                                                    
    mov x1, #0x20           // 4 x 8 bytes                                          
    b   __inval_dcache_area     // tail call                                        
ENDPROC(preserve_boot_args)

其中adr_l x0, boot_args 命令就是获取boot_args 的地址并存到x0 寄存器。
adr_l 的定义在arch/arm64/include/asm/assembler.h 中,如下:

    .macro  adr_l, dst, sym                                                         
    adrp    \dst, \sym                                                              
    add \dst, \dst, :lo12:\sym                                                                                                                                                                                  
    .endm 

将adr_l x0, boot_args 展开,如下:

adrp x0, boot_args
add x0, x0, :lo12:boot_args

即先获取boot_args 的页地址,再加上boot_args 的低12位,即得到boot_args 的地址。
看到这里我有如下两个疑问:

  1. 此时x0 保存的是物理地址还是虚拟地址?
  2. boot_args 定义在某个.c 中,此时mmu 未打开,页表也未建立,为什么adrp 指令能拿到boot_args 的地址?

adrp arm 官方文档

ARM 官方文档中对adrp 的解释如下
adrp 官方文档
即,adrp 的作用是:
= (当前的 PC 地址所在page 的基地址) + (imm)

其中,imm 为label 所在page 地址 与 当前pc 的page 地址的差。
也就是说,label 在编译时,已经被替换成了一个偏移量。

adrp 实例

将vmlinux 反汇编如下:

ffff800011310020 <preserve_boot_args>:
ffff800011310020:       aa0003f5        mov     x21, x0
ffff800011310024:       d00042a0        adrp    x0, ffff800011b66000 <boot_args>
ffff800011310028:       91000000        add     x0, x0, #0x0
ffff80001131002c:       a9000415        stp     x21, x1, [x0]
ffff800011310030:       a9010c02        stp     x2, x3, [x0,#16]
ffff800011310034:       d5033fbf        dmb     sy
ffff800011310038:       d2800401        mov     x1, #0x20                       // #32
ffff80001131003c:       17b65539        b       ffff8000100a5520 <__inval_dcache_area>
...
ffff800011b66000 <boot_args>

d00042a0 这个指令,参考图“adrp 官方文档”,各个字段的值如下:
immhi = 0x215,immlo = 0x2
imm = ( (immhi << 2) | immlo ) << 12 = 0x856000
Xd = x0
adrp 指令所在的pc 为 0xffff800011310024

则指令 d00042a0 等效为:
x0 = pc & 0xfffffffffffff000 + imm

x0 = (0xffff800011310024 & 0xfffffffffffff000) + imm = 0xffff800011b66000
即 boot_args 的地址。

其实,preserve_boot_args 这个阶段,mmu 还没有打开,pc 并非链接地址 0xffff800011310024,而是一个物理地址。不过该指令与boot_args 地址的offset 是固定不变的,即imm,所以最终仍能得到正确的boot_args 的物理地址。

总结

adrp 在编译时,会记录label 地址与当前指令地址的offset。在运行时,pc + offset 就能得到label 的地址。
又因为arm64 指令长度的限制,所以adrp 这条指令得到的地址仅仅精确到了label 所在的页的基地址,需要配合ADD 加上label 的lo12 位才能得到准确地址。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/163295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

神经网络基础部件-损失函数详解

一&#xff0c;损失函数概述 大多数深度学习算法都会涉及某种形式的优化&#xff0c;所谓优化指的是改变 xxx 以最小化或最大化某个函数 f(x)f(x)f(x) 的任务&#xff0c;我们通常以最小化 f(x)f(x)f(x) 指代大多数最优化问题。 在机器学习中&#xff0c;损失函数是代价函数的…

Spring Security 多过滤链的使用

一、背景 在我们实际的开发过程中&#xff0c;有些时候可能存在这么一些情况&#xff0c;某些api 比如&#xff1a; /api/** 这些是给App端使用的&#xff0c;数据的返回都是以JSON的格式返回&#xff0c;且这些API的认证方式都是使用的TOKEN进行认证。而除了 /api/** 这些API…

Qt扫盲-QTextEdit理论总结

QTextEdit理论总结一、概述二、用途一&#xff1a;富文本阅读器1. 用法2. 快捷键绑定三、用途二&#xff1a;编辑器1. 用法2. 拖拽3. 快捷键绑定四、常用功能五、信号一、概述 QTextEdit是一个先进的所见即所得的 富文本 查看器/编辑器&#xff0c;支持使用 html 风格的标签或…

【QT】.pro 文件

&#x1f33f;作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;QT开发 .pro 文件是什么 .pro就是工程文件(project)&#xff0c;它是qmake自动生成的用于生产makefile的配置文件。类似于VS中的.sln 和vsproj文件 默认情况下&#xff0c;每个 Qt 项目都包含一个后缀名为…

Huffman编码实现文件的压缩和解压缩

一个项目&#xff0c;不过处理起来也比较麻烦&#xff0c;配套可以和文件传输放一起 前提知识&#xff1a; 哈夫曼树和哈夫曼编码的概念和构建 1&#xff1a;n个数构成的哈夫曼树一共有2*n-1个结点>8 -> 15 2&#xff1a;数字越大的数离根节点越近&#xff0c;越小的数离…

无线耳机跑步会不会掉、最适合跑步用的耳机排名

现在&#xff0c;喜欢运动的人越来越多了。大家都有体会&#xff0c;多数运动是相对枯燥的&#xff0c;在运动时听听音乐&#xff0c;那是多么惬意的事情啊。为此&#xff0c;体验过多款耳机&#xff0c;但令我很满意的甚少。相信不少喜欢运动的朋友都有着跟我一样的烦恼吧&…

【Java基础知识3】Java注释:单行、多行、文档注释(如何通过 javadoc 命令生成代码文档、如何在IEDA配置自动为所有的类都添加创建者和创建日期)

本文已收录专栏 &#x1f332;《Java进阶之路》&#x1f332; 目录 本文已收录专栏 &#x1f332;《Java进阶之路》&#x1f332; &#x1f350;01、单行注释 &#x1f350;02、多行注释 &#x1f350;03、文档注释 &#x1f350;04、文档注释的注意事项 &#x1f350;05、注释…

ceres学习笔记(二)

继续关于ceres官方doc里教程的学习&#xff0c;对于powells function的学习。 一、powells function 鲍威尔法&#xff0c;严格来说是鲍威尔共轭方向法&#xff0c;是迈克尔J.D.鲍威尔提出的一种求解函数局部最小值的算法。该函数不能是可微分的&#xff0c;并且不会导出衍生函…

spring用注解读取与获取对象

前言 上一篇博客简单的介绍了spring的功能与使用&#xff0c;可以看到我们创建一个对象&#xff0c;就需要在xml中存储一个bean对象&#xff0c;这种操作非常的繁琐&#xff0c;因此spring发明了使用注解来快捷存储bean对象 配置工作 我们在xml文件中写下面的代码片段 <…

基于风光储能和需求响应的微电网日前经济调度(Python代码实现)【0】

目录 0 引言 1 计及风光储能和需求响应的微电网日前经济调度模型 1.1风光储能需求响应都不参与的模型 1.2风光参与的模型 1.3风光和储能参与模型 1.4 风光和需求响应参与模型 1.5 风光储能和需求响应都参与模型 2 需求侧响应评价 2.1 负载率 2.2 可再生能源消纳率 …

Win10PE_V2.0Nvme网络版.iso 支持Nvme硬盘免费下载无需积分

Win10PE_V2.0Nvme网络版.iso 支持Nvme硬盘免费下载无需积分 V1.0版本发布 2022年1月19日 内置常用PE工具&#xff0c;7-Zip、EasyImageX_x64、XorBoot Uefi修复、NT6修复、Ghost、CGI、Google浏览器、PENetwork、RegWorkshop、迅雷迷你版、、BOOTICEx64、windows安装器、XP安…

路径计数2

路径计数2 题目描述 一个NNN \times NNN的网格&#xff0c;你一开始在(1,1)(1,1)(1,1)&#xff0c;即左上角。每次只能移动到下方相邻的格子或者右方相邻的格子&#xff0c;问到达(N,N)(N,N)(N,N)&#xff0c;即右下角有多少种方法。 但是这个问题太简单了&#xff0c;所以现…

MySQL 数据同步 Elasticsearch 的技术方案选型

文章目录1.同步双写2.异步双写3.定时任务4.数据订阅1.同步双写 优点&#xff1a;实现简单缺点&#xff1a; 业务耦合&#xff0c;商品的管理中耦合大量数据同步代码 影响性能&#xff0c;写入两个存储&#xff0c;响应时间变长 不便扩展&#xff1a;搜索可能有一些个性化需求&…

jvm学习的核心(三)---运行时数据区详解(1)

图片等相关信息来源于&#xff1a;尚硅谷宋红康JVM全套教程 1.程序计数器 程序计数器又叫pc寄存器&#xff0c;中文有两个名字 我们可以反编译字节码文件查看方法中操作指令对应的指令地址 javap -v "对应的class文件"为什么要用pc寄存器&#xff0c;pc寄存器有什…

13、Javaweb_Filter登陆验证动态代理过滤敏感词Listener

Filter&#xff1a;过滤器 1. 概念&#xff1a; * 生活中的过滤器&#xff1a;净水器,空气净化器&#xff0c;土匪、 * web中的过滤器&#xff1a;当访问服务器的资源时&#xff0c;过滤器可以将请求拦截下来&#xff0c;完成一些特殊的功能。 * 过滤器的作用&…

深入理解计算机系统_可执行目标文件和可重定位目标文件的3个区别

这篇笔记对比一下可执行目标文件和可执行目标的3个区别。下图分别是可重定位目标文件和可执行目标文件各段结构。 1.1 可执行目标文件和可重定位目标文件的3个区别 区别1&#xff1a;可执行目标文件的rel.text和.rel.data消失了 链接器将.o中.text和.data节整合到一起时&a…

【ROS2入门】理解 ROS 2 Topics 话题

大家好&#xff0c;我是虎哥&#xff0c;从今天开始&#xff0c;我将花一段时间&#xff0c;开始将自己从ROS1切换到ROS2&#xff0c;在上一篇中&#xff0c;我们一起了解ROS 2中节点的功能以及与之交互的工具&#xff0c; 这一篇&#xff0c;我们主要会围绕ROS中另外一个重要的…

RS232 RS485 TO ETH TCP-Modbus 测试

原来modbus 传感器都是有对应的指令码的&#xff0c;不同功能的指令码也不一样&#xff0c;比如测温度和湿度的指令码也是不一样的&#xff1b; 硬件连接如下图 &#xff08;温湿度传感器&#xff0c;板载SHT20&#xff09; ​ 编辑切换为居中 添加图片注释&#xff0c;不超…

华为VRRP、BFD实验配置

目录 VRRP实验配置 BFD实验配置 配置单跳检测 配置多跳检测 配置单臂回声 BFD与路由协议联动配置 BFD与OSPF联动 BFD与ISIS联动 BFD与BGP联动 VRRP实验配置 VRRP配置 AR1配置&#xff08;VRRP缺省优先级100&#xff09; int g0/0/0 ip add 192.168.10.1 24 vrrp vrid …

织音云站长扶持计划:可免费获得CDN或虚拟主机

活动介绍活动详情页&#xff1a;织音云站长扶持计划网站被恶意攻击时是中小站长最脆弱的时候&#xff0c;90%的站长都会动“关站不干了”的心思&#xff0c;夹在中间真的很难搞!因此织音云决定为中小站长提供免费的全球CDN加速服务和提供免费的虚拟主机,免备案&#xff01;只需…