Gdb CPU中的寄存器是如何设计的

Gdb CPU中的寄存器是如何设计的,gdb,cpu-registers,Gdb,Cpu Registers,我知道有一些寄存器属于一个进程 我有一些关于它们的基本问题: 当我使用gdb调试某个项目时,我可以看到函数的参数被推送到一些寄存器中。那么每个函数都有自己的参数寄存器吗?或者同一进程中的所有函数是否为其参数共享相同的寄存器 这些寄存器是否在线程之间共享?进程之间?如果没有,当CPU进行上下文切换时,其他寄存器中的值是如何存储的?您似乎对CPU的工作方式缺乏基本了解。阅读帕特森和轩尼诗的《计算机体系结构》一书,或观看本·厄特的《从头开始构建一台8位计算机》可能会有所帮助 我可以看到函数的参数被放入

我知道有一些寄存器属于一个进程

我有一些关于它们的基本问题:

当我使用
gdb
调试某个项目时,我可以看到函数的参数被推送到一些寄存器中。那么每个函数都有自己的参数寄存器吗?或者同一进程中的所有函数是否为其参数共享相同的寄存器


这些寄存器是否在线程之间共享?进程之间?如果没有,当CPU进行上下文切换时,其他寄存器中的值是如何存储的?

您似乎对CPU的工作方式缺乏基本了解。阅读帕特森和轩尼诗的《计算机体系结构》一书,或观看本·厄特的《从头开始构建一台8位计算机》可能会有所帮助

我可以看到函数的参数被放入一些寄存器中

有许多不同的呼叫约定。将参数加载到特定寄存器(不能将任何内容推入寄存器)或将参数推入堆栈是常见的

那么每个函数都有自己的寄存器吗

不可以。处理器有一组固定的寄存器。如果函数使用例如
$RDI
作为其第一个参数(调用约定
x86_64
并希望调用其他函数,那么它可能需要在重写之前将
$RDI
的值临时保存在内存中,以便将参数传递给其他函数

或者同一进程中的所有函数是否为其参数共享相同的寄存器

所有进程中的所有函数共享同一组CPU寄存器(无论寄存器用于什么用途)

这些寄存器是否在线程之间共享

寄存器是共享的,但每个线程都有自己的寄存器值。在线程之间切换时,操作系统(或在某些情况下线程库)保存并恢复值

进程之间

与线程相同

如果没有,当CPU进行上下文切换时,如何存储其他寄存器中的值


CPU不进行上下文切换(CPU没有上下文的概念),操作系统通过将当前值集存储到内存中的一个位置并从另一个位置加载不同的值集来进行切换。

您似乎对CPU的工作方式缺乏基本了解。阅读帕特森和轩尼诗的《计算机体系结构》一书,或观看本·厄特的《从头开始构建一台8位计算机》可能会有所帮助

我可以看到函数的参数被放入一些寄存器中

有许多不同的呼叫约定。将参数加载到特定寄存器(不能将任何内容推入寄存器)或将参数推入堆栈是常见的

那么每个函数都有自己的寄存器吗

不可以。处理器有一组固定的寄存器。如果函数使用例如
$RDI
作为其第一个参数(调用约定
x86_64
并希望调用其他函数,那么它可能需要在重写之前将
$RDI
的值临时保存在内存中,以便将参数传递给其他函数

或者同一进程中的所有函数是否为其参数共享相同的寄存器

所有进程中的所有函数共享同一组CPU寄存器(无论寄存器用于什么用途)

这些寄存器是否在线程之间共享

寄存器是共享的,但每个线程都有自己的寄存器值。在线程之间切换时,操作系统(或在某些情况下线程库)保存并恢复值

进程之间

与线程相同

如果没有,当CPU进行上下文切换时,如何存储其他寄存器中的值

CPU不会进行上下文切换(CPU没有上下文的概念),操作系统会将当前的一组值存储到内存中的一个位置,然后从另一个位置加载另一组值