Linux 内核调试环境搭建

embedded/2024/11/25 20:44:13/

目录

QEMU

Linux 0.11 源码

​编辑 gdb 调试

     

 学习Linux内核,我们可以看书,实际我们最好可以有一个可以调试的环境,本文就简单介绍一下使用Qemu 和gdb 来调试和查看Linux kernel 。在ubantu 20.04 的PC 上面编译内核源码,通过QEMU 来运行内核,然后使用gdb 来调试查看内核数据。

QEMU

QEMU 是一个开源的虚拟化技术软件,用于模拟硬件并执行多个操作系统和应用程序。QEMU 本身是一个纯软件的模拟器,但它通常与 Linux 内核的 KVM(Kernel-based Virtual Machine)模块结合使用,以实现高效的硬件辅助虚拟化。

QEMU 的主要特点包括:

  1. 平台独立性:QEMU 可以在多种平台上运行,包括 x86、ARM、MIPS 等。
  2. 可扩展性:QEMU 支持多种虚拟化标准,如 PCI Express、USB、SCSI、网络设备等。
  3. 高性能:结合 KVM,QEMU 可以实现接近原生硬件性能的虚拟化。
  4. 易用性:QEMU 提供了丰富的命令行选项和配置文件,方便用户进行虚拟机的配置和管理。

QEMU 通常用于以下几个方面:

  1. 开发和测试:QEMU 可以用于创建虚拟机,以便在不同的操作系统和硬件平台上开发和测试应用程序。
  2. 服务器虚拟化:QEMU 可以与 KVM 结合,实现高效的服务器虚拟化,提高硬件资源的利用率。
  3. 嵌入式系统开发:QEMU 支持多种嵌入式硬件平台,可用于模拟嵌入式设备,方便开发人员进行测试和调试。

我们的Linux kernel 版本是0.11 所以需要安装的QEMU 是 qemu-system-i386,ubantu 上面安装qemu 大家可以自己去搜索。

Linux 0.11 源码

Linux 0.11 源码的下载,我们可以使用网上其他人配置好的源码,因为老版本的代码是30年前的依赖一些特殊的设置和工具,直接使用配置好的比较方便,如果感兴趣也可以直接去下载官方老版本的code来手撕编译。

配置好的版本,可以用bochs ,qemu 等来调试。

GitHub - yuan-xy/Linux-0.11: The old Linux kernel source ver 0.11 which has been tested under modern Linux, Mac OSX and Windows.

 因为老版本的Linux kernel 是32位的,所以我们需要把makefile中QEMU 的设置修改一下

 把142行的qemu-system-x86_64 替换成qemu-system-i386

然后运行make debug 指令就可以启动QEMU  

 gdb 调试

gdb 的使用方法我这里就不做详细的介绍大家可以网上学习,在 tools 文件夹下面会生产符号文件

system

cmd 输入gdb system 

再输入 target remote :1234 和QMEU 建立连接。默认停止在0x0000fff0处,输入c 就会看到QEMU的界面有变化

加载了符号文件就可以使用代码中的名称来设置断点

 触发断点后的效果

查看gdt 表的内容

和源码中设置的值对比一下看看,

_gdt:	.quad 0x0000000000000000	/* NULL descriptor */.quad 0x00c09a0000000fff	/* 16Mb */.quad 0x00c0920000000fff	/* 16Mb */.quad 0x0000000000000000	/* TEMPORARY - don't use */.fill 252,8,0			/* space for LDT's and TSS's etc */

利用QEMU 和gdb 我们可以在看书学习的时候查看寄存器和内存中的值来加深对Linux kernel 的认识。


http://www.ppmy.cn/embedded/12762.html

相关文章

Qt实现XYModem协议(五)

1 概述 XMODEM协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据,并且每个块都使用一个校验和过程来进行错误检测。使用循环冗余校验的与XMODEM相应的一种协议称为XMODEM-CRC。还有一种是XMODEM-1K&am…

社交媒体数据恢复:YY语音

YY语音数据恢复指南 在我们的日常生活中,数据丢失是一种常见的现象。有时候,我们可能会不小心删除了重要的文件,或者因为硬件故障而导致数据丢失。在这种情况下,数据恢复软件可以帮助我们找回丢失的数据。本文将重点介绍如何使用Y…

【MySQL】MySQL锁(四)其它锁概念

MySQL锁(四)其它锁概念 好了,锁相关内容的最后一篇文章了。其实最核心的内容,表锁、行锁、读锁、写锁、间隙锁这些重要的内容我们都已经学习过了,特别是间隙锁,是不是感觉非常复杂。放心,今天的…

面包屑新玩法,ReactRouter+Ant Design实现动态渲染

在Ant Design中,可以通过Breadcrumb组件结合react-router库实现动态生成面包屑导航。具体步骤如下: 定义路由配置数据结构 我们需要在路由配置中添加额外的面包屑相关信息,例如面包屑标题、icon等。例如: const routes [{path: /,breadcrumbName: 首页},{path: /users,brea…

深度学习的发展历程与未来展望

深度学习是人工智能领域的一个重要分支,它利用神经网络模拟人类大脑的学习过程,通过大量数据训练模型,使其能够自动提取特征、识别模式、进行分类和预测等任务。近年来,深度学习在多个领域取得了显著的进展,尤其在自然…

Hadoop实战——MapReduce-字符统计(超详细教学,算法分析)

目录 一、前提准备工作 启动hadoop集群 二、实验过程 1.虚拟机安装先设置端口转发 2.上传对应文件 3.编写Java应用程序 4. 编译打包程序 5. 运行程序 三、算法设计和分析 算法设计 算法分析 四、实验总结 实验目的:给定一份英文文本,统计每个…

JS-43-Node.js02-安装Node.js和npm

Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,可以让JavaScript实现后端开发,所以,首先在本机安装Node.js环境。 一、安装Node.js 官网:下载 Node.js 默认两个版本的下载: 64位windows系统的LTS(Long Tim…

Java | Leetcode Java题解之第42题接雨水

题目&#xff1a; 题解&#xff1a; class Solution {public int trap(int[] height) {int n height.length;if (n 0) {return 0;}int[] leftMax new int[n];leftMax[0] height[0];for (int i 1; i < n; i) {leftMax[i] Math.max(leftMax[i - 1], height[i]);}int[] …