qemu单步调试arm64 linux kernel

news2024/11/24 2:30:01

一、背景和目的

qemu搭建arm64 linux kernel环境-CSDN博客

之前介绍了qemu启动kernel的配置步骤和方法,现在开始我们的调试,这篇文章主要讲解如何单步调试内核,所有的实验还是基于ARM64;

二、环境准备

需要准备host=x86 target = arm64的gdb, 有三种方式:一种是sudo apt install gdb-multiarch;

另外一种是用ARM官网下载交叉编译工具链,其中自带gdb(目前我使用的方式Arm GNU Toolchain Downloads – Arm Developer); 还有一种是下载gdb源码并编译;

不同的方式有些差异,用apt安装的如果ubuntu比较老,可能存在部分特性不支持(比如ARMv8.5的PAC,BTI等,之前用ubuntu18.04就遇到了);

注意:使用ARM 官网gdb的伙伴启动时可能会遇到缺少库和python3.8的报错(依赖libncurses5 ,libncursesw5及python3.8),可以参考下面解决(偷懒可以直接安装gdb-multiarch)

三、kernel debug

单步调试kernel 只需要三步:

第一步:qemu启动内核并暂停等待(暂停是可选的,如果不调启动,可以去掉),同时需要建立网络端口等待gdb attach;

第二步:启动gdb(target=arm64)加载对应kernel Image的vmlinux, attach到指定端口即可;

第三步:如果是启动是挂起,直接设置断点即可调试,如果未选择启动暂停,ctrl + c会触发挂起,然后就可以和前面一样,正常设置断点。

qemu启动调试脚本(注意这里有个小坑,直接调试的伙伴直接跳转到最后拷贝即可

qemu-system-aarch64 \
    -machine virt,virtualization=true,gic-version=3 \
    -nographic \
    -m size=1024M \
    -cpu cortex-a72 \
    -smp 2 \ 
    -kernel Image \
    -drive format=raw,file=rootfs.img \
    -append "root=/dev/vda rw" \
    -s \
    -S

可以看到对比之前的启动参数也就是增加了-s 和-S,具体含义如下:
# -s 是-gdb tcp::1234 的简写,如果需要换端口可以用-gdb tcp::1234替换-s参数
# -S 是freeze cpu at startup的指令,也就是kernel 启动时就挂起,等待调试连接,如果不需要调试内核启动,这个参数也
     可以去掉

gdb启动
找到vmlinux所在目录(最好在linux编译的根目录,不要拷贝出来,这样调试源码可以直接显示,不然还要在gdb中设置src path),
geek@geek-virtual-machine:~/workspace/linux/linux-6.6.1$ aarch64-none-linux-gnu-gdb vmlinux

(gdb) target remote :1234
Remote debugging using :1234
0x0000000040000000 in ?? ()
(gdb) b start_kerne

然后continue即可停在指定断点,后面就可以step 单步调试了,实际调试时会发现设置的断点start_kernel停不住,ctrl+c 触发挂起时会出现bt无法显示相关符号等问题

(gdb) bt
#0  0xffffd43266a17f6c in ?? ()
#1  0xffffd43265ad7ad0 in ?? ()
#2  0x0000000000000002 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
 

这里的原因也是经常会遇到和遗忘的,查看kernel log可以看到KASLR字样

[    0.000000] KASLR enabled
[    0.000000] CPU features: kernel page table isolation forced ON by KASLR

KASLR是内核启动添加随机地址保护,启动后实际运行地址和vmlinux 有一个随机偏移值,在gdb中设置断点是基于vmlinux的(这个是不带偏移值的),实际qemu中运行的内核是在这个地址 + 随机偏移值,所以断点无法触发,出现上面的问题;

上面的问题有两种解决方法:

1、是重新编译内核,在arch/arm64/configs/defconfig 中将CONFIG_RANDOMIZE_BASE=y修改成CONFIG_RANDOMIZE_BASE=n

2、是在qemu启动的cmdline中增加nokaslr 参数,通过参数方式关闭

      -append "root=/dev/vda rw nokaslr" \

修改正常后,断点能正确停止,bt调用栈显示正常

(gdb) bt
#0  cpu_do_idle () at arch/arm64/kernel/idle.c:32
#1  0xffff800081017f80 in arch_cpu_idle () at arch/arm64/kernel/idle.c:44
#2  0xffff800081018bcc in default_idle_call () at kernel/sched/idle.c:97
#3  0xffff8000800d7ad0 in cpuidle_idle_call () at kernel/sched/idle.c:170
#4  do_idle () at kernel/sched/idle.c:282
#5  0xffff8000800d7d48 in cpu_startup_entry (state=CPUHP_ONLINE) at kernel/sched/idle.c:380
#6  0xffff800081018eac in rest_init () at init/main.c:726
#7  0xffff800081aa08bc in arch_call_rest_init () at init/main.c:823
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

四、总结

qemu内核调试时需要注意关闭kaslr,更新正确的脚本,也不依赖kenerl config是否开启kaslr

qemu启动脚本(最终版本):

qemu-system-aarch64 \
    -machine virt,virtualization=true,gic-version=3 \
    -nographic \
    -m size=1024M \
    -cpu cortex-a72 \
    -smp 2 \ 
    -kernel Image \
    -drive format=raw,file=rootfs.img \
    -append "root=/dev/vda rw nokaslr" \
    -s \
    -S

关于kaslr原理相关的知识,有兴趣的伙伴参考 文章 kaslr原理分析

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

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

相关文章

vue2中的watch(侦听器)讲解,以及解决深度监听新值和旧值相同的两种方案(手写深拷贝和JSON.parse())。

目录 一:什么是watch? 二:watch的基础使用 1.最基本的使用 2.简写形式 三:watch中的immediate和deep属性 1.immediate属性 2.deep属性 3.解决深度监听新旧值相同的问题 1)使用序列化和反序列化。 2)手写深…

DevOps系列文章之 GitLabCI汇总

GitlabCI环境搭建 前提 先安装 docker Docker容器化安装 docker pull gitlab/gitlab-ee:12.4.0-ee.0 创建挂载目录 mkdir -p /srv/gitlab mkdir -p /srv/gitlab/config # 映射到 Glitlab 容器中的配置目录 mkdir -p /srv/gitlab/logs # 映射到 Glitlab 容器中的日志目录 m…

换个思维方式快速上手UML和 plantUML——类图

和大多数朋友一样,Jeffrey 在一开始的时候也十分的厌烦软件工程的一系列东西,对工程化工具十分厌恶,觉得它繁琐,需要记忆很多没有意思的东西。 但是之所以,肯定有是因为。对工程化工具的不理解和不认可主要是基于两个逻…

最新国内GPT4.0使用教程,AI绘画-Midjourney绘画V6 ALPHA绘画模型,GPT语音对话使用,DALL-E3文生图+思维导图一站式解决方案

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画,文档对话总结DALL-E3文生图,相信对大家应该不感到陌生吧?简单来说,GPT-4技术比之前的GPT-3.5相对来说更加智能,会根据用户的要求生成多种内容甚至也可以和…

围棋的气 - 华为OD统一考试

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C 题目描述 围棋棋盘由纵横各19条线垂直相交组成,棋盘上一共19x19361个交点,对弈双方一方执白棋,一方执黑棋,落子时只能将棋子…

智慧文旅:未来旅游业的数字化转型

随着科技的快速发展,数字化转型已经成为各行各业的必然趋势。旅游业作为全球经济的重要组成部分,也正经历着前所未有的变革。智慧文旅作为数字化转型的重要领域,正逐渐改变着旅游业的传统模式,为游客带来更加便捷、个性化的旅游体…

锐龙笔记本Windows 11休眠无法唤醒问题的解决(6800h, 7840H/Hs)

锐龙笔记本运行Windows 11时经常会遇到休眠后无法唤醒的问题,表现为休眠后 按键盘或鼠标无反应,只能长按电源开关关机后再开机。网上有很多说法,比如显卡问题或其它问题。但是本质 上这个是电源管理软硬件不兼容导致的,解决办法如…

2024 年 eBPF 和网络趋势预测

本文地址:2024 年 eBPF 和网络趋势预测 | 深入浅出 eBPF 1. eBPF 1.1 eBPF 将继续呈指数增长1.2 eBPF 应用市场1.3 eBPF 在手机中得到更广泛的应用1.4 eBPF 滥用带来的风险2. 可观测 2.1 最受欢迎的可观测性2.2 降低可观测性开销2.3 上下文感知的 Kubernetes 工作负…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-自定义帖子管理实现

锋哥原创的SpringbootLayui python222网站实战: python222网站实战课程视频教程(SpringBootPython爬虫实战) ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程(SpringBootPython爬虫实战) ( 火…

力扣516. 最长回文子序列

动态规划 思路: 字符串最长回文子序列问题可以转换为原字符串 s 和逆串 s 的最长公共子序列长度问题,具体推断过程可以参考 力扣1312. 让字符串成为回文串的最少插入次数问题变成了求两个字符串最长公共子序列长度问题,具体思路可以参考 力扣…

每次请求sessionid变化【SpringBoot+Vue】

引言:花了一晚上的时间,终于把问题解决了,一开始后端做完后,用apifox所有接口测试都是可以的,但当前端跑起来后发现接收不到后端的数据。 当我写完前后端,主页面和获取当前页面信息接口后,配置了cros注解 CrossOrigin…

数据湖技术之发展现状篇

一. 大数据处理架构: 大数据处理架构的发展过程具体可以分为三个主要阶段:批处理架构、混合处理架构(Lambda、Kappa架构)、湖仓一体。首先是随着Hadoop生态相关技术的大量应用,批处理架构应运而生,借助离线…

QEMU源码全解析41 —— Machine(11)

接前一篇文章:QEMU源码全解析40 —— Machine(10) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 特此致谢! 时间过去了几…

MCU启动文件小解一下

GD32启动文件分析 启动文件的一些指令.s启动文件分析栈空间分配堆空间管理中断向量表定义堆空间定义Reset_Handler复位程序HardFault_Handler_main文件分析用户堆栈初始化 GD32启动文件主要做了以下工作: 初始化SP_initial_sp , PCReset_Handler指针,设置…

眼底增强型疾病感知蒸馏模型 FDDM:无需配对,fundus 指导 OCT 分类

眼底增强型疾病感知蒸馏模型 FDDM:fundus 指导 OCT 分类 核心思想设计思路训练和推理 效果总结子问题: 疾病特定特征的提取与蒸馏子问题: 类间关系的理解与建模 核心思想 论文:https://arxiv.org/pdf/2308.00291.pdf 代码:https://github.c…

C#调用SqlSugar操作达梦数据库报错“无效的表或视图名”

安装达梦数据库后,使用SqlSugar连接测试数据库并基于DBFirst方式创建数据库表对应的类,主要代码如下: SqlSugarClient db new SqlSugarClient(new ConnectionConfig(){DbType DbType.Dm,ConnectionString "Serverlocalhost; User Id…

Redis3-秒杀活动

秒杀 准备工作 我是参照下面这位大佬的i骄傲成下载的 csdn友情链接 Jmeter模拟多线程的压力测试工具 秒杀代码: package com.aaa.controller;import io.netty.util.internal.StringUtil; import org.apache.commons.lang.StringUtils; import org.springfram…

YoloV8改进策略:BackBone改进|DCNv4最新实践|高效涨点|多种改进教程|完整论文翻译

摘要 涨点效果:在我自己的数据集上,mAP50 由0.986涨到了0.993,mAP50-95由0.737涨到0.77,涨点明显! DCNv4是可变形卷积的第四版,速度和v3相比有了大幅度的提升,但是环境搭建有一定的难度,对新手不太友好。如果在使用过程遇到编译的问题,请严格按照我写的环境配置。 …

【GitHub项目推荐--不错的 TypeScript 学习项目】【转载】

在线白板工具 Excalidraw 标星 33k,是一款非常轻量的在线白板工具,可以直接在浏览器打开,轻松绘制具有手绘风格的图形。 如下图所示,Excalidraw 支持最常用的图形元素:方框、圆、菱形、线,可以方便的使用…

51-17 视频理解串讲— MViT 论文精读

继TimeSformer模型之后,咱们再介绍两篇来自Facebook AI的论文,即Multiscale Vision Transformers以及改进版MViTv2: Improved Multiscale Vision Transformers for Classification and Detection。 由于本司大模型组最近组织阅读的论文较多,…