我知道cpu寄存器用于快速访问。但是,有人能给我一个存储数据内容的例子吗?为什么这些数据如此重要并且必须在上下文切换期间由操作系统存储?
答案 0 :(得分:1)
我会将寄存器分为两组:
系统寄存器不随进程上下文而改变。传统上,第二组寄存器包括:
您在问题的调用中看到对#2最感兴趣。为简单起见,我将使用VAX处理器作为工作示例(英特尔Kludge-On-A-Chip过于复杂)。
VAX有16个32位寄存器(R0-R15)。其中一些寄存器(R12-R15)有特殊用途:
PC =程序计数器指向下一条要执行的指令 SP =堆栈指针指向当前模式的堆栈底部。 AP = Argument指针指向函数的参数 FP = Frame指针用于在函数调用完成后恢复堆栈。
使R0-R11成为一般用途。
R6-R11可供程序员随意使用。 程序员可以使用R0-R5,但有些指令会改变它们的值。
寄存器是32位。然后他们可以存储:
您可以执行以下操作:
ADDL3 R0, R1, R2 ; Add contents of R0 and R1 and store the result in R2
ADDF3 R0, R1, R2
在第一种情况下,处理器将R0和R1的内容视为32位有符号整数。在第二种情况下,它将R0和R1的内容视为32位浮点值。
寄存器内容的解释取决于正在执行的指令。因此,上面的两条指令可能会在R2中存储不同的值,即使它们在R0和R1中具有相同的值。
可以组合更大的数据类型,相邻的寄存器。
ADDD3 R0, R2, R4
将R0 / R1的内容添加到R2 / R3的内容中,并将结果存储在R4 / R5中,将所有寄存器对的内容视为64位浮点值。
你甚至可以做
ADDH3 R0, R4, R8
将R0 / R1 / R2 / R3的内容添加到R4 / R5 / R6 / R7的内容中,并将结果存储在R8 / R9 / R10 / R11中,将所有寄存器四边形的内容视为128比特浮点值。
VAX具有特性和复杂的匹配指令,使用R0-R5用于特殊目的(例如循环计数器)。这些是可以中断的长执行指令。使用寄存器来维持指令的状态允许在重新启动进程时在中途重新启动指令。
程序员使用R0-R5。只要您不使用破坏它们的指令,就没有问题。
按惯例,R0和R1用于函数返回值。
所以这些是你用寄存器做的事情。
答案 1 :(得分:0)
它们不适合快速访问。它们是cpu的核心,每个操作都必须在它们上面完成。例如,Cpu可以在将它们从内存移动到寄存器后添加两个数字。