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字节。以下是代码的详细解释:
la sp, stack0
:这条指令将stack0
的地址加载到堆栈指针寄存器sp
中。堆栈指针是一个寄存器,用于跟踪堆栈的顶部。
li a0, 1024*4
:这条指令将立即数1024*4(4096)加载到寄存器a0
中。这个值表示每个CPU的堆栈大小。
csrr a1, mhartid
:这条指令将硬件线程ID(hartid)读取到寄存器a1
中。hartid标识代码正在运行的特定CPU核心。
addi a1, a1, 1
:这条指令将寄存器a1
中的值增加1。这是为了计算每个CPU堆栈的正确偏移量。
mul a0, a0, a1
:这条指令将寄存器a0
中的值(4096)乘以寄存器a1
中的值(hartid + 1)。结果存回寄存器a0
中。
add sp, sp, a0
:这条指令将寄存器a0
中的值加到堆栈指针sp
上。这实际上将堆栈指针移动到当前CPU堆栈的正确位置。
call start
:这条指令调用start.c
文件中的start()
函数。call
指令将返回地址压入堆栈,并跳转到指定的函数。
总体而言,这段代码通过根据CPU的hartid和每个堆栈的大小计算正确的偏移量,为每个CPU核心设置堆栈。然后,它跳转到
start.c
文件中的start()
函数开始执行。 欢迎加入“喵星计算机技术研究院”,原创技术文章第一时间推送。
- 作者:tangcuyu
- 链接:https://expoli.tech/articles/2023/07/22/xv6-_entry-stack-setting-assembly-code-parsing
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章