PMON 加载kernel 时,是加载到 kseg0 的(通过在 arch/mips/Makefile 中: load-$(CONFIG_GODSONEV2E) += 0x80100000 指定),该地址空间是 unmaped cached 的,当 PMON 将控制权交给内核后,内核启动过程中cache 是打开的,但在跟踪内核的启动过程中,极易受 cache 的影响,每把断点设在有 cache 操作的指令附近,都会随机的死机。
关闭龙芯的 cache ,依赖于访问的地址空间
1. 访问 cKseg0, 设置 config 寄存器的 K0域(config之低3位)为2,则关闭 cache
2. 访问经 TLB 映射的地址空间, 设置相应的 TLB 表项之 C 域为2,则关闭cache
3. 访问 xkphys, 指定 VA[61:59] 为2,则关闭 cache
考虑到内核位于 ckseg0,故而跟踪调试内核的启动过程时,只要作如下操作即可关闭cache,免受其扰:
mfc0 t0, CP0_CONFIG # 读取CP0之 conifg 寄存器的值于通用寄存器t0中
and t0, 0xfffffff8 # 低 3 位置 0
or t0, 0x2 # 低 3 位置 2,关闭 cache
mtc0 t0, CP0_CONFIG # 写回CP0之 conifg 寄存器