当前位置: 首页 > news >正文

看linux内核启动流程需要的汇编指令解释

一、指令

0.MRS 和MSR

MRS 指令: 对状态寄存器CPSR和SPSR进行读操作。
MSR指令: 对状态寄存器CPSR和SPSR进行写操作。

1.adrp

adrp	x0, boot_args

把boot_args的页基地址提取出来,放到x0中。

2.stp

stp	x21, x1, [x0]

将 x21, x1 的值存入 x0寄存器记录的地址中,比如 x0存的是boot_args的地址,那么 x21, x1 的值存入就会存入boot_args中。

3.ubfm

ubfm	\tmp, \tmp, #16, #19
UBFM <Xd>, <Xn>, #<immr>, #<imms>

如果大于或等于,则从源寄存器中的位位置开始,将(-+1)位字段复制到目标寄存器的最低有效位。
如果小于,则从源寄存器的最低有效位复制(+1)位字段到目标寄存器的位位置(regsize-),其中regsize是32位或64位的目标寄存器大小。
这里是19大于16,也就是说,把tmp的[16,19]这4位提取出来,放到tmp中。

4.tst

tst	x1, x3

说明:TST 来检查是否设置了特定的位。x1 是要测试的数据字,x3 是一个位掩码,TST指令将x1与x3做逻辑与运算。TST会改变CPSR的条件标志位。这个指令通常与EQ,NE这些条件码来组合使用,但是使用过程中需要注意 :与掩码逻辑与运算之后,全部测试位为0的时候,标志位Z = 1,此时EQ成立,反之则 Z = 0,NE成立。

5.UBFX

UBFX Xd, Xn, #lsb, #width

UBFX指令的意思是从Xn寄存器的第lsb位开始,提取width位到Xd寄存器,剩余高位用0填充。

二、宏

1.adr_l

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

adr_l这个宏的作用是把给dst赋sym的值。
adr_l这个宏首先通过adrp指令把sym的页基地址提取出来,放到dst中,然后把dst和sym的低12位相加,放到dst中。
最后得出结论就是,用于获取基于PC相对偏移+/- 4 GB内的符号地址。

2.dcache_line_size

/** dcache_line_size - get the safe D-cache line size across all CPUs*///从这个CPU的CTR寄存器上获取最小D-cache行大小.macro	dcache_line_size, reg, tmpread_ctr	\tmp					// 读取 CTR 寄存器的值ubfm		\tmp, \tmp, #16, #19	// 读取ctr_el0比特16到19的数值,这个数值和D-cache大小有关mov		\reg, #4		// 给reg赋值4lsl		\reg, \reg, \tmp	// 计算实际的cache 行大小,单位字节.endm

这个宏的作用是获得所有cpu上的安全D-cache线大小。

3.ldr_l

ldr_l x4, idmap_ptrs_per_pgd

        .macro  ldr_l, dst, sym, tmp=.ifb    \tmpadrp    \dst, \symldr     \dst, [\dst, :lo12:\sym].elseadrp    \tmp, \symldr     \dst, [\tmp, :lo12:\sym].endif.endm

ldr_l, dst, sym, tmp= :这个宏是将符号sym中存放的内容取到dst中;这条指令取的是idmap_ptrs_per_pgd的页内偏移地址到x4寄存器。

http://www.lryc.cn/news/23288.html

相关文章:

  • 【巨人的肩膀】JAVA面试总结(二)
  • 【网络安全入门】零基础小白必看!!!
  • 字节前端经典面试题(附答案)
  • 数据库管理工具的使用
  • 让马斯克反悔的毫米波雷达,被国产雷达头部厂商木牛科技迭代到了5D时代
  • MaxWell原理概述
  • 电子技术——AB类输出阶
  • Archlinux个人安装流程
  • 【Autoware】2小时安装Autoware1.13(保姆级教程)
  • JVM 堆内存模型
  • linux-中断下半部
  • SpringMVC源码:HandlerMapping加载1
  • 【ArcGIS】12 投影
  • 【微信小程序-原生开发+TDesign】通用功能页封装——地点搜索(含腾讯地图开发key 的申请方法)
  • h5: 打开手机上的某个app
  • Hot Chocolate 构建 GraphQL .Net Core 服务
  • linux shell 入门学习笔记16 流程控制开发
  • 机器学习:基于朴素贝叶斯对花瓣花萼的宽度和长度分类预测
  • 给VivoBook扩容重装系统
  • vue 依赖注入使用教程
  • 【再临数据结构】Day1. 稀疏数组
  • 二十四、MongoDB 聚合运算( aggregate )
  • 【C++】6.模板初阶
  • Docker部署Airbyte
  • 2023王道考研数据结构笔记第一章绪论
  • 告别空指针让代码变优雅,Optional使用图文例子源码解读
  • 【C++】哈希——unordered系列容器|哈希冲突|闭散列|开散列
  • mysql-面试
  • 【夏虫语冰】Win10局域网下两台电脑无法ping通: 无法访问目标主机
  • 大数据框架之Hadoop:MapReduce(三)MapReduce框架原理——Join多种应用