本文分析Linux内核里KVM相关的逻辑,体系架构基于riscv。具体调试的时候,我们 使用了两层的qemu模型,第一层qemu使能了riscv的h扩展,第二层qemu使用kvm启动。 全文使用从上到下的思路分析,如果需要了解相关的硬件特性可以直接跳到最后。 使用v5.19-rc8内核代码、6.2.0 qemu代码作为分析代码。
构建riscv两层qemu的步骤
可以构建一个两层qemu的环境来调试问题,第一层qemu启动的时候打开qemu的虚拟化 扩展,这个可以作为一个支持虚拟化扩展的riscv硬件平台,第二层qemu启动的时候 打开kvm支持。用这样的方式,我们可以去学习kvm虚拟化相关的东西。本文记录这个 环境搭建的过程,使用的环境是ubuntu 20.04 arm64版本。
riscv timer的基本逻辑
本文梳理riscv上timer的基本软硬件逻辑,硬件模型基于qemu,使用的qemu版本是6.2.0, 内核代码分析使用的版本是v5.12-rc8。本文尽可能多的梳理riscv上timer相关的内容,需要独立描述的会在文中指出来。
riscv特权级模型
本文分析riscv特权级spec,尝试依照spec总结下riscv的特权级模型。有时直接看 spec,可能过于分散,本文分析的时候结合qemu tcg riscv的代码。基于riscv的spec 是20190608,基于的qemu版本是5.1.50。
qemu monitor介绍
本文介绍qemu monitor的一些使用方法,使用qemu调试问题的时候可以参考。分析使用 的qemu版本是6.2.0。
riscv ebreak指令的使用
本文分析riscv ebreak指令在Linux内核中的使用,分析基于的代码时Linux主线v5.12-rc8, 主要分析BUG_ON宏、kprobe、uaccess实现。
qemu tcg翻译执行核心逻辑分析
本文分析qemu tcg翻译执行的核心逻辑。分析代码用的qemu版本是5.1.50。
qemu tcg访存指令模拟
本文分析qemu tcg里关于load/store的流程,以riscv平台为分析对象。qemu的版本是5.1.50。 CPU访存主要有使用load/store的显示访存也有隐式访存,比如CPU取指令就属于一种 隐式访存,qemu对CPU取指令的模拟逻辑可以参考: htts://wangzhou.github.io/qemu-tcg取指令逻辑分析/
qemu tcg中断模拟
记录qemu irq相关的代码逻辑,以riscv为例。分析使用的qemu代码的版本是7.1.50。
Linux内核riscv entry.S分析
本文分析Linux内核里riscv构架下的entry.S这个文件,内核代码使用的版本是5.12-rc8。 采用直接在代码里加注释的方式写分析的内容,注释用“n:”开头。目前只分析主流程, 一些相关的细节还需要持续更新。