Assembly Xv6上下文开关

Assembly Xv6上下文开关,assembly,x86,xv6,Assembly,X86,Xv6,此代码是为xv6中的上下文切换提供的代码。虽然我能够理解整个代码将寄存器从旧上下文保存到PCB上,但我无法理解每一行是如何工作的 void swtch(struct context **old, struct context *new); # # Save current register context in old # and then load register context from new. .globl swtch swtch: # Save old registers movl

此代码是为xv6中的上下文切换提供的代码。虽然我能够理解整个代码将寄存器从旧上下文保存到PCB上,但我无法理解每一行是如何工作的

void swtch(struct context **old, struct context *new);
#
# Save current register context in old
# and then load register context from new.
.globl swtch
swtch:
# Save old registers
movl 4(%esp), %eax # put old ptr into eax
popl 0(%eax) # save the old IP
movl %esp, 4(%eax) # and stack
movl %ebx, 8(%eax) # and other registers
movl %ecx, 12(%eax)
movl %edx, 16(%eax)
movl %esi, 20(%eax)
movl %edi, 24(%eax)
movl %ebp, 28(%eax)

# Load new registers
movl 4(%esp), %eax #put new ptr into eax
movl 28(%eax), %ebp #restore other registers
movl 24(%eax), %edi
movl 20(%eax), %esi
movl 16(%eax), %edx
movl 12(%eax), %ecx
movl 8(%eax), %ebx
movl 4(%eax), %esp #stack is switched here
pushl 0(%eax) #return addr put in place
ret #finally return into new ctxt

有人能帮我解决CPU寄存器如何保存到PCB上的问题吗?

问一个更具体的问题,哪个部分不清楚?这只是一系列移动…当函数启动时,CALL指令将堆栈上的返回地址分配为0(ESP)。第一个参数位于4(ESP)(旧上下文)和8(ESP)新上下文<代码>movl4(%esp),%eax将旧的上下文指针获取到eax中。
popl
获取调用所推送的返回指令指针并保存它(这将在过程中向ESP添加4)。所有当前寄存器都通过EAX指针保存到旧上下文中。因为当我们加载新寄存器时,POP向ESP添加了4,所以旧上下文指针现在位于堆栈顶部的0(ESP)处,新上下文指针位于4(ESP)处。然后,使用4(ESP)处的指针(新上下文)加载所有具有新上下文的寄存器。
pushl0(%eax)
将新的指令指针放在堆栈上,以便
ret
将返回堆栈。我更仔细地研究了这一点,我认为这段代码中有一个bug。你从哪里得到这个特定代码的?我注意到
swtch
传递一个指向旧上下文的指针。此代码中似乎缺少取消引用。在
movl4(%esp),%eax
之后,我希望看到类似
movl(%eax),%eax
的东西。是的,我刚刚意识到第一行有问题。它应该是*旧的,而不是**旧的。我是从《操作系统:三件容易》教科书上得到的。问一个更具体的问题,哪一部分不清楚?这只是一系列移动…当函数启动时,CALL指令将堆栈上的返回地址分配为0(ESP)。第一个参数位于4(ESP)(旧上下文)和8(ESP)新上下文<代码>movl4(%esp),%eax将旧的上下文指针获取到eax中。
popl
获取调用所推送的返回指令指针并保存它(这将在过程中向ESP添加4)。所有当前寄存器都通过EAX指针保存到旧上下文中。因为当我们加载新寄存器时,POP向ESP添加了4,所以旧上下文指针现在位于堆栈顶部的0(ESP)处,新上下文指针位于4(ESP)处。然后,使用4(ESP)处的指针(新上下文)加载所有具有新上下文的寄存器。
pushl0(%eax)
将新的指令指针放在堆栈上,以便
ret
将返回堆栈。我更仔细地研究了这一点,我认为这段代码中有一个bug。你从哪里得到这个特定代码的?我注意到
swtch
传递一个指向旧上下文的指针。此代码中似乎缺少取消引用。在
movl4(%esp),%eax
之后,我希望看到类似
movl(%eax),%eax
的东西。是的,我刚刚意识到第一行有问题。它应该是*旧的,而不是**旧的。我从《操作系统:三件容易》教科书上得到的。