-我在 ubuntu armhf cloud 发行版 仿真 中搭建了一个 “基于ARMv7” 且 “abi为armhf” 且 “os 为 ubuntu” 的 “虚拟化调试平台”,主要是为了研究
1. ARMv7 对虚拟化的支持 2. linux armv7 kvm 的实现 3. qemu 与 kvm 的交互
调试平台是这个样子的
L0 : win10 x86_64 L1 : L0 上用 vmware work station 搭建的一个 ubuntu20.04-x86_64 L2 : L1 上用 qemu-6.1.0 搭建的一个 armhf-ubuntu 16.04,并手动编译升级内核到 linux-5.6 L3 : L2 上用 qemu-2.5.0 搭建的一个 armhf-linux-initramfs,并手动编译升级内核到 linux-5.6
- 研究手段及目标顺序
怎么实现这些研究目的 1. 在 L1 上 安装 arm-none-eabi-gdb 2. 开启L2 的时候 添加 -S -s 选项 , 并 用 arm-none-eabi-gdb 不加断点让其全速运行 3. L2 启动到 shell , 此时 用 arm-none-eabi-gdb 添加 kvm 相关的断点 4. 启动 L3(需要添加 --enable-kvm) , 启动后 自动停在 断点 研究目的的顺序 1. qemu 与 kvm 的交互 通过书籍获取大概交互资料(主要是三个fd),并验证(这三个fd)的实现原理 通过每个 fd 访问了多少次,都访问了什么 2. linux armv7 kvm 的实现 fd 中的 ioctl 怎么处理的 如何 VM enter 和 VM exit 3. ARMv7 对虚拟化的支持 PL2 异常向量表的设置 相关寄存器的读写qemu 与 kvm 的交互
初始化 fd_kvm = open(/dev/kvm) kvm_chardev_ops kvm_dev_ioctl fd_vm = ioctl(fd_kvm,KVM_CREATE_VM,0) kvm_vm_fops kvm_vm_ioctl fd_vcpu = ioctl(fd_vm,KVM_CREATE_VCPU,0) kvm_vcpu_fops kvm_vcpu_ioctl 运行 ioctl(fd_vcpu,KVM_RUN,NULL)
主要是 要考虑 通过三个 fd (fd_kvm fd_vm fd_vcpu) 操控 kvm 做事 按照书籍资料,kvm负责 KVM本身基于硬件辅助虚拟化,仅仅实现CPU和内存的虚拟化,但一台计算机不仅仅有CPU和内存,还需要各种各样的I/O设备,不过KVM不负责这些。KVM负责底层执行引擎和内存的虚拟 经过改造后的QEMU,负责外部设备的虚拟 两者彼此互补,成为新一代云计算虚拟化方案的宠儿。不能用(太庞大) qemu 来探究 qemu 与 kvm 的交互,而是我们要是实现一个小的qemu(little-qemu),并实现一个小的虚拟机程序(test.S)来探究
- little-qemu
- test.S
- 如何调试
涉及到 little-qemu(运行在L2) , 在 L2(ARMv7-ubuntu-16.04) 上运行 arm-gdb test.S(运行在L3) linux-5.6-kvm(运行在L1) , 在 L1(x86_64-ubuntu-20.04) 上运行 arm-gdb



