Opensbi初始化分析:设备初始化-warmboot

本文深入分析了OpenSBI中的warmboot初始化过程,包括sbi_init函数、init_warmboot函数及其职责,如 hart 初始化、中断控制器、TLB、平台设置等。此外,还探讨了coolboot与warmboot的区别,特别是wait_for_coldboot函数的作用以及冷启动特有的初始化工作,如domain、scratch初始化、console和系统调用初始化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设备初始化

紧接_start_warm,接下来将正式进入C阶段,随机选择满足条件的hart执行clodboot,其余的hart执行warmboot,上篇博文已经详细分析了coolboot的详细过程了,下面就着重对比coolboot分析下warmboot的具体行为

sbi_init函数

这个函数传入的参数为sbi_scratch结构体,也就是在前面的汇编阶段初始化的scratch空间,CSR_MSCRATCH存储着起始地址。

  • 首先需要判断启动模式
  • 随机选择满足条件的hart执行clodboot,其余的hart执行warmboot
    注意:Opensbi中的coolboot和warmboot不是传统意义上的冷启动和热启动,而是完全初始化和部分初始化的意思
/**
 * Initialize OpenSBI library for current HART and jump to next
 * booting stage.
 *
 * The function expects following:
 * 1. The 'mscratch' CSR is pointing to sbi_scratch of current HART
 * 2. Stack pointer (SP) is setup for current HART
 * 3. Interrupts are disabled in MSTATUS CSR
 * 4. All interrupts are disabled in MIE CSR
 *
 * @param scratch pointer to sbi_scratch of current HART
 */
void __noreturn sbi_init(struct sbi_scratch *scratch)
{
   
   
	bool next_mode_supported	= FALSE;
	bool coldboot			= FALSE;
	u32 hartid			= current_hartid();
	const struct sbi_platform *plat = sbi_platform_ptr(scratch);

	if ((SBI_HARTMASK_MAX_BITS <= hartid) ||
	    sbi_platform_hart_invalid(plat, hartid))
		sbi_hart_hang();

	switch (scratch->next_mode) {
   
   
	case PRV_M:
		next_mode_supported = TRUE;
		break;
	case PRV_S:
		if (misa_extension('S'))
			next_mode_supported = TRUE;
		break;
	case PRV_U:
		if (misa_extension('U'))
			next_mode_supported = TRUE;
		break;
	default:
		sbi_hart_hang();
	}

	/*
	 * Only the HART supporting privilege mode specified in the
	 * scratch-&
OpenSBI启动流程可以简述如下: 1. 在OpenSBI启动时,第一条执行的指令是_start函数,该函数位于fw_start.S文件中。 2. 在fw_start.S文件中,首先会进行一些初始化工作,然后跳转到main函数进行主要的启动流程。 3. 在main函数中,会首先获取每个HART的scratch结构体信息。 4. Scratch结构体是OpenSBI对每个HART的私有信息的表示,包含了一些重要的字段用于启动过程。 5. 其中,fw_start字段表示固件与OpenSBI库链接的起始地址,fw_size字段表示固件的大小。 6. next_addr字段表示下一个引导阶段的地址,next_arg1字段表示下一个引导阶段的参数。 7. next_mode字段表示下一个引导阶段的特权模式。 8. warmboot_addr字段表示用于热重启的入口地址。 9. platform_addr字段表示sbi_platform的地址,用于与硬件平台相关的初始化。 10. hartid_to_scratch字段表示HART ID到scratch结构体的转换函数的地址。 11. trap_exit字段表示陷阱退出函数的地址。 12. tmp0字段是一个临时存储字段。 13. options字段包含了OpenSBI库的选项信息。 14. 在启动流程中,每个HART都会按顺序执行操作,直到所有HART都完成了boot阶段的操作。 15. 在boot阶段的最后,会设置boot阶段表示为BOOT_STATUS_BOOT_HART_DONE标志,表示该HART已完成boot阶段,其他HART也要执行10以后的步骤。 综上所述,OpenSBI启动流程包括了_start函数的执行、初始化工作、获取scratch结构体信息、设置各字段的值以及标志位的设置等步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值