我知道有些寄存器属于某个进程。
我对它们有一些基本问题:
当我使用gdb
调试某些项目时,可以看到函数的参数已放入某些寄存器中。那么每个函数的参数都有自己的寄存器吗?还是同一进程中的所有函数为其参数共享相同的寄存器?
这些寄存器是否在线程之间共享?进程之间?如果没有,那么当CPU进行上下文切换时,如何存储其他寄存器中的值?
答案 0 :(得分:1)
您似乎缺乏基本的了解或CPU的工作方式。阅读一本计算机体系结构书籍,例如Patterson和Hennessy的“ Computer Organization and Design: the Hardware/Software Interface”,或观看Ben Eater的“从头开始构建8位计算机” video series可能会有帮助。
我看到函数的参数被压入某些寄存器中。
有许多不同的调用约定。 将参数加载到特定的寄存器中(不能将任何东西推到寄存器中),或者将参数推入堆栈中是很常见的。
每个函数也都有自己的寄存器
不。处理器具有一组固定的寄存器。如果一个函数使用例如$RDI
作为其第一个参数(调用约定,x86_64
)并想要调用其他函数,那么它可能需要在覆盖之前暂时将$RDI
的值保存在内存中,以便将参数传递给另一个函数。
还是同一进程中的所有函数为其参数共享相同的寄存器?
所有进程中的所有功能共享一组相同的CPU寄存器(无论这些寄存器用于什么目的)。
这些寄存器是否在线程之间共享?
寄存器是共享的,但是每个线程都有自己的值寄存器。在线程之间切换时,操作系统(或在某些情况下为线程库)会保存和恢复值。
在进程之间?
与线程相同。
如果没有,那么当CPU进行上下文切换时,如何存储其他寄存器中的值?
CPU不会进行上下文切换(CPU没有上下文的概念),操作系统会通过将当前值集存储到内存中的一个位置并从另一个位置加载另一个值来进行操作。