1. KVM的介绍

1.1 KVM架构的介绍

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.2 安装及配置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。

2. 调试过程

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所示。

图2.13 启动VMLaunch中断KVM

14.      在命令行内输入!sxd VMLaunch;关闭VMLaunch;如图2.14所示。

图2.14 关闭VMLaunch

15.      在命令行内输入!sxe VMExit;通过VMExit中断KVM;如图2.15所示。

图2.15 启动VMExit中断KVM

16.      在命令行内输入!sxd VMExit;关闭VMExit;如图2.16所示。

图2.16 关闭VMExit

17.      在命令行内输入x kvm!ioeventfd_write;查看函数ioeventfd_write的内存地址及参数列表;如图2.17所示。

图2.17 查看函数ioeventfd_write的内存地址及参数列表

18.      在命令行内输入bp ffffffff`c06a6400;给函数ioeventfd_write设置断点;如图2.18所示。

图2.18 给函数ioeventfd_write设置断点

19.      在命令行内输入g;等待一段时间后命中所设断点;如图2.19所示。

图2.19 命中所设断点

20.      在命令行内输入kv;查看调用栈;如图2.20所示。

图2.20 查看调用栈

21.      在命令行内输入dc;显示内存;如图2.21所示。

图2.21 显示内存

22.      在命令行内输入dv;显示临时变量;如图2.22所示。

图2.22 显示临时变量

​23.      在命令行内输入ddp;查看被引用内存;如图2.23所示。

图2.23 查看被引用内存

参考文献

1.      https://blog.csdn.net/henly1217/article/details/108491230

2.      https://help.ubuntu.com/community/KVM/Installation

3.      https://blog.csdn.net/S2536702672/article/details/103452253

4.      https://zhuanlan.zhihu.com/p/104207468

5.      https://zhuanlan.zhihu.com/p/105499858

其他说明

1.      若您有问题咨询及出现链接失效等其他情况请联系邮箱:birdring_001@outlook.com。

2.       链接:https://pan.baidu.com/s/14vhY_4wf0UEnokRDkkpRBw 提取码:yavj

使用GDK7调试Linux内核之KVM相关推荐

  1. 使用 ftrace 调试 Linux 内核【转】

    转自:http://blog.csdn.net/adaptiver/article/details/7930646 使用 ftrace 调试 Linux 内核,第 1 部分 http://blog.c ...

  2. Bochs调试Linux内核6 - 启动过程调试 - 跳到bootsect引导程序执行

    接此,​​​​​​Bochs调试Linux内核5 - 启动过程调试 - 认识Bootsect.S_bcbobo21cn的专栏-CSDN博客 看一下,0x00007c11 这里是重复执行串传送:而后一条 ...

  3. Bochs调试Linux内核5 - 启动过程调试 - 认识Bootsect.S

    先参阅 Bochs调试Linux内核 - 定位内核中的变量或数据结构_bcbobo21cn的专栏-CSDN博客​​​​​​ ,运行到<bochs:1>,输入vbreak 0x0000:0x ...

  4. 使用Bochs调试Linux内核初级入门

    之所以能用Bochs调试Linux内核,还是因为Bochs做了一些工作: 安装完成以后如下:如果使用bochs.exe加载操作系统映像,就是在虚拟机中运行操作系统: 如果使用bochsdbg.exe加 ...

  5. 使用openocd调试Linux内核,OpenOCD-JTAG调试

    title: OpenOCD-JTAG调试 tags: ARM date: 2018-10-13 23:36:28 Todo [ ] JTAG 调试linux内核 [ ] linux下使用OpenOC ...

  6. qemu debug linux内核,在QEMU环境中使用GDB调试Linux内核

    简介 对用户态进程,利用gdb调试代码是很方便的手段.而对于内核态的问题,可以利用crash等工具基于coredump文件进行调试.其实我们也可以利用一些手段对Linux内核代码进行gdb调试,qem ...

  7. elipse调试linux内核,debug eclipse cdt + qemu虚拟机调试linux内核

    debug eclipse cdt + qemu虚拟机调试linux内核 (17页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.90 积分 A scr ...

  8. 使用openocd调试Linux内核,OpenOCD-JTAG调试(示例代码)

    目录 title: OpenOCD-JTAG调试 tags: ARM date: 2018-10-13 23:36:28 --- Todo [ ] JTAG 调试linux内核 [ ] linux下使 ...

  9. kgdb调试linux内核以及驱动模块

    kgdb调试linux内核以及驱动模块 本文将简要描述如何配置kgdb进行内核以及驱动模块调试,以嵌入式开发为例,但同样对于其他有需要调试kernel有一定的参考价值.本文实验环境为qemu搭建的ri ...

  10. 使用NDB调试Linux内核的线程切换过程

    使用NDB调试Linux内核的线程切换过程 cpu_switch_to 因为要调试Linux内核的线程切换过程,所以需要在`cpu_switch_to`处设置断点. 注意:ARM无法设置软件断点,只能 ...

最新文章

  1. python里面的之前打过的记忆信息-python中的记忆:如何缓存函数的运行结果(1)
  2. java游戏+弹幕_JAVA 弹幕小游戏 1.0版本
  3. Linux-Rsync命令参数详解
  4. 通过组策略禁止用户安装任何软件
  5. 带有按钮并且可以执行单击事件的WINFORM窗体,体悟C#的创建过程
  6. ASP.NET MVC 笔记
  7. 即时通讯开发----回音消除技术
  8. kafka跨集群同步方案
  9. Linux下MariaDB 安装及root密码设置(修改)
  10. js 正则 exec() 和 match() 数据抽取
  11. Day13_定时器中断处理
  12. 社交网络分析——信息传播模型(附带三个模型的python实现)
  13. Ubuntu 数字小键盘不能用解决方法
  14. java公路中轴_技术帖 自行车中轴的种类 入门车友请细读
  15. 颜色拾取器和红蜻蜓截图
  16. Python爬虫实战四之抓取淘宝MM照片
  17. 2021年危险化学品生产单位安全生产管理人员报名考试及危险化学品生产单位安全生产管理人员模拟考试
  18. xz压缩解压工具的安装
  19. c语言错误c2198,这段哪里错了。。。
  20. ༺ཌ༈最好的电子书共享:https://github.com/EbookFoundation/free-programming-books༈ད༻

热门文章

  1. arm mali 天梯图_11月最新版联发科CPU天梯图 直观看天梯图秒懂联发科处理器排行...
  2. 再见2017,你好2018!
  3. 联想y50更换固态硬盘_【联想Y50-70】更换固态硬盘,极速开机~
  4. 三菱q系列plc连接电脑步骤_SERVER和三菱Q系列PLC通讯设置步骤 SERVER和三菱Q系列PLC通讯设置步骤...
  5. 三菱q系列plc 和电脑socket_三菱Q系列和WinCC以太网通讯的组态步骤
  6. 网络篇 OSPF的DR与BDR的选举-48
  7. python Django
  8. JavaScript判断手机号运营商是移动、联通、电信还是其他(代码简单
  9. python中栈是先进后出_python中的栈 LIFO类似于堆即先进后出
  10. 黑猴子的家:JavaWeb 之 CSS