如何使用qemu调试内核

news2024/11/24 20:36:29

文件系统

调试内核需要一个基本的文件系统,我们可以使用简单的 ramdisk来作为这个文件系统,如果,需要测试一些其它应用程序,我们还需要创建一个大一点根文件系统。

Ramdisk

也就是内核启动时的initrd.img,可以使用busybox来制作这个小文件系统,源码目录的INSTALL文件有编译和安装的说明。

  • make defconfig
  • make
  • make install : 默认目录 —— _install

制作initrd.img

  1. 把 busybox拷贝到 initrd根目录,并切换到initrd根目录。

  2. 创建init: ln -s bin/busybox init

  3. 创建系统文件夹:mkdir dev etc proc sys

  4. 配置etc目录

    .创建文件 etc/init.d/rcS,输入如下内容:

#!/bin/sh

mount proc
mount -o remount,rw /
mount -a    
clear

     .创建文件 etc/fstab,输入如下内容:

proc            /proc      proc           defaults    0       0
sysfs           /sys        sysfs          defaults    0       0
devtmpfs        /dev       devtmpfs        defaults    0       0

   .创建文件 etc/inittab,输入如下内容:

::sysinit:/etc/init.d/rcS   
::askfirst:-/bin/sh    
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount    -a   -r
::shutdown:/sbin/swapoff  -a

5.创建img 磁盘文件

find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../initrd.img

磁盘文件系统

磁盘文件系统同 initrd.img的一个最大区别是需要bootloader,制作磁盘文件系统大概需要这么几个步骤:

  1. 先生成一个有MBR记录的磁盘文件(hda.img),文件系统是ext4,并mount.

  2. 安装grub到磁盘文件。

  3. 下载一个根文件系统(如:debootstrap --arch=i386 focal focal-rootfs)。

  4. 拷贝到磁盘文件,并做好配置。

文件系统配置

1:grub: 添加启动程序,设置sda1为rw, 下面的init是systemd的初始化进程。

linux /boot/bzImage rw text root=/dev/sda1  init=/usr/sbin/init

2:设置root密码,系统登陆时需要输入的密码

  1. mount hda.img 到 /mnt
  2. chroot, 进入chroot环境。
  3. password root,来设置初始密码。或者使用 useradd 来添加新的登陆账号。

3: 配置自动登陆,或者其它登陆账号。

vim lib/systemd/system/getty@.service,修改/sbin/agetty的输入参数.

添加 -a root[或者其它账号], 实现自动登陆。

qemu

使用initrd.img

qemu-system-x86_64 -kernel bzImage -boot c -m 1024 -initrd initrd.img -append "console=ttyS0, 115200" -serial stdio

-serial stdio: 把控制台重定向到当前终端,还可以这样来配置控制台:

"console=ttyS0,115200 console=tty0" -serial file:kernel.log

使用虚拟机系统的终端,运行日志写到当前目录下的 kernel.log

使用文件系统

qemu-system-x86_64 -hda hda.img -chardev stdio,id=terminal,mux=on -device isa-debugcon,iobase=0x402,chardev=terminal -serial chardev:terminal

qemu + gdb 调试内核

1:运行qemu命令时,后面添加 "-s -S",这样虚拟机启动后会暂停 ——,如:

qemu-system-x86_64 ...... -serial stdio -s -S

2:gdb加载对应内核的vmlinux文件,在gdb命令行输入:

(gdb) break start_kernel

(gdb) target remote :1234

(gdb) c

3:qemu运行,并停止在 start_kernel处,此时可以使用gdb的命令来单步执行,查看寄存器的值。

4:qemu在运行期间,也可以中断gdb,设置新的断点。

附录一: 创建磁盘文件系统的shell脚本

来源于网络,略作修改。

#!/bin/bash
# Echo commands to stdout as they execute.
set -x
set -eE
clean () {
  rm .hda.img || true
  sudo umount tmpmnt || true
  rm -rf tmpmnt || true
  sudo losetup -d ${HDA_LOOP_DEV} || true
}

clean
# Create an empty 1G disk image, 自行调整大小。
truncate -s1G .hda.img

/sbin/parted -s .hda.img mktable msdos
/sbin/parted -s .hda.img mkpart primary ext4 1 "100%"
/sbin/parted -s .hda.img set 1 boot on

HDA_LOOP_DEV=$(sudo losetup -Pf --show .hda.img)
FS_LOOP_DEV="${HDA_LOOP_DEV?}p1"
sudo mkfs -t ext4 -v "${FS_LOOP_DEV?}"

mkdir tmpmnt
sudo mount "${FS_LOOP_DEV?}" tmpmnt
sudo chown -R ${USER?} tmpmnt

#安装grub
mkdir -p tmpmnt/boot/grub 
echo "(hd0) ${HDA_LOOP_DEV?}" >tmpmnt/boot/grub/device.map
sudo grub-install  -v  --directory=/usr/lib/grub/i386-pc \
  --boot-directory=tmpmnt/boot  ${HDA_LOOP_DEV?}  2>&1

cat >tmpmnt/boot/grub/grub.cfg <<EOF
serial
terminal_input serial
terminal_output serial
set root=(hd0,1)
linux /boot/bzImage rw root=/dev/sda1 init=/usr/sbin/init
boot
EOF

#拷贝内核和文件系统,修改为自己提供内容
cp bzImage tmpmnt/boot/bzImage

# Download a basic Debian system
if [ ! -d focal-rootfs ]; then
	sudo debootstrap --arch=i386 focal  focal-rootfs
fi
sudo cp -av focal-rootfs/*  tmpmnt/
mv .hda.img hda.img
clean

 ---
欢迎大家来我的公众号交流: 般若程序蝉

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

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

相关文章

iOS创建苹果证书、制作p12证书流程

一、创建Certificates 1、在苹果开发者后台点击右上角【Account】进入以下界面&#xff0c;然后点击【Certificates, Identifiers & Profiles】 2、进入以下界面后点击【Create a certificate】 3、然后选择证书类型&#xff0c;Apple Development&#xff08;开发者证书…

Oracle中ALTER TABLE的五种用法(四、五)

首发微信公众号&#xff1a;SQL数据库运维 原文链接&#xff1a;https://mp.weixin.qq.com/s?__bizMzI1NTQyNzg3MQ&mid2247485212&idx1&sn450e9e94fa709b5eeff0de371c62072b&chksmea37536cdd40da7a94e165ce4b4c6e70fb1360d51bed4b3566eee438b587fa231315d0a5a…

MySQL数据库复习——事务

目录 一、什么是事务&#xff1f;为什么需要事务 二、事务的四大特性&#xff08;ACID&#xff09; 三、事务的使用 四、并发带来的问题 1、脏读问题 2、不可重复读 3、幻读 五、MySQL的隔离级别 一、什么是事务&#xff1f;为什么需要事务 事务的概念&#xff1a; 事务…

深度解析Linux内核—中断

中断 中断是外围设备通知处理器的一种机制。 1. 中断控制器 外围设备不是把中断请求直接发送给处理器&#xff0c;而是发给中断控制器&#xff0c;由中断控制器转发给处理器。 不同种类的中断控制器的访问方法存在差异&#xff0c;为了屏蔽差异&#xff0c;内核定义了中断控…

model.eval 至关重要!!!!model.eval()是否开启 BN 和 Dropout 的不同

之前写过一个项目&#xff0c;eval的时候很正常&#xff0c;但是一infer就有问题&#xff0c;多次排查发现&#xff0c;原来就是只缺一个 model.eval()哇&#xff0c;重大教训&#xff0c;我debug好久&#xff0c;在小姑娘面前翻车… &#x1f923;&#x1f923;&#x1f923;…

样本与抽样分布(2)-基本分布

本节介绍在数理统计中常用的几个基本分布。为此&#xff0c;先引进分位数定义。 定义1. 2. 1 设X为随机变量&#xff0c;则称满足 的为X的上侧分位数,简称为(上侧)分位数. 1 标准正态分布 标准正态分布N (0,1)是构造其他分布的基础&#xff0c;其密度函数为 它的图形关于y轴…

【毕业设计】深度学习卫星遥感图像检测与识别系统(目标检测)

文章目录0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后0 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f525; 对毕设有任何疑问都可以问学长哦! 这两年开始&#xff0c;各个学校对毕设的要求越来…

LeetCode-44-通配符匹配

1、递归 具体思路同LeetCode-剑指19-正则表达式匹配&#xff0c;但在本题中由于字符串长度过长会导致超时。 在这里插入代码片class Solution { public:bool isMatch(string s, string p) {if (p.empty()) return s.empty();bool first_match !s.empty() && (s[0] …

Gradle修改镜像库 ,初始启动配置 init.gradle

目录 ■前言 ■代码放置位置 ■具体代码 代码建议&#xff1a; ■Gradle 的 更多知识&#xff08;私密&#xff09; ■前言 默认镜像库太慢了&#xff0c;在【初始启动配置&#xff08;init.d&#xff09;】中&#xff0c;添加xxx.gradle (init.gradle) 文件&#xff0c;指…

网络自动化运维(NetDevOps)创作者推荐

前言&#xff1a; 随着NetDevOps技术登上了历史舞台&#xff0c;越来越多的从业者开始利用NetDevOps简化网络的运维&#xff0c;并进行了技术分享&#xff0c;将蛋糕越做越大。在这里&#xff0c;仅代表个人对这些无私奉献的网络、运维工程师们表达由衷的敬意。 此外&#xff…

用户身份验证的令牌—Token教程

一、什么是Token&#xff1f; 1、Token的引入&#xff1a;Token是在客户端频繁向服务端请求数据&#xff0c;服务端频繁的去数据库查询用户名和密码并进行对比&#xff0c;判断用户名和密码正确与否&#xff0c;并作出相应提示&#xff0c;在这样的背景下&#xff0c;Token便应…

学习二十大奋进新征程线上知识答题小程序登录技术点分析与实现

学习二十大奋进新征程线上知识答题小程序登录技术点分析与实现 在最新搭建的知识答题小程序&#xff0c;遇到了微信授权登录上的技术难点&#xff0c;所以对于以往的那套登录框架不能使用了&#xff0c;需要搭建一套新的注册登录流程框架。 不得不做出调整&#xff0c;为此&a…

json交叉编译并移植到嵌入式开发板

1、解压&#xff1a;tar -xvf json-c-0.9.tar.gz 默认解压在当前目录 2、进入解压后的目录&#xff1a;$ cd cd json-c-0.9/ 3、执行&#xff1a; sudo ./configure CCaarch64-linux-gnu-gcc --hostarm-linux --prefix/opt/json-c-0.9/ 说明&#xff1a;CC赋值为嵌入式开发环…

Java之线程详解(二)——线程安全概述、synchronized锁

一、线程安全概述 什么是线程安全问题&#xff1f; 当多个线程共享同一个全局变量&#xff0c;做写的操作时&#xff08;即修改该全局变量&#xff09;&#xff0c;可能会受到其他的线程干扰&#xff0c;发生线程安全问题。 eg&#xff1a; public class Thread01 implemen…

丝裂原活化蛋白激酶TaMPK3抑制植物对ABA的反应

文章信息 题目&#xff1a;Mitogen-activated protein kinase TaMPK3 suppresses ABA response by destabilising TaPYL4 receptor in wheat 刊名&#xff1a;New Phytologist 作者&#xff1a;Ying Liu&#xff0c;You-Zhi Ma, Zhao-Shi Xu et al. 单位&#xff1a;Instit…

【Linux】如何在Linux下提交代码到gittee

文章目录使用 git 命令行创建项目三板斧第一招: git add三板斧第二招: git commit三板斧第三招: git push其他几个重要的命令git pull&#xff08;将远端同步到本地&#xff09;git rm&#xff08;删除&#xff09;git log&#xff08;查看提交日志&#xff09;使用 git 命令行…

GPT语言模型

GPT&#xff1a;GPT采用了大量的无监督的数据进行预训练&#xff08;Pre-training&#xff09;&#xff0c;并在有监督的数据上进行微调&#xff08;Fine-tuning&#xff09;来做具体的NLP的任务。结构&#xff1a;GPT使用了12层12头&#xff0c;单向transformer的decoder部分&…

2001-2020年全国31省城镇居民人均可支配收入/居民实际收入水平

1、时间区间为&#xff1a;2001-2020年 2、范围包括&#xff1a;全国31省 3、基期&#xff1a;以2001年为基期 4、来源&#xff1a;国家统计J 5、指标包括&#xff1a; 城市居民消费价格指数(上年100)、城镇居民人均可支配收入(元)、实际可支配收入&#xff08;2001年为基…

LabVIEW开发LabVIEW类

LabVIEW开发LabVIEW类 从概念上来说&#xff0c;LabVIEW面向对象编程和其它面向对象编程语言相似。但由于LabVIEW是数据流图形化编程环境&#xff0c;LabVIEW对类数据的操作和交互&#xff0c;以及LabVIEW类代码的调试方法和其它语言有所不同。 LabVIEW中的对象由值来传递&a…

02【SpringMVC的工作流程】

文章目录二、SpringMVC的工作流程2.1 SpringMVC的三大组件2.1.1 HandlerMapping&#xff1a;2.1.2 HandlerAdapter&#xff1a;2.1.3 ViewResolver&#xff1a;2.2 SpringMVC源码分析2.2.1 准备工作2.2.2 查看DispatcherServlet的继承体系&#xff1a;2.2.3 通过映射器获取执行…