gpt4 book ai didi

c - 如何使用在同一 CPU 上运行的调试器读取 CPU 寄存器?

转载 作者:太空狗 更新时间:2023-10-29 16:46:33 26 4
gpt4 key购买 nike

在学习汇编时,我按以下方式使用 GDB:

gdb ./a.out (a is a compiled C script that only prints hello world)
break main
run
info registers

为什么我自己用同一个CPU打印寄存器,却能看到我程序使用的寄存器? GDB(或操作系统)的使用不应该覆盖寄存器并且只显示被覆盖的寄存器吗?我能想到的唯一答案是我的 CPU 是双核的,其中一个内核正在使用,另一个保留给程序。

最佳答案

操作系统为每个执行线程维护寄存器的状态。当您检查 gdb 中的寄存器时,调试器实际上是在要求操作系统从保存的状态中读取寄存器值。您的程序在那个时间点没有运行,是调试器。

假设您的系统上没有其他进程。以下是所发生情况的简化 View :

  1. 调试器启动并获取 cpu
  2. 调试器要求操作系统加载你的程序
  3. 调试器要求操作系统放置断点
  4. 调试器要求操作系统开始执行您的程序。操作系统保存 gdb 寄存器状态并将控制权转移给您的程序。
  5. 你的程序遇到了断点。操作系统取得控制权,保存程序的寄存器状态,重新加载 gdb 寄存器并将 cpu 返回给 gdb。
  6. 调试器要求操作系统从保存的状态中读取程序的寄存器。

请注意,此机制是多任务操作系统的正常职责的一部分,并非特定于调试。当 OS 调度程序决定应该执行一个不同的程序时,它会保存当前状态并加载另一个。这称为上下文切换,它可能每秒发生多次,给人一种程序同时执行的错觉,即使您只有一个 cpu 内核也是如此。

关于c - 如何使用在同一 CPU 上运行的调试器读取 CPU 寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40965575/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com