type
Post
status
Published
slug
2023/07/22/xv6-_entry-stack-setting-assembly-code-parsing
summary
tags
Arch
Linux
category
Linux
icon
password
new update day
Property
Oct 22, 2023 01:31 PM
created days
Last edited time
Oct 22, 2023 01:31 PM

汇编代码

_entry: # set up a stack for C. # stack0 is declared in start.c, # with a 4096-byte stack per CPU. # sp = stack0 + (hartid * 4096) la sp, stack0 li a0, 1024*4 csrr a1, mhartid addi a1, a1, 1 mul a0, a0, a1 add sp, sp, a0 # jump to start() in start.c call start

详解

这段代码用于为C语言设置一个堆栈(stack)。它假设在start.c文件中声明了一个名为stack0的堆栈,每个CPU的堆栈大小为4096字节。
以下是代码的详细解释:
  1. la sp, stack0:这条指令将stack0的地址加载到堆栈指针寄存器sp中。堆栈指针是一个寄存器,用于跟踪堆栈的顶部。
  1. li a0, 1024*4:这条指令将立即数1024*4(4096)加载到寄存器a0中。这个值表示每个CPU的堆栈大小。
  1. csrr a1, mhartid:这条指令将硬件线程ID(hartid)读取到寄存器a1中。hartid标识代码正在运行的特定CPU核心。
  1. addi a1, a1, 1:这条指令将寄存器a1中的值增加1。这是为了计算每个CPU堆栈的正确偏移量。
  1. mul a0, a0, a1:这条指令将寄存器a0中的值(4096)乘以寄存器a1中的值(hartid + 1)。结果存回寄存器a0中。
  1. add sp, sp, a0:这条指令将寄存器a0中的值加到堆栈指针sp上。这实际上将堆栈指针移动到当前CPU堆栈的正确位置。
  1. call start:这条指令调用start.c文件中的start()函数。call指令将返回地址压入堆栈,并跳转到指定的函数。
总体而言,这段代码通过根据CPU的hartid和每个堆栈的大小计算正确的偏移量,为每个CPU核心设置堆栈。然后,它跳转到start.c文件中的start()函数开始执行。
 
 
欢迎加入喵星计算机技术研究院,原创技术文章第一时间推送。
notion image
 
[MIT 6.s081] Lab: Copy-on-Write Fork for xv6 实验记录Linux 0.11 中的 put_page 函数