前言

(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!
}

uart.c

宏定义