首页
社区
课程
招聘
[原创]使用GDK7调试Linux内核之KVM
发表于: 2021-7-9 19:29 4993

[原创]使用GDK7调试Linux内核之KVM

2021-7-9 19:29
4993

    1.      目前有3种较为主流的虚拟化技术架构:ESXi架构、Xen架构及KVM架构,主要区别在虚拟化CPU、内存、磁盘及网络通信组件的模块不同及管理调度组件实现方式的不同;流虚拟化技术架构如图1.1所示。

图1.1 主流虚拟化技术架构

 ESxi架构:CPU、内存、磁盘及网络通信组件的虚拟化都在ESXi内核中实现;由于CPU、内存、磁盘及网络通信组件的虚拟化都在同一内核中实现,故不需要管理调度组件。

Xen架构:CPU及内存的虚拟化都在Xen内核中实现,磁盘及网络通信组件的虚拟化都在Domain0中实现;管理调度组件由Domain0实现。

KVM架构:CPU及内存的虚拟化都在KVM内核中实现,磁盘及网络通信组件的虚拟化都在QEMU内核中实现;管理调度组件由Linux进程调度器实现。

管理调度组件:用于管理实现虚拟化的模块。

Domain0:计算机上启动的第一个虚拟机。

    2.      KVM内核模块:主要包括kvm.ko模块及kvm_intel.ko模块或kvm_amd.ko模块(硬件相关);KVM内核模块用于部分Linux内核的功能,如设备驱动及内存管理、进程管理调度等;负责虚拟化CPU及内存。

    3.      QEMU内核模块:通过IOCTL系统调用QEMU内核模块与KVM内核模块进行交互;负责虚拟化磁盘及网络通信组件。

    4.      KVM内核模块与QEMU内核模块交互的实现:KVM仅支持基于硬件辅助的虚拟化,在内核加载时,KVM先初始化内部数据结构,打开CPU控制寄存器CR4里面的虚拟化模式开关,执行VMXON指令将Host OS设置为root模式,并创建的特殊设备文件/dev/kvm等待来自用户空间的命令,通过IOCTL系统调用QEMU内核模块与KVM内核模块进行交互,实现虚拟机的管理。

    1.      参考文章https://help.ubuntu.com/community/KVM/Installation安装KVM及虚拟系统管理器(Virt-Manager)。

    2.      命令行内输入virt-manager;启动虚拟系统管理器。

若报错Unable to connect to libvirt qemu:///system. 确定 ‘libvirtd’ 守护进程正在运行;则=>cd /var/run/libvirt/;进入libvirt文件夹=>sudo chmod 777 libvirt-sock;修改libvirt-sock文件的权限为777(可读可写可执行)=>重新输入virt-manager。

    3.      参考文章https://zhuanlan.zhihu.com/p/104207468配置KVM。

    1.      将GDK7及调试主机开机=>用USB3.0专用电缆将GDK7及调试主机连接起来=>调试主机端打开设备管理器=>查看是否识别出DCI设备;如图2.1所示。

图2.1 设备管理器识别从DCI设备

调试主机端必须使用USB3.0接口与电缆连接;具体接口位置没有要求。

GDK7必须使用后面板中的蓝色USB3.0接口与电缆连接,其余的USB3.0接口则不行

    1.     GDK7内打开命令行=>输入virt-manager;启动虚拟系统管理器=>运行虚拟机。

    2.      打开Nano Code=>进入Nano调试;如图2.2所示。

图2.2 进入Nano调试

    4.      进入内核调试=>选择相应选项=>点击启动;调试Linux内核应选选项如图2.3所示。

图2.3 调试Linux内核应选选项

    5.      点击启动后,Nano Code会自动建立调试会话;如图2.4所示。

图2.4 建立调试会话

    6.      中断GDK7;如图2.5所示。

图2.5 中断GDK7

    7.      准备与Linux内核版本对应的相关文件=>内核符号文件、KVM内核模块的符号文件及内核源代码文件(相关文件可以自行下载/从其他说明的2中,所给的百度网盘链接内下载)=>将相关文件复制到调试主机内(具体位置无要求,但内核符号文件及KVM内核模块的符号文件应在统一文件夹下)。

检查Linux内核版本和符号文件对应的Linux内核版本的步骤:

    在Nano调试的命令行内输入!uname;查看Linux内核版本号;如图2.6所示=>此Linux内核版本号记为1。

图2.6 Linux内核版本号

    在调试主机端内通过记事本打开内核符号文件=>点击编辑=>点击查找(找不到则点击查找下一个)=>找到Linux内核版本号(如图2.7所示)=>记此Linux内核版本号为2=>若有修改则关闭符号文件时不保存文件。


图2.7 内核符号文件对应的Linux内核版本号

    8.      在命令行内输入.sympath+ C:\NanoCode-Symbols\530-59;添加符号文件所在文件夹的路径到符号文件搜索路径中;如图2.8所示。

图2.8 添加符号文件所在文件夹的路径到符号文件搜索路径中

    9.      在命令行内输入.srcpath+ C:\NanoCode-LinuxSource\500\linux-source-5.0.0;添加内核源代码所在文件夹的路径到源代码搜索路径中;如图2.9所示。

图2.9 添加内核源代码所在文件夹的路径到源代码搜索路径中

    10.      在命令行内输入.reload;重新加载;如图2.10所示。

图2.10 重新加载

    11.      在命令行内输入x kvm!*(耐心等待一段时间);加载KVM模块,Nano调试会输出函数,若没有任何输出则应检查符号文件对应的Linux内核版本与当前运行系统的Linux内核版本是否一致;如图2.11所示。

图2.11 加载KVM模块

    12.      在命令行内输入lm l;显示已经加载的模块(不含延迟加载的模块),确定KVM模块已经成功加载;如图2.12所示。

图2.12 显示已经加载的模块(不含延迟加载的模块)

    13.      在命令行内输入!sxe VMLaunch;启动VMLaunch中断KVM;如图2.13所示。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2021-7-9 19:31 被birdring编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//