QEMU调试Linux内核环境搭建

news2024/10/6 10:32:27

一个最小可运行Linux操作系统需要内核镜像bzImage和rootfs,本文整理了其制作、安装过程,调试命令,以及如何添加共享磁盘。

编译内核源码

从 The Linux Kernel Archives 网站下载内核源码,本文下载的版本为4.14.191,4.14.191源码下载。

使用wget获取源码。

wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.14.191.tar.gz

解压源码:

tar -xvf linux-4.14.191.tar.gz

解压后进入源码根目录linux-4.14.191,指定编译的架构,依次执行下面的命令,打开配置菜单。

1cdlinux-4.14.19123exportARCH=x8645makex86_64_defconfig67makemenuconfig

在配置菜单中,启用内核debug,关闭地址随机化,不然断点处无法停止。

1Kernelhacking--->2[*]Kerneldebugging3Compile-timechecksandcompileroptions--->4[*]Compilethekernelwithdebuginfo5[*]ProvideGDBscriptsforkerneldebuggin678Processortypeandfeatures---->9[]Randomizetheaddressofthekernelimage(KASLR)

开始编译内核,-j 指定并行编译作业数。最终生成

linux-4.14.191/arch/x86_64/boot/bzImage文件。

1make -j 20

内核编译完成。

内核资料直通车:最新Linux内核源码资料文档+视频资料

学习直通车:Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈

配置Busybox

启动内核还需要一个具有根文件系统的磁盘镜像文件,根文件系统中提供可供交互的shell程序以及一些常用工具命令。

我们借助busybox工具来制作根文件系统。

本文使用1.32.0版本,下载busybox。

解压:

tar -jxvf busybox-1.32.0.tar.bz2

进入busybox根目录,配置编译选项。

1cdbusybox-1.32.02makemenuconfig

把busybox配置为静态编译。

1Settings--->2[*]BuildBusyBoxasastaticbinary(nosharedlibs)

配置如下图所示。

制作rootfs

接下来制作rootfs镜像文件,并把busybox安装到其中。

使用dd命令创建文件,并格式化为ext4文件系统。

1szp@r420-PowerEdge-R420:~/busybox-1.32.0$ddif=/dev/zeroof=rootfs.imgbs=1Mcount=1023szp@r420-PowerEdge-R420:~/busybox-1.32.0$mkfs.ext4rootfs.img

创建用于挂载该镜像文件的目录fs,挂载后才能往里面写入busybox。

使用mount命令将rootfs.img挂载到fs目录,编译busybox并写入fs目录中。

1szp@r420-PowerEdge-R420:~$mkdirfs23szp@r420-PowerEdge-R420:~/busybox-1.32.0$sudomount-text4-olooprootfs.img./fs45szp@r420-PowerEdge-R420:~/busybox-1.32.0$sudomakeinstallCONFIG_PREFIX=./fs

接下来对写入的busybox进行补充配置。

1szp@r420-PowerEdge-R420:~/busybox-1.32.0/fs$sudomkdirprocdevetchomemnt23szp@r420-PowerEdge-R420:~/busybox-1.32.0/fs$sudocp-r../examples/bootfloppy/etc/* etc/
4
5szp@r420-PowerEdge-R420:~/busybox-1.32.0$ sudo chmod -R 777 fs/

制作完成的rootfs目录如下:

最后,卸载rootfs.img

1szp@r420-PowerEdge-R420:~/busybox-1.32.0$ sudo umount fs

至此,一个带有rootfs的磁盘镜像制作完成。

启动qemu

使用如下命令启动无GUI的qemu,参数含义如下:

-kernel # 指定编译好的内核镜像
-hda # 指定硬盘
-append "root=/dev/sda" 指示根文件系统 console=ttyS0 把QEMU的输入输出定向到当前终端上
-nographic 不使用图形输出窗口
-s 是-gdb tcp::1234缩写,监听1234端口,在GDB中可以通过target remote localhost:1234连接
1qemu-system-x86_64 -kernel ./linux-4.14.191/arch/x86_64/boot/bzImage  -hda ./busybox-1.32.0/rootfs.img  -append "root=/dev/sda console=ttyS0" -nographic

启动后如下图:

Ctrl+A 松开后按C退出qemu。

内核函数调试

启动命令中添加-s参数与-S参数启动qemu。

1szp@r420-PowerEdge-R420:~$qemu-system-x86_64-kernel~/linux-4.14.191/arch/x86_64/boot/bzImage-hda~/busybox-1.32.0/rootfs.img-append"root=/dev/sda console=ttyS0"-s-S-smp1-nographic

启动gdb远程调试。vmlinux文件在编译后的内核源码根目录下。

1szp@r420-PowerEdge-R420:~$gdb./linux-4.14.191/vmlinux23(gdb)targetremotelocalhost:1234

在new_sync_read函数添加断点,continue。

在系统中执行ls命令,触发new_sync_read函数,

至此,完成了qemu环境下使用gdb进行内核函数的调试。

添加共享磁盘

有时候需要在宿主机和qemu虚拟机之间共享文件,添加一个共享磁盘将有助于该项工作。

创建64MB磁盘镜像文件,并格式化为ext4,作为共享磁盘备用。

1szp@r420-PowerEdge-R420:~/shadisk$ddif=/dev/zeroof=ext4.imgbs=512count=13107223szp@r420-PowerEdge-R420:~/shadisk$mkfs.ext4ext4.img

修改qemu启动命令,使用-hdb增加一个磁盘。

1qemu-system-x86_64-kernel~/linux-4.14.191/arch/x86_64/boot/bzImage-hda~/busybox-1.32.0/rootfs.img-append"root=/dev/sda console=ttyS0"-s-smp1-nographic-hdb~/shadisk/ext4.img

进入qemu系统后使用mount命令挂载sdb到mnt目录。

在原系统中挂载ext4.img,实现qemu与原系统的文件共享。

1szp@r420-PowerEdge-R420:~/shadisk$ sudo mount -t ext4 -o loop ext4.img ./share

至此,可以在宿主机器share目录下,与qemu中的虚拟机器进行文件共享。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/146946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

危险程度(并查集)

有 nn 种化学物质,编号 1∼n1∼n。 其中,有 mm 对物质之间会发生反应。 现在,要将这些化学物质逐个倒入同一个试管之中,具体倒入顺序不限。 我们需要计算一下试管的危险值。 已知,空试管的危险值为 11,…

【UE4 第一人称射击游戏】21-添加动态扩散准心

素材资料地址:链接:https://pan.baidu.com/s/1epyD62jpOZg-o4NjWEjiyg密码:jlhr上一篇:【UE4 第一人称射击游戏】20-添加瞄准十字线本篇效果:步骤:将资源移至FPS项目文件夹内移入后发现多了一个名为“WBCro…

【web安全】——报错注入

作者名:Demo不是emo主页面链接: 主页传送门创作初心: 舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷座右…

如何查看sqlite数据库的 .db文件中的表的内容数据

在使用 qt 的sqlite 数据的时候,对于创建的数据库的 .db 文件的内容的查看我们可以按照下面的步骤安装工具进行查看 下载所需的sqlite 查看工具 下载:链接:https://pan.baidu.com/s/1KSl9w61zaEyemhR1Ir04_A 提取码:6666 只需要解压即可,其中安装包内…

MINISForum HX90 主机风扇调教

今年秋天买了个1个HX90 5900H的mini主机。准系统版本,2899元。 但是买回来之后,发现它的风扇声音实在是大,稍微一加载点东西,就 开始呜呜的响,简直让人心烦 意乱。 去了官网查看。好多人的解决办法看了没看明白&…

【机器学习】PR曲线F1评分ROC曲线AUC

参考:《百面机器学习》 PR曲线 TP( True Positive):真正例 FP( False Positive):假正例 FN(False Negative):假反例 TN(True Negative&#xff0…

基于imx6ull配置开发环境

1. 交叉编译链背景:因为在原子的教程中有强调最新的Linaro gcc编译完uboot后无法运行的问题,所以原子采用4.9,那我们就沿用下。Linaro gcc有两个版本: gcc-linaro-4.9.4-2017.01-i686_arm-linux-gnueabihf.tar.tar.xz 和 gcc-linaro-4.9.4-20…

linux反弹备忘录

如果你有幸在渗透测试中发现了命令执行漏洞,那么不久之后你可能需要一个交互式shell。如果无法添加新帐户/ SSH密钥/ .rhosts文件并登录,则下一步可能是拖回反向shell或将shell绑定到TCP端口。 本页讨论前者。创建反向 shell 的选项受到目标系统上安装的…

【阶段三】Python机器学习05篇:机器学习项目实战:逻辑回归模型

本篇的思维导图: 要对离散变量进行预测,则要使用分类模型。分类模型与回归模型的区别在于其预测的变量不是连续的,而是离散的一些类别,例如,最常见的二分类模型可以预测一个人是否会违约、客户是否会流失、肿瘤是良性还是恶性等。逻辑回归模型虽然名字中有“回归…

Neural-Pull曲面重建程序配置

前几天一篇曲面重建文章的审稿意见回来了,要求加近三年对比方法。在github上搜了一些项目,大部分的环境都很难配置成功。最后找了一个ICML2021年的点云重建项目[1]作为实验对比。 项目链接:mabaorui/NeuralPull-Pytorch 整体来说&#xff0…

SpringBoot 多种方式配置错误页面

参考资料 SpringBoot异常处理机制-BasicErrorController与ControllerAdviceJava开发从工作到原理–BasicErrorController统一异常处理【spring boot】spring boot 处理异常SpringBoot一个请求的处理全过程ControllerAdvice和ErrorPageRegistrar接口配置错误页面的问题SpringBo…

【Linux操作系统】自动化编译make和Makefile

文章目录一.make/makefile简介1.什么是make,makefile?2.为什么要有make/makefile?二.makefile文件规则1.基本规则2.举一个例子3.伪目标4.其他规则三.文件三个时间问题-make程序1.三个时间何时更新2.touch的两个作用3.make程序如何知道依赖文件是否更新?一.make/makefile简介…

手写Srping11(实现AOP切面)

文章目录目标设计项目结构一、代理方法的案例二、代理方法案例拆解实现1、切点表达式——Pointcut2、类匹配器——ClassFilter3、方法匹配器——MethodMatcher4、实现切点表达式类——AspectJExpressionPointcut4.1、匹配验证5、包装切面信息——AdvisedSupport5.1、被代理的目…

Zynq PS之MIO、EMIO调试

目录 原理框图 Vivado中添加&配置Zynq UltraScale MPSoc IP UART设置(仅用于调试,非必需) MIO、EMIO设置 DDR配置 执行Generate Output Products 执行Create HDL Wrapper 执行File -> Export ->Export Hardware 执行Launch S…

Springboot中配置文件application.yaml的位置

文章目录位置一:整个项目的config包下位置二:整个项目的根目录下位置三:resources文件夹下config包中位置四:resources文件夹下四个位置的优先级位置一:整个项目的config包下 前些天发现了一个巨牛的人工智能学习网站&…

SQL优化实战-0002:select查询不建议使用星号(select *),最好指定具体查询字段

文章目录1.查询时的普遍写法2.问题分析2.1 计算负担2.2 IO负担2.3 覆盖索引失效2.4 缓存压力3.总结1.查询时的普遍写法 select * from the_table_name where ...2.问题分析 2.1 计算负担 数据库需要去解析更多的对象字段、权限、属性,查询数据字典将"*"…

dp刷题(二)分割回文串(详细推导+O(N^3)=>O(N^2)优化)

目录 分割回文串-ii_牛客题霸_牛客网 ​编辑 描述 示例1 思路 状态F(i):即为第i个字符时所需要切割的最小次数 状态转移方程:F(i) min(F(i), F(j)1) 优化: 注意点 分割回文串-ii_牛客题霸_牛客网 描述 给出一个字符串s&#xff0…

Android---Bottom Sheet

目录​​​​​​​ Bottom Sheet BottomSheetBehavior BottomSheetDialog 完整 Demo Bottom Sheet Bottom Sheet 是 Design Support Library 23.2 版本引入的一个类似于对话框的控件,可以暂且叫做底部弹出框。Bottom Sheet 中的内容默认是隐藏起来的&#xff0…

Python爬虫登录后token处理

今天继续给大家介绍Python爬虫相关知识,本文主要内容是Python爬虫登录后token处理。 一、网页token及token作用 在上文Python爬虫登录后cookie处理中,我们介绍过使用使用Python爬虫解决cookie及网页登录访问问题。 然而,有的网站&#xff0…

一文读懂Linux内核进程及调度时机原理

前言0.1 进程概要进程是对物理世界的建模抽象,每个进程对应一个 task_struct 数据结构,这个数据结构包含了进程的所有的信息。在 Linux 内核中,不会区分线程和进程的概念,线程也是通过进程来实现的,线程和进程的唯一区…