这种固件类型假设下一个启动阶段(例如 bootloader 或操作系统内核)的入口地址是固定的,但不直接包含下一阶段的二进制代码,只是告诉OpenSBI执行完之后调到哪里执行,目前我们使用qemu采用的就是这种方式 Firmware with Payload (FW_PAYLOAD):这种固件类型直接包含了下一阶段的二进制代码,并且,当上一个启动阶段不传递设备树...
等待编译完成,就可以开始运行了,buildroot编译过程中会下载kernel代码,很慢,这个时候可以修改buildroot目录下的.config文件中kernel的下载链接为中科大镜像源,然后再编译,下载就会很快 06—qemu运行opensbi+kernel+rootfs 新建一个run.sh文件,写入如下内容: qemu-9.1.1/build/qemu-system-riscv64 -M virt -smp 4 -m...
opensbi下的riscv64裸机编程2(中断与异常) 1.本文说明 2.riscv特权模式下的异常 2.1 CSPs 2.2 异常开关的寄存器 2.3 与中断相关的指令 3.中断测试 3.1 设置中断向量表 3.2 开启中断设置 3.3 初始化timer 3.4 开启中断 3.5 中断处理 4.测试及校验 5.总结 1.本文说明 任何时候,中断和异常的产生都是十分值得...
对于arm64来说,系统上电后启动会处于EL3 secure world ,所以对于arm64来说,一般都会使用ARM Trusted firmware (TF-A) 在normal world EL2 与 secure EL3 进行切换。 而对于risc-v来说,系统上电启动后会在M-Mode,而risc-v目前是没有Hypervisor这一层的概念的,所以目前采用的是opensbi。 2.2 risc-v的启动顺序...
RISC-V下SPL->OpenSBI-OPTEE-Linux启动流程如下: M-Mode:u-boot-spl加载u-boot.itb文件,启动OpenSBI。 M-Mode->S-Mode:OpenSBI通过mret跳转到OPTEE执行,启动TOS。 S-Mode->M-Mode:OPTEE启动完后,通过ecall返回到执行OpenSBI。 M-Mode->S-Mode:OpenSBI通过mre启动u-boot。
OpenSBI是运行在DRAM上的,所以我们需要加载符号表到0x80000000地址 启动gdb后,在gdb命令行执行: add-symbol-file fw_jump.elf 0x80000000 然后输入y,如下图: 在执行如下命令连接qemu中的gdb server: target remote:1234 如下图: 之后就可以设置断点进行调试了,如下图: ...
opensbi下的riscv64裸机系列编程1(串口输出) 1.说明 2.opensbi的编译 3.基本环境的准备 3.1 准备qemu 3.2 准备交叉编译工具链 4.工程完善 5.封装的sbi接口 6.程序运行 7.printf函数的实现 8.小结 1.说明 前面的文章中已经提到了opensbi的作用不仅仅是一个引导作用,还提供了M模式转换到S模式的实现,同时在S-...
1 SPL到OpenSBI spl启动流程如下: 从外设加载镜像到DDR中。 解析镜像格式,比如FIT。 解析FIT中OpenSBI镜像地址和入口地址;uboot镜像地址,并附着到fdt中;解析获取fdt地址。 准备好HART ID、fdt地址、struct fw_dynamic_info结构体三个参数后,跳转到OpenSBI镜像开始执行。
正常流程init/main.c中start_kernel入口,要到console_init之后才能真正打印,前面的打印都是缓存在printk的ringbuffer中的。如果在console_init前就异常了,此时就看不到打印信息,为了调试console_init前的状态,需要能更早的打印。内核提供了一种early打印的方式,尤其是riscv平台我们可以直接ecall调用opensbi的打印,这样...
opensbi下的riscv64裸机编程2(中断与异常) 1.本文说明 2.riscv特权模式下的异常 2.1 CSPs 2.2 异常开关的寄存器 2.3 与中断相关的指令 3.中断测试 3.1 设置中断向量表 3.2 开启中断设置 3.3 初始化timer 3.4 开启中断 3.5 中断处理 4.测试及校验