使用硬件调试器认识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模式会提供工具刷机
 

也可以调试

