点评
- 每个hart都有一个自己的sp,但是,多个hart 公用一块内存,每个hart的sp 存储的内容是不一样的。关键的代码是 slli t0, t0, 10 这一行。
比如,下面的程序,hart0的栈顶是 stacks+0, hart1 是stacks+1024,hart2 是stacks+2048,... - 内存对齐问题
- 关于hart 问题
- 栈的对齐方式一般是16 字节, 分配内存的单位,一般都是字节的
.equ STACK_SIZE, 1024 # 每个 hart 的栈大小为 1024 字节
.equ MAXNUM_CPU, 8 # 假设最多有 8 个 harts
.section .bss
.balign 16 # 确保栈空间起始地址16字节对齐
stacks:
.skip STACK_SIZE * MAXNUM_CPU # 为所有 harts 分配栈空间
.section .text
.global _start
_start:
csrr t0, mhartid # 读取当前 hart ID
mv tp, t0 # 将 hart ID 保存到 tp 寄存器中以供后续使用
bnez t0, park # 如果不是 hart 0,则跳转到 park 标签
# 设置栈指针,栈从底部向顶部增长,所以我们将栈指针设置到栈空间的末端
slli t0, t0, 10 # 将 hart ID 左移 10 位,相当于乘以 1024
la sp, stacks # 加载栈空间的基地址
add sp, sp, t0 # 将栈指针设置为基地址加上偏移量
add sp, sp, STACK_SIZE # 将栈指针设置到栈空间的末端
j start_kernel # 跳转到c语言中
park:
wfi
j park
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。