bootable中的伪代码

指令解析

b reset:实现

pc指针 将abc的地址的内容 加载到pc指针中

即为跳转到0x1000 进行运行

  • 即可理解如下代码

.global __end_vect 为实现对向量表结束的标识

在_end_vect:后面 使用的 .balignl 16,0xdeadbeef 在如果没有16字节对齐时候 进行内存填充 直到是16字节对齐为止

  • badcode填充

作者在这里进行了一次的实现badcode代码填充,进行对当前编译时候的地址填充

linkage头文件

  • linkage 文件分析

  • entry name define

    ENTRY(name)
    .global SYMBOL_NAME (name):
    LENTRY (name)

展开怎么计算?这句话要看 SYMBOL_NAME 的宏定义 为x

故而 .global SYMBOL_NAME (name):\ 为 x

LENTRY (name)展开的事件处理为

复制代码
#define  LENTRY(name)\
	ALIGN;\                   // = _ALIGN .align   4  //为4字节对齐
	SYMBOL_NAME_LABEL(name)  // 直接转化成(X) =X

结果为

复制代码
.global name
.align 4
name
bx lr

执行BX LR的意义是"跳转到LR寄存器里的地址执行"

  • ENDPROC(sbp)展开

type sbp STT_FULL //伪指令 说明下面为函数

END(sbp)详细张开如下

复制代码
#ifndef END
#define END(sbp)
.size sbp , .-sbp  //说明 :当前sbp 有多大
#endif

设置svc模式

  • spsr寄存器设置

6 ,7 位置的if 禁止中断

4:0为 位 设置为svc32模式

0xd3实现了同时进中断和模式位

cp15协处理器操作

cp15中包括 cache缓存管理 MMU内存管理

cp12 13 保留给arm公司以后用

cp11 为双精度浮点计算

cp 10 为单精度浮点计算

  • mrc 语法学习
    • 可在Arm手册中中查询到对应寄存器
  • mrc解析
    mrc p15, opc1, CRn, CRm, opcl2
    对应起来为
    mrc p15, 0 , c1 ,c0 ,0
    即为将 SCTRL寄存器读入到r0中
  • bic解析:
    将r0 寄存器中的 第十三位进行清零
  • ldr 解析:ldr r0 , =_start
    将 _start的地址放入r0中
  • mcr 解析 :mcr p15 ,0,r0,c12,c0 ,0
    将r0中的地址存入cp15中的c12 c0这个寄存器中 作用如下图所示:

如果在 设置VBAR寄存器 使得vb向量表映射到任何地址

即为如果将 r0中的地址为0x38400 写入到p15 c12 c0 (而其原本起始地址为0x20000映射到了 0x38400 上)

发生中断后就会跳转到vb向量的0x38400地址上进入中断处理程序

相关推荐
ShineWinsu1 小时前
对于C++:缓冲区管理的详细解析
linux·c++·面试·编程·笔试·io·缓冲区
张小姐的猫1 小时前
【Linux】网络编程 —— 传输层协议 TCP(下)
linux·运维·服务器·网络·tcp/ip·http·php
程序员AlbertTu1 小时前
第2章 上手 Linux:环境与文件操作
linux·运维·服务器
☆凡尘清心☆2 小时前
CentOS Stream 9 源码编译搭建 Zabbix7.0.29 完整部署方案(部署成功)
linux·运维·centos
Escalating_xu2 小时前
【Linux】进程间通信:从匿名管道、FIFO 到共享内存、消息队列与信号量
java·linux·面试
予昊2 小时前
Linux 资源控制实战分析:用 LXC 亲手造一个 “迷你虚拟机“
linux·运维·服务器
allforgood2 小时前
管理网络安全
linux
灵晔君3 小时前
【Linux】进程控制(一)——进程创建、进程终止与进程等待
linux·c语言·算法
wsad05323 小时前
CentOS 10 上使用 Docker Compose 部署 Discuz X5.0 论坛完整教程
linux·docker·centos·discuz
张宇Joaquin3 小时前
openEuler编译和更换内核的方法
java·linux·服务器