qemu调试linux内核

2023-11-17

有了qemu后我们可以使用一台电脑就能模拟出多种cpu架构的单板,不需要去进行重复复杂的编译烧写调试工作了,提高开发的效率。

一、主机环境

vmware或者hyper-v安装ubuntu20.04

二、gdb安装

这里我们直接用gdb-multiarch(可以支持多种cpu架构的gdb调试工具,不需要重复的安装各种xxx-linux-gdb了,通过set architecture命令切换不同架构的cpu即可)

sudo apt-get install gdb-multiarch

三、编译kernel和rootfs

  1. kernel编译,参考:https://blog.csdn.net/m0_56548489/article/details/124720860

注意配置kernel config时打开:

Kernel hacking --->Compile-time checks and compiler options --->[ ] Compile the kernel with debug info
 这里我们用vexpress单板做例子,文中修改的命令都基于vexpress。
 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- vexpress_defconfig
 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- all -j4
  1. rootfs构建,参考:https://blog.csdn.net/lenovo8088/article/details/121016289

调试运行

linux 上和windows上的命令其实是一样的,如果windows上安装了qemu也是可以直接用的。

Host终端1上执行qemu模拟vexpress-a9开发板:

sudo qemu-system-arm -M vexpress-a9 -m 512M -nographic -dtb linux-5.10.1/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -kernel linux-5.10.1/arch/arm/boot/zImage \
-append "console=ttyAMA0,115200 init=/sbin/init root=/dev/vda rw  ip=dhcp" \
-drive format=raw,if=none,file=debian.img,id=ha,index=0 -device virtio-blk-device,drive=ha -s -S
# -s 等价于 -gdb tcp::1234 表示监听 1234 端口,用于 gdb 连接,可以用-gdb tcp::xxxx 取代默认的1234端口
# -S 表示加载后立即暂停,等待调试指令。不设置这个选项内核会直接执行

Host终端2上执行gdb调试:

gdb-multiarch linux-5.10.1/vmlinux
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from linux-5.10.1/vmlinux...
(gdb) set architecture arm
The target architecture is assumed to be arm
(gdb) target remote:1234
Remote debugging using :1234
0x60000000 in ?? ()
(gdb) b start_kernel
Breakpoint 1 at 0x80a00960: file init/main.c, line 849.
(gdb) c
Continuing.

Breakpoint 1, start_kernel () at init/main.c:849
849     {
(gdb)

主要的流程打通后我们就可以快速的进行源码级的debug了。

扩展问题

  1. 调试内核需要确保如下配置

开启CONFIG_GDB_SCRIPTS和CONFIG_FRAME_POINTER(如果存在),关闭CONFIG_DEBUG_INFO_REDUCED和CONFIG_RANDOMIZE_BASE。

如果gdb无法断点可以尝试使用emulator后面添加qemu参数-append nokaslr,并用hb 命令添加硬件断点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qemu调试linux内核 的相关文章

  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • vmsplice() 和 TCP

    在原来的vmsplice 执行 有人建议 http lwn net Articles 181169 如果您的用户态缓冲区是管道中可容纳的最大页面数的 2 倍 则缓冲区后半部分成功的 vmsplice 将保证内核使用缓冲区的前半部分完成 但事
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 为什么 Linux 没有 DirectX API?

    在考虑现代显卡的 Windows 系统上 DirectX API 的驱动程序端实现时 我想知道为什么此实现在非 Windows 系统 尤其是 Linux 上不可用 由于明显缺乏此功能 我只能假设有一个我无视的充分理由 但在我的原始理解中 我
  • docker 非 root 绑定安装权限,WITH --userns-remap

    all 尝试让绑定安装权限正常工作 我的目标是在容器中绑定安装卷 以便 a 容器不以 root 用户身份运行入口点 二 docker daemon 配置了 userns remap 这样容器 主机上没有 root c 我可以绑定挂载和读 写
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 通过 Visual Studio 2017 使用远程调试时 Linux 控制台输出在哪里?

    我的Visual Studio 2017 VS2017 成功连接Linux系统 代码如下 include
  • 在centos中安装sqlite3 dev和其他包

    我正在尝试使用 cpanel 在 centos 机器上安装 sqlite dev 和其他库 以便能够编译应用程序 我对 debian 比 centos 更熟悉 我知道我需要的库是 libsqlite3 dev libkrb5 dev lib
  • 如何在linux中以编程方式获取dir的大小?

    我想通过 C 程序获取 linux 中特定目录的确切大小 我尝试使用 statfs path struct statfs 但它没有给出确切的大小 我也尝试过 stat 但它返回任何目录的大小为 4096 请建议我如何获取 dir 的确切大小
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • 为什么 fopen("any_path_name",'r') 不给出 NULL 作为返回值?

    在调试一些代码时 我得到如下内容 include
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • 静态方法的 Java 内存模型

    我来自操作系统和 C 语言背景 在代码编译时 世界很简单 需要处理和理解堆栈 堆文本部分等 当我开始学习 Java 时 我确实了解 JVM 和垃圾收集器 我对静态方法感到很有趣 根据我的理解 类的所有实例都会在堆中创建 然后被清理 但是 对
  • 如何使用Android获取Linux内核的版本?

    如何在 Android 应用程序中获取 Linux 内核的版本 不是 100 确定 但我认为调用 uname r 需要 root 访问权限 无论如何 有一种不太肮脏的方法可以做到这一点 那就是 System getProperty os v
  • 使用 gdb 调试 Linux 内核模块

    我想知道 API 在内核模块 中返回什么 从几种形式可以知道 这并不是那么简单 我们需要加载符号表来调试内核模块 所以我所做的就是 1 尝试找到内核模块的 text bss和 data段地址 2 在 gdb 中使用 add symbol f
  • 这种文件锁定方法可以接受吗?

    我们有 10 个 Linux 机器 每周必须运行 100 个不同的任务 这些计算机主要在我们晚上在家时执行这些任务 我的一位同事正在开发一个项目 通过使用 Python 自动启动任务来优化运行时间 他的程序将读取任务列表 抓取一个打开的任务
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设

随机推荐

  • Linux系统 Ubuntu18.04安装的详细教程(提供18.04ubuntu镜像)

    文章目录 一 镜像安装 二 vim更新 gcc ifconfig下载 三 共享文件夹设置 设置 使用 测试共享文件夹是否能使用 这步可以省略 四 另外 虚拟机名称 全名 用户名 镜像文件下载 链接 https pan baidu com s
  • 心情不美丽,爬了一些美图,独自欣赏!

    小屌丝 鱼哥 咋了 心情不美丽 小鱼 嗯 小屌丝 晚上撸串去 小鱼 不 小屌丝 蹦迪 小鱼 不 小屌丝 喝酒 小鱼 不 小屌丝 猎艳 小鱼 于是乎 一段代码上来 某网站的美女图片被下载下来 直接上代码 coding utf 8 auth c
  • js中一些常用的正则

    let reg new RegExp 电话号码 let reg 1 35789 d 9 身份证号 let reg 1 9 d 16 dX d 17 d X 18 65年龄 let reg 18 19 2 5 0 9 6 0 5 密码校验 d
  • 数据库分组排序和优化策略

    数据库分组排序和优化策略 1 分组排序 查询每个部门的最高平均工资 select deptno avg sal from emp group by deptno order by avg sal limit 0 1 查询到平均工资大于200
  • Burpsuite xssvalidator测试工具使用方法

    一 安装方法 Extend搜索xss可以找到该工具 选择后点安装就行 下载phantomjs 2 1 1 windows 然后cmd终端里执行 phantomjs exe xss js 开启后是这样的 二 使用测试 打开一个有xss的网页测
  • iPhone手机UDID获取方法

    UDID iOS设备的唯一识别码 每台iOS设备都有一个独一无二的编码 这个编码 就称为识别码 也叫做UDID Unique Device Identifier 一 通过Xcode查看 手机连接电脑 打开Xcode 选择window gt
  • 理解文本编码,ASCII、Unicode、UTF8、字节序和乱码-word打开是乱码

    原文网址提示有风险 基础知识 在计算机的内部 信息都是以二进制的方式存储的 二进制的一位 bit 可以表示0和1 位也叫做比特 位作为单位太小 为了便于使用 通常使用字节 byte 来表示二进制 一个字节有8位 可以表示256种 2的8次方
  • Docker+Jenkins+Golang 持续集成交付实战

    最近因公司发展需要 增加了一些go语言开发 对项目要求使用jenkins go docker自动部署上线 一 安装jenkins 1 安装Jenkins 详情见centos使用docker搭建jenkins jenkins使用方法见jenk
  • 使用face_recognition(一)人脸识别

    关于使用face recognition 安装方面还是有些坑的 之前用的是python3 5 pip安装出错 需要dlib什么的 按照网上的教程弄 还是有问题 搞了一天搞不定 后来看到说用python3 6比较简单 就换了个版本 结果pip
  • Ubuntu 14.04升级openssh7.7p1

    安装流媒体kurento 指定操作系统是Ubuntu 14 04 用户最近安全漏洞扫描 Ubuntu主机的ssh版本太低 OpenSSH 6 6 1p1 需要需要对该主机的SSH版本进行升级 准备升级的安全包 本次升级我准备了三个文件 op
  • 【学术探讨】万能密码原理剖析

    作者主页 士别三日wyx 作者简介 CSDN top100 阿里云博客专家 华为云享专家 网络安全领域优质创作者 推荐专栏 对网络安全感兴趣的小伙伴可以关注专栏 网络安全入门到精通 万能密码 顾名思义 就是可以 登录任意网站 的账号和密码
  • ORA-28040: 没有匹配的验证协议 问题解决

    出现这类问题 是因为 jar包不匹配造成 更换ojdbc jar包可以解决 下载ojdbc7 jar 用以前的jar包会出问题 以前的jar包会出现ora 28040 没有匹配的验证协议 项目使用的 ojdbc14报错 更换oidbc6解决
  • linux环境文件或者文件夹打包

    1 linux zip压缩 压缩当前文件夹下所有文件 压缩为a zip 命令行的方法是怎样 常用格式 zip r fileName zip 文件夹名 1 把 home目录下面的data目录压缩为data zip zip r data zip
  • java for循环删除元素_JAVA中循环删除list中元素的方法总结

    JAVA中循环遍历list有三种方式for循环 增强for循环 也就是常说的foreach循环 iterator遍历 1 for循环遍历list for int i 0 i if list get i equals del list rem
  • 第十二届蓝桥杯 ——左孩子右兄弟

    问题描述 对于一棵多叉树 我们可以通过 左孩子右兄弟 表示法 将其转化成一棵二叉树 如果我们认为每个结点的子结点是无序的 那么得到的二叉树可能不唯一 换句话说 每个结点可以选任意子结点作为左孩子 并按任意顺序连接右兄弟 给定一棵包含 N N
  • 腾讯广告算法大赛冠军、Kaggle Grandmaster倾力打造,涵盖Kaggle、阿里天池等赛题...

    随着互联网时代的到来 以及计算机硬件性能的提升 人工智能在近几年可以说是得到了爆发式的增长 互联网时代带来了大量的信息 这些信息是名副其实的大数据 另外 性能极佳的硬件也使得计算机的计算能力大大增强 这二者结合到一起 人工智能的蓬勃兴盛就变
  • MySQL数据库连接

    1 连接数据库 Class forName com mysql cj jdbc Driver 加载驱动 Connection conn DriverManager getConnection jdbc mysql localhost 330
  • 易云维®医院后勤管理系统软件利用物联网智能网关帮助实现医院设备实现智能化、信息化管理

    近年来 我国医院逐渐意识到医院设备信息化管理的重要性 逐步建立医院后勤管理系统软件 以提高信息化管理水平 该系统是利用数据库技术 为医院的中央空调 洁净空调 电梯 锅炉 医疗设备等建立电子档案 把设备监控 管控 维保 设置等主要管理操作都通
  • UHF超高频RFID应用RFID珠宝盘点管理

    关于UHF超高频RFID技术对RFID珠宝盘点管理的好处 在商场上逛 我们总会看到关于珠宝柜台展示的时候 无论多小的物品都会有一个个条码标签挂着 如果店员想对这些珠宝盘点 传统的做法是一个一个扫 如果实施RFID物联网技术 珠宝贴上RFID
  • qemu调试linux内核

    有了qemu后我们可以使用一台电脑就能模拟出多种cpu架构的单板 不需要去进行重复复杂的编译烧写调试工作了 提高开发的效率 一 主机环境 vmware或者hyper v安装ubuntu20 04 二 gdb安装 这里我们直接用gdb mul