点评

  1. 每个hart都有一个自己的sp,但是,多个hart 公用一块内存,每个hart的sp 存储的内容是不一样的。关键的代码是 slli t0, t0, 10 这一行。
    比如,下面的程序,hart0的栈顶是 stacks+0, hart1 是stacks+1024,hart2 是stacks+2048,...
  2. 内存对齐问题
  3. 关于hart 问题
  4. 栈的对齐方式一般是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

putao
8 声望3 粉丝

推动世界向前发展,改善民生。