QEMU + Vscode + Arm Arch‘s Linux调试小记

news2024/11/19 9:21:29

目录

下载QEMU

下载aarch64-gcc

下载BusyBox

编译linux 6.9.5的内核

启动!

链接到vscode进行远程调试

Reference


前几天看到了一篇讲授如何调试ARM Linux内核的文章,这里现在记录一下调试ARM Linux内核的办法

下载QEMU

对于Arch Linux用户而言,没有必要自己编译,直接上AUR源下载就行。我自己有打算研究和调试多个架构,所以我自己下载了:

yay -S qemu-full

关于什么是QEMU:QEMU - ArchWiki

AUR源:Arch Linux - qemu-full 9.0.1-1 (x86_64)

如果只是想要调试ARM64位linux,需要下载的是aarch版本的。

下载完成之后,可以看看自己是否可以正常启动:

qemu-system-aarch64 --version
QEMU emulator version 9.0.1
Copyright (c) 2003-2024 Fabrice Bellard and the QEMU Project developers

下载aarch64-gcc

yay -S aarch64-linux-gnu-gcc 
aarch64-linux-gnu-gcc  -v 
Using built-in specs.
COLLECT_GCC=aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/aarch64-linux-gnu/14.1.0/lto-wrapper
Target: aarch64-linux-gnu
Configured with: /build/aarch64-linux-gnu-gcc/src/gcc-14.1.0/configure --prefix=/usr --program-prefix=aarch64-linux-gnu- --with-local-prefix=/usr/aarch64-linux-gnu --with-sysroot=/usr/aarch64-linux-gnu --with-build-sysroot=/usr/aarch64-linux-gnu --with-native-system-header-dir=/include --libdir=/usr/lib --libexecdir=/usr/lib --target=aarch64-linux-gnu --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --disable-nls --enable-default-pie --enable-languages=c,c++,fortran --enable-shared --enable-threads=posix --with-system-zlib --with-isl --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-gnu-indirect-function --disable-multilib --disable-werror --enable-checking=release
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 14.1.0 (GCC) 

下载BusyBox

这个比较遗憾,因为我们是调试ARM架构的,所以文件系统的架构基础必须是ARM,否则文件系统无法识别,为此我们不得不干脏活:手动编译ARM版本的BusyBox

Downloads: Index of /downloads

busybox-1.36.1.tar.bz2: https://www.busybox.net/downloads/busybox-1.36.1.tar.bz2

下一步就是配置,好玩的是:我们需要更改一下menuconfig的文件:

你可以先尝试make menuconfig,不过马上就会给你抛错:说找不到libncurse5,其实不然,改一下shell脚本就行:

esp8266-rtos-sdk-aur-ncurses-fix.patch - aur.git - AUR Package Repositories

也就是把main改成int main就好

下一步就是:

make menuconfig
Settings --->
 [*] Build static binary (no shared libs) 

指定编译架构和参数

export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make && make install

我们所有的文件就会出现在源代码根目录下的_install里,下面比较麻烦——为了制作操作系统的可用文件系统,必须多加点

cd _install
mkdir etc dev lib
➜  ls
bin/  dev/  etc/  lib/  linuxrc@  sbin/  usr/

下面依次创建文件:

在etc目录下:

profile

#!/bin/sh
export HOSTNAME=Charliechen
export USER=root
export HOME=/home
export PS1="[$USER@$HOSTNAME \W]\# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH

inittab

::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r

fstab

#device  mount-point    type     options   dump   fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
debugfs /sys/kernel/debug debugfs defaults 0 0
kmod_mount /mnt 9p trans=virtio 0 0

新建一个init.d文件夹:

里面放入文件

rcS

mkdir -p /sys
mkdir -p /tmp
mkdir -p /proc
mkdir -p /mnt
/bin/mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

改一下权限:

chmod 777 rcS
  1. busybox 作为linuxrc启动后, 会读取/etc/profile, 这里面设置了一些环境变量和shell的属性

  2. 根据/etc/fstab提供的挂载信息, 进行文件系统的挂载

  3. busybox 会从 /etc/inittab中读取sysinit并执行, 这里sysinit指向了/etc/init.d/rcS

  4. /etc/init.d/rcS 中 ,mdev -s 这条命令很重要, 它会扫描/sys目录,查找字符设备和块设备,并在/dev下mknod

我们继续:在dev目录下创建console文件

cd _install/dev
sudo mknod console c 5 1

拷贝aarch目录下的lib动态文件到lib目录,让动态运行文件可以执行:

cd _install/lib
cp /usr/aarch64-linux-gnu/lib/*.so*  -a .

编译linux 6.9.5的内核

make defconfig ARCH=arm64

修改.config的这些配置:

CONFIG_DEBUG_INFO=y 			# 更多的调试信息
CONFIG_INITRAMFS_SOURCE="./root" # 文件系统在哪?
CONFIG_INITRAMFS_ROOT_UID=0
CONFIG_INITRAMFS_ROOT_GID=0

注意,上面的信息务必是:存在则修改,不存在添加!

在Linux源码目录下添加一个root文件夹,其实这对应的是CONFIG_INITRAMFS_SOURCE的位置:

mkdir root
sudo cp -r path/to/your/busybox_source_code/_install ./root
make ARCH=arm64 Image -j8  CROSS_COMPILE=aarch64-linux-gnu-

泡杯茶老铁!

启动!

/usr/local/bin/qemu-system-aarch64 
-m 512M 		# 内存为512M
-smp 4 			# 4核
-cpu cortex-a57 # cpu 为cortex-a57
-machine virt 	
-kernel arch/arm64/boot/Image #  kernel镜像文件
-append "rdinit=/linuxrc nokaslr console=ttyAMA0 loglevel=8" 
# 传给kernel 的cmdline参数。其中rdinit指定了init进程;nokaslr 禁止内核起始地址随机化,这个很重要, 否则GDB调试可能有问题;console=ttyAMA0指定了串口,没有这一步就看不到linux的输出
-nographic # 禁止图形输出
-s # 监听gdb端口, gdb程序可以通过1234这个端口连上来。
qemu-system-aarch64 -m 512M -smp 4 -cpu cortex-a57 -machine virt -kernel arch/arm64/boot/Image -append "rdinit=/linuxrc nokaslr console=ttyAMA0 loglevel=8" -nographic -s

启动起来!

成功运行!

链接到vscode进行远程调试

我们在Linux源代码根目录下code .

非上位机架构需要使用gdb-multiarch来调试!

yay -S gdb-multiarch

在.vscode文件处添加launch.json文件:

➜  cat .vscode/launch.json 
{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "kernel debug",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/vmlinux",
            "cwd": "${workspaceFolder}",
            "MIMode": "gdb",
            "miDebuggerPath":"/usr/bin/gdb-multiarch",
            "miDebuggerServerAddress": "localhost:1234"
        }
    ]
}⏎

下一步可能出错的是——没有对应版本的py,这个自信寻找aur源,我当时缺少的是python311,所以在aur源搜索python+版本号就可以出来,举个例子少python3,7搜python37就OK!

之后我们就可以顺利的启动起来了:

下一步就是——打个断点试试看:我打在了kernel/fork.c的copy_mm函数!相信大家熟悉linux内核开发的都知道这个是什么(喜)

打好断点,输入ls并且回车,就可以看到断点生效!

Reference

https://zhuanlan.zhihu.com/p/510289859

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

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

相关文章

结构思考力:让你的思维更有条理

在这个信息爆炸的时代,如何让自己的思维更有条理,更高效地沟通显得尤为重要。最近读了《结构思考力》一书。今天,我想和大家分享一下读后感,从以下几个方面展开:1. 什么是结构思考力及其重要性;2. 为什么要…

数据治理创新路:建设数据集市,强化数据报送一致性新实践

随着信息化和数字化的飞速发展,数据已经成为企业运营和决策的核心要素。然而,数据治理的复杂性和多样性给企业带来了不小的挑战。为了更好地应对这些挑战,许多企业开始探索数据治理的创新路径,其中建设数据集市和强化数据报送一致…

Vue08-webpack使用

webpack使用 1、什么是Webpack 本质上, webpack是一个现代JavaScript应用程序的静态模块打包器(module bundler) 。当webpack处理应用程序时, 它会递归地构建一个依赖关系图(dependency graph) , 其中包含应用程序需要的每个模块&#xff0…

期货以旁观者心态关注市场,会更加理性

1.期货交易具备较高灵活度,相比于股票,期货盈利速度明显提升。针对普通投资者,适量参与中线投机更为合适。 2.选择期货品种需兼顾市场属性稳定与计划特点较弱两方面,以及波动剧烈、投机特征显著的品种。 3.若市场环境不利且缺乏机…

temu跨境选品师是怎么样的一个项目?

TEMU(特穆)跨境选品师项目,作为一项创新的全球商品采购和选品服务,正在逐步改变消费者对于跨境电商产品的认知和选择方式。这个项目不仅仅是一个简单的商品推荐平台,更是一种以数据驱动的精准选品策略的体现,为消费者提供了全新的…

【操作系统】操作系统课后作业-聊天程序

无名管道与有名管道的区别 无名管道: 它是半双工的,具有固定的读端和写端。 只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。 不是普通的文件,不属于其他任何文件系统,并且只存…

期望25K,我的React知识体系

面经哥只做互联网社招面试经历分享,关注我,每日推送精选面经,面试前,先找面经哥 我最终还是上岸了,花了3天总结了近万字的react知识体系思维导图,分享出来希望能帮助有缘人吧,以下只是部分截图&…

org.eclipse.milo opcua 库查看记录

1 Reference连接 在OPC UA Server中,所有Node之间都是使用Reference进行连接的。 读取时指定HierarchicalReferences就可以读取HierarchicalReferences及以下所有类型的节点。 2 nodeId读取 browse 默认读取了Method、Object、Variable类型节点,Refer…

CCS条形光源——HLDL3系列,长距离和宽范围照射应用的不二之选

机器视觉系统中,光源起着重要作用,不同类型的光源应用也不同,选择合适的光源成像效果非常明显。今天我们一起来看看CCS光源——工业用条形光源HLDL3系列。 高亮LED光源HLDL3系列 适用于长距离和宽范围照射的条形光源。 适用于各种检测案例&a…

Linux DNS配置文档

一、问题描述 1. 无法在浏览器通过域名访问百度; 2. 无法在终端 ping 通百度,例如:ping www.baidu.com 3. 可以 ping 通公网地址,例如:ping 114.114.114.114 或 ping 8.8.8.8 二、问题原因 域名解析 DNS 配置错误&am…

如何快速在一台新电脑上安装 Python 环境

一、下载miniconda 1.下载 我们可以在清华大学开源软件镜像站下载最新版本的miniconda。如:https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py38_4.9.2-Windows-x86_64.exe 2.安装 双击exe文件安装,如果没有特殊的需求&#x…

Erlang程序设计[Part2 chapter5-chapter8]

两种数据容器:元组、列表 part 2 chapter5 记录与映射组 记录 记录其实就是元组的另一种形式。通过使用记录,可以给元组里的各个元素关联一个名称。 映射 映射组是键 值对的关联性集合。 通过记录命名元组里的项 记录的产生背景: 对于小型元…

线上课堂知识付费小程序源码系统 全面升级+完整的安装包+搭建部署教程

系统概述 随着互联网的发展,线上教育和知识付费市场呈现出爆发式增长。线上课堂知识付费小程序源码系统为教育机构、培训师、个人创作者等提供了一个便捷、高效的平台,让他们能够将自己的知识和技能转化为实际收益。 代码示例 系统特色功能一览 1.拓展…

K8s的资源对象

资源对象是 K8s 提供的一些管理和运行应用容器的各种对象和组件。 Pod 资源是 K8s 中的基本部署单元,K8s通过Pod来运行业务应用的容器镜像 Job 和 CronJob 资源用于执行任务和定时任务,DaemonSet 资源提供类似每个节点上守护进程, Deployment…

【FAS】《Survey on face anti-spoofing in face recognition》

文章目录 原文基于手工设计特征表达的人脸活体检测方法基于深度学习的人脸活体检测方法基于融合策略的人脸活体检测方法人脸检测活体数据库点评 原文 邓雄,王洪春,赵立军等.人脸识别活体检测研究方法综述[J].计算机应用研究,2020,37(09):2579-2585.DOI:10.19734/j.issn.1001-3…

要颜值有颜值,有性价比有性价比,华硕天选键、鼠组合分享

作为ROG产品的忠实粉丝,用过不少ROG 相关的产品,近期华硕天选TX98和天选MINI 鼠标的发布,独特配色令我眼前一亮。 华硕天选TX98键盘,作为新品,从看上的第一眼就觉得这款键盘是非常值得推荐。 它完美地诠释了潮玩新次元…

扩散模型在时间序列预测中的兴起

摘要 本文探讨了扩散模型在时间序列预测中的应用。扩散模型在生成式人工智能的各个领域展示了最先进的成果。本文包括扩散模型的全面背景资料,详细说明了它们的调节方法,并回顾了它们在时间序列预测中的应用。分析涵盖了11个具体的时间序列实现&#xf…

20240613日志:大模型压缩方法COPAL

Location: Beijing 1 大模型剪枝 Fig. 1.1大模型压缩-剪枝 剪枝的分类:结构化修剪对于简化大型语言模型和提高其效率尤其相关。非结构化修剪关注的是选择性地去除单个权重,旨在消除网络中不那么关键的连接。 修剪的基于阶段的分类:修剪可以在…

zustand 状态管理库的使用 结合TS

zustand 是一个用于React应用的简单、快速且零依赖的状态管理库。它使用简单的钩子(hooks)API来创建全局状态,使得在组件之间共享状态变得容易。 React学习Day10 基本用法 安装:首先,你需要安装zustand库。 npm insta…

快速LLaMA:面向大型语言模型的查询感知推理加速 论文摘要翻译与评论

论文摘要翻译与评论 论文标题: QuickLLaMA: Query-aware Inference Acceleration for Large Language Models 提出的框架 我们Q-LLM框架的示意图。来自记忆上下文的输入被分割成记忆块,通过查询感知的上下文查找来搜索与查询相关的块。目前的键值缓存…