首页 > 其他分享 >0175-GDB 调试 multiboot 启动

0175-GDB 调试 multiboot 启动

时间:2024-07-13 09:09:59浏览次数:14  
标签:kernel elf 0175 multiboot start GDB 调试

环境

  • Time 2022-11-12
  • WSL-Ubuntu 22.04
  • QEMU 6.2.0
  • NASM 2.15.05

前言

说明

参考:https://os.phil-opp.com/multiboot-kernel/

目标

使用编写好的内核可执行文件,直接从 QEMU 启动,启动时暂停 CPU,使用 GDB 调试。

汇编代码

section .multiboot_header
header_start:
    dd 0x1BADB002  ; 魔法数字,固定值
    dd 0
    dd -0x1BADB002 ; 定义的这三个数字相加需要等于0
header_end:

global start
section .text
bits 32
start:
    ; 向屏幕输出 `OK`。
    mov dword [0xb8000], 0x2f4b2f4f
    hlt

编译 debug 版本

nasm -f elf32 -g boot.asm -g 参数可以增加调试信息。

链接

linker.ld 文件内容:

ENTRY(start)

SECTIONS {
    . = 1M;

    .boot :
    {
        /* ensure that the multiboot header is at the beginning */
        *(.multiboot_header)
    }

    .text :
    {
        *(.text)
    }
}

链接命令:ld -T linker.ld -m elf_i386 boot.o -o kernel.elf

启动 QEMU

qemu-system-x86_64 -kernel kernel.elf -display curses -s -S

启动 GDB 调试

  • 启动命令:gdb kernel.elf
  • 设置架构:set architecture i386:x86-64
  • 增加断点:break start,在入口增加了一个断点。
root@jiangbo12490:~/git/game# gdb kernel.elf
set architecture i386:x86-64
Reading symbols from kernel.elf...
(gdb) set architecture i386:x86-64
The target architecture is set to "i386:x86-64".
(gdb) target remote :1234
Remote debugging using :1234
0x000000000010001b in ?? ()
(gdb) break start
Breakpoint 1 at 0x100010: file boot.asm, line 13.

效果

调试QEMU启动

通过 GDB 调试可以显示源码,单步调试时,自动显示下一条指令。
通过 CR0 寄存器,可以看到 PE,即保护模式已启用。

总结

从 QEMU 中启动了调试信息的 kernel.elf,并且通过 GDB 连接调试。

附录

标签:kernel,elf,0175,multiboot,start,GDB,调试
From: https://www.cnblogs.com/jiangbo4444/p/18299668

相关文章

  • 013 GDB跟踪程序
    题目要求请学习gdb调试工具的使用(这对后续调试很重要),并通过gdb简单跟踪从机器加电到跳转到0x80200000的简单过程。只需要描述重要的跳转即可,只需要描述在qemu上的情况。启动调试和监听的指令使用[[010基于SBI服务完成输出和关机#^fb8fca|之前学到的指令]],开启两......
  • gdb高阶调试命令
    断点条件断点condition1value==1:此次的1表示break的编号,之后的value==1表示条件判断;即在value为1时,命中编号为1的断点;ignore14:忽略断点为1的前4次命中,第5次开始,就需要命中;dbr:删除所有的断点打印p/tvar-name:打印变量名var-name的二进制内容;如何......
  • C++初学者指南-4.诊断---用gdb调试
    C++初学者指南-4.诊断—用gdb调试幻灯片gdb/前端gdbGNU的命令行调试器cgdb基于终端的gdb前端Linux安装:sudoapt-getinstallcgdbgdbgui基于浏览器的gdb前端网址:https://gdbgui.com/安装:sudopipinstallgdbguiQtCreator可以连接gdbVisualStudioCode可以连接gdbV......
  • gdb安装调试,多系统下的安装使用(Ⅳ)
    1.gdb是什么?为什么要熟悉gdb调试?         gdb(GNU调试器)是一个强大的调试工具,允许开发者在程序运行时检查和修改变量的值,单步执行代码,设置断点,以及查看程序的状态。可以比较偏激的说如果是关注于linux下的开发和研究,基本上离不开gdb调试的。2.在各平台下的gdb下载......
  • C++开发调试工具:GDB调试,windebug调试,adb调试
    我们在C++开发过程中时常避免不了要调试追踪,一下介绍最主流的三种调试工具:一.GDB调试1.coredump文件:coredump文件是程序异常时系统产生的错误日志文件,即核心转储文件;编译一个debug程序,必须是debug版本,否则无法产生coredump文件;编译命令:g++test.cpp-omytest-g,必须要......
  • 自定义Python工具箱实现mdb转出为shp或gdb格式----终章(工具免费)
    一、内容提示        前边几篇文章,介绍了mdb地理数据库结构解析、mdb转出为shp示例,以及mdb转为gdb的几种技术路线探讨,并未对mdb转出为shp、或gdb格式进行完整实现。        为了方便使用,并支持更加复杂的使用场景,小编已将前边几篇文章中的内容进行集成,将mdb......
  • 解决gdb 在64位机器上显示sizeof(long)=4的问题
    问题:gdb在64位机器上显示sizeof(long)=4大家都知道在64位机器上,c语言的long类型占用8个字节,但今天因验证一个功能,启动gdb,执行了printsizeof(long)返回值为4,让人大为震惊,是服务器环境有问题吗?赶快编写一个最简单的c程序1#include<stdio.h>23intmain(void){4print......
  • Linux-gdb
    目录1.-g生成含有debug信息的可执行文件2.gdb开始以及gdb中的常用执行指令3.断点的本质用法4.快速跳出函数体5.其他1.-g生成含有debug信息的可执行文件2.gdb开始以及gdb中的常用执行指令3.断点的本质用法断点的本质是帮助我们缩小出问题的范围比如,......
  • 嵌入式GDB调试Linux C程序或交叉编译(开发板)
    目录简介开始使用电脑端准备安装gdb1.编译带调试信息的可执行文件2.进入gdb3.启动程序常用命令设置断点:进入函数打印数值结束常用命令l回车键bCSnpq参考文档1、安装gdb。2、gdb的简单使用。(1)在可执行文件中加入源码信息(2)进入gdb(3)gdb调试常用命令[1]start[2]单步执行(n......
  • gdb编译报错 #error "Please include config.h
    gdb编译报错,错误提示“/gnulib/import/unistd.h:135:3:error:#error"Pleaseincludeconfig.h”解决办法如下:修改源码路径下的gdb/nat/amd64-linux-siginfo.c文件,将Include "gdbsupport/common-defs.h"移动到#include<signal.h>之前,再保存重新编译;修改前: 修改后: ......