使用硬件调试器认识arm64的四大特权级
今天出差回来,看录像学习arm相关知识。看的是看雪学苑的视频号。边看边记录。
大局观
布局:内核在ring0
虚拟化技术后,增加了地下室层,VMM:虚拟机监视器
加上intel的系统管理模式,又加了一层。 SMM像如来佛的手掌心,其他层像孙悟空。
armv8重新定义软件世界.arm源自英国剑桥,定义了更合理的抽象。
arm分为4大特权级别。分为普通世界和安全世界。上面是可信区监视器。
通过读寄存器可以知道当前在哪个级别。
跨空间协作
演示环境
EL0寻常见
应用层,可以运行gdb ls
在比较低的地址,工具也比较多。
LINUX在EL1
linux要用内核调试
回马枪和GDK通过coresight建立会话。
中断后可以看到Linux的基地址
刚才EL0地址比较小,现在内核的地址比较大。
lm命令可以列出模块,lk 是linux kernel的缩写。
mrs是读ARM系统寄存器。
汇编语言也可以看到特权级别:系统寄存器都标识了el0,el1
设置调试符号路径 .sympath c:\xxx\lkernel
.reload
~0s 是切换到0号CPU
设置源文件路径:.srcpath c:\xxx,h 这样可以自动对应源文件
.frame 4 时光倒流到4号栈帧
rest_init: 其余的初始化,会把其他CPU唤醒。最后跳到idle loop休息。
r 查看寄存器
x lk!*switch*
x lk!cpu_switch_to
ba e4 lk!cpu_switch_to
断点命中:
内核在切换线程的时候中断下来了。可以亲眼看到切线程的过程。
prev是前一个线程,next是后一个线程。无论前后,都是个task_struct的大结构体
x0就指向这个结构体,可以dt查看
其中的comm字段是线程名称。
arm传递参数,前6个用x0~x5来传,刚才x0是prev, x1就是next
migration线程是监护CPU ready队列的
bd * 把断点禁止到
g 重新跑起来
内核空间
XEN或者UBOOT在EL2
启动时UBOOT,启动好了XEN住。
感受一些UBOOT
reboot gdk8
sudo reboot
按11可以进入uboot命令行
help :列出uboot的命令
dm tree 看设备树
也可以用NDB调试,选uboot
uboot阶段,只有0号CPU工作,其他3个核诊断失败,说明还在睡觉。
coresight寄存器DSCR也检测到目前处于EL2
NDB识别语义,也可以进行源码级别的跟踪调试
PC地址,栈地址,都有不同的特点。
lm 查看模块
uboot有一个精妙设计,x18放特殊值
.sympath 检查符号路径,发现还是kernel的,要切换到uboot
.sympath d:\xxx\uboot ,然后就可以看到代码位置了。
典型堆栈
ba e4 uboot!getc 设置断点
kn
.frame
.srcpath f:\xxx
dv 看参数
xen在云上使用很多。也是来自剑桥。使用内存也有字节的特点
ATF在EL3
uboot中敲rbrom
CPU会重启。
rom模式会提供工具刷机
也可以调试