前言
(1)此系列文章是跟着汪辰老师的RISC-V课程所记录的学习笔记。 (2)该课程相关代码gitee链接;
start.S
(1)qemu模拟的板子有8个内核,为了让我们跟方便理解,汪辰老师只使用了一个内核。
(2)如下是进行判断,当前执行任务的是否是第一个内核。如果是的,往下执行,如果不是第一个内核,跳转到park任务中。
csrr t0, mhartid # read current hart id
mv tp, t0 # keep CPU's hartid in its tp for later usage.
bnez t0, park # if we're not on the hart 0
(3)这里的
wfi
是让内核进入低功耗状态。如果没有这条语句,其他7个内核不进行任何操作,只是空转没必要,因此直接让他们进入休眠即可。这样省电。
park:
wfi
j park
(4)这里主要是进行一些堆栈操作,最后的
j
,是跳转到c程序中。start_kernel
你可以修改为任意名字,只要的c程序入口函数也修改为对应的函数名即可。
slli t0, t0, 10 # shift left the hart id by 1024
la sp, stacks + STACK_SIZE # set the initial stack pointer
# to the end of the first stack space
add sp, sp, t0 # move the current hart stack pointer
# to its place in the stack space
j start_kernel # hart 0 jump to c
kernel.c
(1)这里实际上就是在串口上打印一个Hello, RVOS!,之后进入空转状态。
extern void uart_init(void);
extern void uart_puts(char *s);
void start_kernel(void)
{
uart_init();
uart_puts("Hello, RVOS!\n");
while (1) {}; // stop here!
}