![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
qemu玩转linux
文章平均质量分 90
这里我将使用qemu调试内核,调试驱动(ko)等
无人知晓万事万物
无人知晓万事万物
展开
-
linux虚拟化之kvm(一个200行的arm64虚拟机代码)
最后总结下kvm的使用流程:1、创建虚拟机:vmfd = ioctl(kvmfd, KVM_CREATE_VM, 0);2、创建vcpu:vcpufd = ioctl(vmfd, KVM_CREATE_VCPU, 0);3、初始化虚拟机内存:ioctl(vmfd, KVM_SET_USER_MEMORY_REGION, &mem);4、运行vcpu:ioctl(vcpufd, KVM_RUN, NULL);无论是arm64还是X86, 流程基本是一样的,差异点在CPU的pc值,CPU类型等参数设置上。原创 2024-01-28 11:01:17 · 1021 阅读 · 0 评论 -
qemu 抓取linux kernel vmcore
1、利用qemu monitor 提取vmcore2、利用crash 工具加载分析vmcore。原创 2024-01-28 10:37:22 · 1293 阅读 · 0 评论 -
qemu + vscode图形化调试linux kernel
另外在gdb 下p命令显示结构体内容时,看起来也是很别扭,可以利用vscode+gdb-multiarch 调试qemu 仿真的arm64 linux 内核,这样查看源码,设置断点,查看变量信息也很快捷方便。如果在执行过程中连接,也是点击pause按钮,这时内核会停止执行,然后在vscode中设置断点,continue后触发断点vscode能正确显示断点位置及代码。启动调试,在init/main.c中start_kernel设置断点,然后点击调试工具栏的continue即可触发到断点,可以开启单步调试了。原创 2024-01-28 10:23:33 · 1057 阅读 · 0 评论 -
qemu调试kernel启动(从第一行汇编开始)
其实不管使用什么调试器(gdb/T32/Crash/lldb),第一步要做的都是将elf和调试target的执行地址做一个对齐,当然这个对齐可能是物理地址对齐(无mmu,如bootloader,elf编译的地址就是代码运行的物理地址),也有可能是虚拟地址对齐(开启了mmu 比如kernel start_kernel 之后部分),也有可能是物理地址与虚拟地址对齐(比如本文中的_text到start_kernel), 掌握了这个规律也就掌握的调试的入口密码。原创 2024-01-28 10:19:16 · 1339 阅读 · 0 评论 -
qemu 单步调试linux driver
上面的报错原因是因为编译kernel版本中打开了config CONFIG_DEBUG_INFO_REDUCED, 这个会影响gdb script的完整功能,在arch/arm64/ configs/defconfig中去掉这个config,重新编辑后加载vmlinux;调试driver 就需要准备一个简单的driver, 这里用最简单的hello world来演示如何调试,程序非常简单,生成一个字符设备,并且在cat的时候打印变量,还加了一个全局变量,用来gdb调试查看变量使用。原创 2024-01-28 10:13:21 · 1125 阅读 · 0 评论 -
qemu单步调试arm64 linux kernel
qemu内核调试时需要注意关闭kaslr,更新正确的脚本,也不依赖kenerl config是否开启kaslr-smp 2 \-s \-S关于kaslr原理相关的知识,有兴趣的伙伴参考 文章kaslr原理分析。原创 2024-01-28 10:06:46 · 1306 阅读 · 0 评论 -
qemu搭建arm64 linux kernel环境
具体能用的版本gcc-XX-arch64-linux-gnu可以按对应的ubuntu发行版本查找,当前22.04能用的最新版本是gcc-12;或者可以到arm开发工具链上下载(自己下载的记得 PATH 变量中加一下路径)比如我现在用的gcc-13(不同的gcc版本支持的特性有差异,对编译结果优化也有差异):还比较新。原创 2024-01-28 10:02:06 · 1264 阅读 · 0 评论