当前位置: 首页 > news >正文

学历教育网站建设网站优化包括哪些内容

学历教育网站建设,网站优化包括哪些内容,外贸生意如何做,专业简历制作网站有哪些文章目录 参考日志编译框架目标fip 启动流程fip文件组成BL2程序 总结思考备注 参考 参考1. How does FSBL load the FreeRTOS on the small core and execute it?参考2. Duo now supports big and little cores?Come and play!Milk-V Duo, start#xff01;参考3. 使用uboo… 文章目录 参考日志编译框架目标fip 启动流程fip文件组成BL2程序 总结思考备注 参考 参考1. How does FSBL load the FreeRTOS on the small core and execute it?参考2. Duo now supports big and little cores?Come and play!Milk-V Duo, start参考3. 使用uboot引导自己的操作系统参考4. 安全启动介绍 日志 FSBL Jb2829:g362832ac6-dirty:2024-04-02T13:31:1100:00 # 版本信息 st_on_reason40f0003 st_off_reason800e0003 P2S/0x1000/0xc00a400. SD/0x9400/0x1000/0x1000/0.P2E. DPS/0xa400/0x2000. SD/0xa400/0x2000/0x2000/0.DPE. DDR init. # DDR 初始化 ddr_param[0]0x78075562. pkg_type1 D2_4_1 DDR3-4G-BGA Data rate1866. DDR BIST PASS PLLS/OD. C2S/0xc400/0x9fe00000/0x3600.2RET.:00/0x3600/0x3600/0.RSC.[M1S./208x2f8a0000]/P0rxe8 0s0y0s0t0e0m0 /i0nxi1tb 0d0o0n.eRT: [1.289126]CVIRTOS Build Date:Apr 2 2024 (Time :13:31:11) # FreeRTOS 启动 RT: [1.295040]Post system init done RT: [1.298355]create cvi task RT: [1.301172][cvi_spinlock_init] succeess RT: [1.305076]prvCmdQuRunTask run SD/0xfa00/0x1b000/0x1b000/0.ME. L2/0x2aa00. SD/0x2aa00/0x200/0x200/0.L2/0x414d3342/0xcafedbb7/0x80200000/0x37400/0x37400 COMP/1. SD/0x2aa00/0x37400/0x37400/0.DCP/0x80200020/0x1000000/0x81900020/0x37400/1. DCP/0x73c7a/0. Loader_2nd loaded. # 第二阶段Opensbi Switch RTC mode to xtal32k Jump to monitor at 0x80000000. OPENSBI: next_addr0x80200020 arg10x80080000 OpenSBI v0.9可知 FSBL Jb2829...FSBL启动打印版本信息DDR初始化完成后紧跟RTOS任务初始化打印中间无引导小核的工作打印 所以可以先对FSBL有个大致认知再确认RTOS启动过程。 编译框架 # fsbl/Makefile.DEFAULT_GOAL : all # 如果没有指定.DEFAULT_GOALmake会执行第一个在Makefile中定义的目标。 MAKEOVERRIDES # 不传递任何父make的变量给子make保持子make实例的独立性ARCH ? # make 传参可带ARCHxxx 指定架构ifneq ($(origin CROSS_COMPILE),command line)ifeq ($(ARCH),riscv) # 如果不是命令行 make ARCHxxx 形式指明由RiscV核心来完成引导启动工作CROSS_COMPILE : ${CROSS_COMPILE_GLIBC_RISCV64}BOOT_CPU ? riscv ... ifeq (${CHIP_ARCH},) # 必带参数CHIP_ARCH$(error CHIP_ARCH is undefined) ... ifeq (${CROSS_COMPILE},) # 必带参数CROSS_COMPILE$(error CROSS_COMPILE is undefined) ... HOSTCC : gcc export HOSTCCCC : ${CROSS_COMPILE}gcc ... # 工具链配置 include ${MAKE_HELPERS_DIRECTORY}build_macros.mk # Makefile 宏定义如assert_boolean、add_define_val include ${MAKE_HELPERS_DIRECTORY}plat_helpers.mk # Make 辅助实现 ... include ${PLAT_MAKEFILE_FULL} # 在plat_makefiles.mk中定义指向plat/${CHIP_ARCH}/platform.mk文件 # fsbl/plat/sg200x/platform.mk工作 # - 定义哪些源码文件加入编辑链接 # - 定义链接脚本文件all: fip bl2 blmacros # 第一目标all依赖于fip、bl2、blmaacros ... include ${MAKE_HELPERS_DIRECTORY}fip.mk # 目标fip $(eval $(call MAKE_BL,2)) # 目标bl2 $(eval $(call MAKE_BL,macros)) # 目标blmacros目标fip 目标fip有如下涉及RTOS的内容 # fsbl/make_helpers/fip.mk ... fip: fip-all # 目标fip 依赖于fip-all ... fip-all: fip-dep$(print_target)${Q}echo [GEN] fip.bin${Q}. ${BUILD_PLAT}/blmacros.env \${FIPTOOL} -v genfip \${BUILD_PLAT}/fip.bin \${BUILD_PLAT}/fip.bin \--MONITOR_RUNADDR$${MONITOR_RUNADDR} \--BLCP_2ND_RUNADDR$${BLCP_2ND_RUNADDR} \--CHIP_CONF${CHIP_CONF_PATH} \--NOR_INFO${NOR_INFO} \--NAND_INFO${NAND_INFO}\--BL2${BUILD_PLAT}/bl2.bin \--BLCP_IMG_RUNADDR${BLCP_IMG_RUNADDR} \--BLCP_PARAM_LOADADDR${BLCP_PARAM_LOADADDR} \--BLCP${BLCP_PATH} \--DDR_PARAM${DDR_PARAM_TEST_PATH} \--BLCP_2ND${BLCP_2ND_PATH} \--MONITOR${MONITOR_PATH} \--LOADER_2ND${LOADER_2ND_PATH} \--compress${FIP_COMPRESS}... 由实际编译过程打印有(为简洁将绝对路径中的SDK顶层目录替换为${SDK_TOP}) . ${SDK_TOP}/fsbl/build/cv1813h_milkv_duos_sd/blmacros.env \ ./plat/cv181x/fiptool.py -v genfip \${SDK_TOP}/fsbl/build/cv1813h_milkv_duos_sd/fip.bin \--MONITOR_RUNADDR${MONITOR_RUNADDR} \--BLCP_2ND_RUNADDR${BLCP_2ND_RUNADDR} \--CHIP_CONF${SDK_TOP}/fsbl/build/cv1813h_milkv_duos_sd/chip_conf.bin \--NOR_INFOFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF \--NAND_INFO00000000\--BL2${SDK_TOP}/fsbl/build/cv1813h_milkv_duos_sd/bl2.bin \--BLCP_IMG_RUNADDR0x05200200 \--BLCP_PARAM_LOADADDR0 \--BLCPtest/empty.bin \--DDR_PARAMtest/sophon/ddr_param.bin \--BLCP_2ND${SDK_TOP}/freertos/cvitek/install/bin/cvirtos.bin \--MONITOR../opensbi/build/platform/generic/firmware/fw_dynamic.bin \--LOADER_2ND${SDK_TOP}/u-boot-2021.10/build/cv1813h_milkv_duos_sd/u-boot-raw.bin \--compresslzma 截取其中的关键信息 --BLCP_2ND${SDK_TOP}/freertos/cvitek/install/bin/cvirtos.bin \RTOS定义为BLCP_2ND 其运行地址BLCP_2ND在源头在板型目录下的memmap.py文件中定义如文件build/boards/cv181x/cv1813h_milkv_duos_sd/memmap.py class MemoryMap:...DRAM_BASE 0x80000000DRAM_SIZE 512 * SIZE_1M# # C906L FreeRTOS# FREERTOS_SIZE 2 * SIZE_1M# FreeRTOS is at the end of DRAMFREERTOS_ADDR DRAM_BASE DRAM_SIZE - FREERTOS_SIZEFSBL_C906L_START_ADDR FREERTOS_ADDR可知 Duos 内存起始地位0x80000000大小512MBFreeRTOS镜像运行地址(非加载地址)0x9fe00000(内存倒数2MB位置)大小2MB 转化路径mempa.py – build/scripts/mmap.mk -- build/output/${PROJECT_FULLNAME}/cvi_board_memmap.h。 关联方式软链如上cvi_board_memmap.h文件链接到fsbl/build/cvi_board_memmap.h --MONITOR${SDK_TOP}/opensbi/build/platform/generic/firmware/fw_dynamic.bin \Opensbi定义为MONITOR 借鉴ATFMilkV将Risc-V下的Opensbi等同于ATF中的BL31也称为Monitor # # OpenSBI | arm-trusted-firmware# # Monitor is at the begining of DRAMMONITOR_ADDR DRAM_BASEATF_SIZE 512 * SIZE_1KOPENSBI_SIZE 512 * SIZE_1KOPENSBI_FDT_ADDR MONITOR_ADDR OPENSBI_SIZE可知 Opensbi镜像运行地址0x80000000大小512KB --LOADER_2ND${SDK_TOP}/u-boot-2021.10/build/cv1813h_milkv_duos_sd/u-boot-raw.bin \U-boot定义为LOADER_2ND 借鉴ATFMilkV将Risc-V下的U-boot等同于ATF中的BL32 # # FSBL and u-boot-2021# CVI_UPDATE_HEADER_SIZE SIZE_1KUIMAG_SIZE 16 * SIZE_1M# kernel image loading bufferUIMAG_ADDR DRAM_BASE 24 * SIZE_1M...# u-boots run address and entry pointCONFIG_SYS_TEXT_BASE DRAM_BASE 2 * SIZE_1M可知 U-boot运行地址0x8020000(内存偏移2MB)大小2MB 实际也可在生成的链接脚本中验证如上内容在链接脚本blmacros.ld中可查找到如下内容 # fsbl/build/cv1813h_milkv_duos_sd/blmacros/blmacros.ldSECTIONS {...DEF_DRAM_BASE 0x80000000;DEF_MONITOR_RUNADDR 0x80000000;DEF_BLCP_2ND_RUNADDR 0x9fe00000;启动流程 ​ 由上一章节可知追寻着BLCP_2ND的引用位置即可知晓RTOS如何加载启动如头文件 // fsbl/plat/sg200x/include/mmap.h#define BLCP_2ND_RUNADDR CVIMMAP_FSBL_C906L_START_ADDR// fsbl/build/cvi_board_memmap.h 软链指向如下实体文件 // build/output/cv1813h_milkv_duos_sd/cvi_board_memmap.h#define CVIMMAP_FSBL_C906L_START_ADDR 0x9fe00000 /* offset 510.0MiB */​ 然而在FSBL源码中没有找到任何一处直接引用该宏定义的位置所以可以有推论FSBL并非直接编码该地址信息而是间接传递地址信息。实际使用有可知引导文件fip.bin是按对列的要求拼接的这个其中就包含了关键信息BLCP_2ND_RUNADDR。 所以先要对fip.bin文件的组成有一个了解。 fip文件组成 ​ 参考SG200x厂商算能的手册信息有fip.bin镜像结构与启动流程如下 而只是大致的分部结构参考Python打包脚本与结构定义头文件可以整理出具体的结构大小与分布文件如下 fsbl/plat/sg200x/fiptool.pyfip.bin文件的python生成脚本 class FIP下可以看到param1、body1、param2、body2的定义 fsbl/plat/sg200x/include/bl2.hparam2 结构体定义 fsbl/plat/${CHIP_ARCH}/include/platform.hparam1 结构体定义 整理后的内容如下 可知 Body1中第一个镜像是BLCP由目标fip章节可获知BLCP的信息 --BLCP_IMG_RUNADDR0x05200200 \--BLCP_PARAM_LOADADDR0 \--BLCPtest/empty.bin \其中 BLCP即镜像文件指向${FSBL_DIR}/test/empty.bin如其名内容为空大小为0因为BLCP为空所以其加载地址(BLCP_PARAM_LOADADDR)与运行地址(BLCP_IMG_RUNADDR)信息就不太有参考价值 Body1中第二个镜像是BL2同上可获知BL2的信息 --BL2${SDK_TOP}/fsbl/build/cv1813h_milkv_duos_sd/bl2.bin \其中 BL2即FSBL镜像文件指向${FSBL_DIR}/build/cv1813h_milkv_duos_sd/bl2.bin大小33KBFSBL是一个阶段的统称BL2是其中的一个小部分在BL2阶段完成工作DDR 初始化 Body2中第一个镜像是DDR_PARAMM可获知DDR_PARAM信息 --DDR_PARAMtest/sophon/ddr_param.bin \其中 DDR_PARAM即DDR初始化参数指向${FSBL_DIR}/test/sophon/ddr_param.bin大小8KB十六进制方式查看未能看到什么组织规范可能是按特定的数据结构组织也可能是加密过尝试在BL2中查看这个文件如何使用的才能知晓 Body2中等二个文件是BLCP_2N可获知信息 --BLCP_2ND_RUNADDR${BLCP_2ND_RUNADDR} \--BLCP_2ND${SDK_TOP}/freertos/cvitek/install/bin/cvirtos.bin \其中 BLCP_2ND即第二个BLCP镜像文件指向${SDK_TOP}/freertos/cvitek/install/bin/cvirtos.bin大小14KB这即是我们查找的RTOS镜像文件其运行地址为0x9FE0_0000 Body2中的Monitor、LOADER_2ND再分析 综上如果按Body的组织顺序应有启动流程BLCP BL2 BLCP_2ND MONITOR LOADER_2ND 。 而BLCP为空结合实际内容启动流程为bl2 FreeRTOS opensbi U-boot; 所以可以有猜测bl2 完成了FreeRTOS的引导启动工作。 BL2程序 ​ 由章节编译框架章节可知FSBL最终是为了生成fip.bin文件其依赖于bl2.bin文件。Makefile中的目标依赖关系也是如此 # fsbl/Makefile $(eval $(call MAKE_BL,2))# fsbl/make_helpers/build_macros.mk # MAKE_BL macro defines the targets and options to build each BL image. # Arguments: # $(1) BL stage (2, 2u, 30, 31, 32, 33) # $(2) FIP command line option (if empty, image will not be included in the FIP) define MAKE_BL$(eval BUILD_DIR : ${BUILD_PLAT}/bl$(1))$(eval BL_SOURCES : $(BL$(call uppercase,$(1))_SOURCES))$(eval SOURCES : $(BL_SOURCES))$(eval OBJS : $(addprefix $(BUILD_DIR)/,$(call SOURCES_TO_OBJS,$(SOURCES))))$(eval LINKERFILE : $(call IMG_LINKERFILE,$(1)))$(eval MAPFILE : $(call IMG_MAPFILE,$(1)))$(eval ELF : $(call IMG_ELF,$(1)))$(eval SYM : $(call IMG_SYM,$(1)))$(eval DUMP : $(call IMG_DUMP,$(1)))$(eval BIN : $(call IMG_BIN,$(1)))$(eval BL_LINKERFILE : $(BL$(call uppercase,$(1))_LINKERFILE)) ... $(ELF): $(OBJS) $(LINKERFILE) | bl$(1)_dirs # 生成$(OBJS) $(LINKERFILE)前需要先保证 bl$(1)_dirs 目标已经创建echo LD $$echo const char build_message[] $(BUILD_MESSAGE_TIMESTAMP); \const char version_string[] ${VERSION_STRING}; | \$$(CC) $$(TF_CFLAGS) $$(CFLAGS) -xc -c - -o $(BUILD_DIR)/build_message.o # 定义两个变量保存编译信息并编译生成目标文件build_mesage.o再后面链接过程中会被用到$$(Q)$$(LD) -o $$ $$(TF_LDFLAGS) $$(LDFLAGS) -Map$(MAPFILE) \--script $(LINKERFILE) $(BUILD_DIR)/build_message.o ${BL2_RLS_OBJS} $(OBJS) $(LDLIBS) ... $(BIN): $(ELF)echo BIN $$$$(Q)$$(OC) -O binary $$ $$ # 使用${CROSS_COMPILE}objcopy从elf转化为bin${ECHO_BLANK_LINE}echo Built $$ successfully${ECHO_BLANK_LINE}.PHONY: bl$(1) bl$(1): $(BIN) $(SYM) $(DUMP)$$(print_target) ... endef可知 bl$(1)即bl2依赖于目标$(BIN)、$(SYM)、$(DUMP)分别对应${SDK_TOP}/fsbl/build/${CHIP_ARCH}目录下的bl2.binbl2.sym、bl2.dis $(BIN)即bl2.bin依赖于目标$(ELF)即bl2.elf 其生成方法为使用工具链的objcopy工具由ELF格式文件bl2.elf生成二进制文件bl2.bin。 ELF即bl2.elf依赖于目标$(OBJS) $(LINKERFILE) 其生成方法为 $(CC) 。。。 -xc -c - -o $(BUILD_DIR)/build_message.o生成版本信息文件build_mesage.o使用管道将标准输入编辑为目标文件 注-参数通常是用来表示要编译的源文件的位置如果没有指定具体的源文件名可能是表示要从标准输入读取源代码。 $(LD) -o $$ 。。。 --script $(LINKERFILE) $(BUILD_DIR)/build_message.o ${BL2_RLS_OBJS} $(OBJS) $(LDLIBS)bl2.elf链接方法其中 --script $(LINKERFILE)指定链接脚本$(LINKERFILE)即BL_LINKERFILE - BL2_LINKERFILE - plat/${CHIP_ARCH}/bl2/bl2.ld.S;$(BUILD_DIR)/build_message.o保存编译信息的目标文件bl2.elf依赖的目标文件之一$(OBJS)依赖的目标文件bl2.bin依赖的主要目标文件即OBJS -来源于所有源码文件(*.c *.s) SOURCES - BL_SOURCES - BL2_SOURCES 具体有哪些源码文件由${CHIP_ARCH}下的platform.mk文件决定如fsbl/plat/sg200x/platform.mk${BL2_RLS_OBJS} $(LDLIBS)为空不用关注 综上可知bl2.bin 文件由bl2.elf文件而来bl2.elf文件由bl2源码编译链接而来。bl2.elf文件的链接由链接脚本plat/${CHIP_ARCH}/bl2/bl2.ld.S决定 #include platform.h#ifdef __riscvOUTPUT_FORMAT(elf64-littleriscv)OUTPUT_ARCH(riscv) ... #endif ENTRY(bl2_entrypoint) # 入口MEMORY {RAM (rwx): ORIGIN BL2_BASE, LENGTH BL2_SIZE # 0x0C000000, 0x37000(220KB) ... SECTIONS {. BL2_BASE; # 代码段从SRAM起始位置可知 ENTRY(bl2_entrypoint)bl2.elf程序的主入口为符号bl2_entrypointBL2在SRAM上运行起始地址 0x0C00_0000大小 0x3_7000(220KiB)1 milkV-Duo主干源码SDK中的fsbl未完全开放源码因此需要从另一个fsbl仓库拉源码替换到主干SDK的fsbl目录。 MilkV Duo 主干SDK源码仓库https://github.com/milkv-duo/duo-buildroot-sdkFSBL开源的源码仓库https://github.com/milkv-duo/fsbl 取在fsbl源码中查找该程序入口符号查找到fsbl/lib/cpu/riscv/bl2_entrypoint.S bl2_entrypoint: # 入口j bl2_entrypoint_real # 调用真正入口bl2_entrypoint_real.word 0 // resvered ... bl2_entrypoint_real:atf_state_set x28, x29, ATF_STATE_BL2_ENTRY_POINT # 将值ATF_STATE_BL2_ENTRY_POINT写入寄存器REG_GP_REG1li x1, 0 # 通用寄存器清零... # 为跳转到C语言环境做准备涉及# mtvec 向量表plic 中断控制器I-Cache、D-cache 缓存BSS段清零call bl2_main # 调用C程序入口bl2_mainj die ...可知 bl2_entrypoint只是纸面入口实际起作用是bl2_entrypoint_realatf_state_set使用寄存器REG_GP_REG1保存当前启动状态对应关系bl2_entrypoint - ATF_STATE_BL2_ENTRY_POINT(0xB2000000);bl2_entrypoint_real使用risc-v汇编代码编写主要完成C语言环境的初始化工作最终由bl2_mian进入C程序 查找bl2_main入口查找到fsbl/plat/${CHIP_ARCH}/bl2/bl2_main.c如fsbl/plat/sg200x/bl2/bl2_main.c // fsbl/plat/sg200x/bl2/bl2_main.cvoid bl2_main(void)uint32_t v p_rom_api_get_boot_src(); // 查看启动方式...set_baudrate(); // 串口设置波特率115200ATF_STATE ATF_STATE_BL2_MAIN; // 更新寄存器REG_GP_REG1记录启动状态time_records-fsbl_start read_time_ms();NOTICE(\nFSBL %s:%s\n, version_string, build_message); // 打印“编译信息”关键信息打印...load_ddr(); // DDR 初始化for (retry 0; retry p_rom_api_get_number_of_retries(); retry) {if (load_param2(retry) 0) // 从Flash中载入fip_param2到SRAMcontinue;if (load_ddr_param(retry) 0) // 从Flash中载入DDR_PARAM到SRAMcontinue;。。。ddr_init(sram_union_buf.ddr_param);// DDR初始化load_rest(mode); // 加载拿下启动程序到DDR并跳转运行NOTICE(BL2 end.\n); // 此后的内容不应执行因为在load_rest中就跳转到LOADER_2ND与MONITORwhile (1);可知 p_rom_api_get_boot_src为rom中芯片中固化的BL1程序符号此时还是实模式直接调用。该接口用于获取当前的启动模式又大致分为两大类 Flash启动包含SPI_NAND、SPI_NOR、EMMC下载启动包含SD、USB、UART ATF_STATE ATF_STATE_BL2_MAIN更新寄存器REG_GP_REG1标记已经进入bl2_main阶段 NOTICE(\nFSBL %s:%s\n, version_string。。。即设备上电时打印的版本信息内容即来自BL2程序章节中提及的build_mesage.o文件 load_ddr()DDR初始化暂不完全展开。可知在DDR初始化前完成了读取SD卡中fip_param2、ddr_param文件到SRAM中 load_param2(retry)NOTICE(P2S/0x%lx/%p.\n, sizeof(fip_param2), fip_param2); p_rom_api_load_image(fip_param2, fip_param1-param2_loadaddr, PARAM2_SIZE, retry);可知 调用p_rom_api_load_image接口完成从SD卡拷贝fip_param2到SRAM中其中fip_param2加载地址在fip_param1.param2_loadaddr中记录 ddr_param类似但其加载地址记录在fip_param2中具体为fip_param2.ddr_param_loadaddr 实际打印信息如下 P2S/0x1000/0xc00a400. SD/0x9400/0x1000/0x1000/0.P2E.可知fip_param2 大小为4KB将从SD卡地址0x1000 拷贝到SRAM地址0x0C00_A400(非固定值在bl2.elf链接时确定); load_rest(mode)BL2程序的主要初始化工作需要单独展开说明。另外这部分的工作都转入DDR环境中运行 NOTICE(BL2 end。。。不应执行到这个位置因为在此之前就已经跳转到MONITOR阶段所以在上电启动日志打印中看不到这个内容 综上可知bl2_main直接展现的内容较少需要再跟进loader_rest实现。 loader_rest的实现在路径fsbl/plat/${CHIP_ARCH}/bl2/bl2_opt.c如fsbl/plat/sg200x/bl2/bl2_opt.c struct fip_param1 *fip_param1 (void *)PARAM1_BASE; // fip_param1 地址关键信息 static struct fip_param2 fip_param2 __aligned(BLOCK_SIZE);int load_rest(enum CHIP_CLK_MODE mode)。。。sys_pll_init(mode); // PLL锁相环时间初始化load_blcp_2nd(retry); // BLCP_2NC 加载。。。time_records-release_blcp_2nd time_records-ddr_init_end;// 启动时间记录NOTICE(C2S/0x%x/0x%x/0x%x.\n, fip_param2.blcp_2nd_loadaddr, fip_param2.blcp_2nd_runaddr, fip_param2.blcp_2nd_size);if (!fip_param2.blcp_2nd_runaddr) { // 检查运行地址是否为空即是否存在bl2程序if (!IN_RANGE(fip_param2.blcp_2nd_runaddr, DRAM_BASE, DRAM_SIZE)) { // 检查blcp_2nd 运行地址是否在DRAM范围内if (!IN_RANGE(fip_param2.blcp_2nd_runaddr fip_param2.blcp_2nd_size, DRAM_BASE, DRAM_SIZE)) { // 检查blcp_2nd 大小是否超出DRAM范围p_rom_api_load_image((void *)(uintptr_t)fip_param2.blcp_2nd_runaddr, fip_param2.blcp_2nd_loadaddr, fip_param2.blcp_2nd_size, retry); crc p_rom_api_image_crc((void *)(uintptr_t)fip_param2.blcp_2nd_runaddr, fip_param2.blcp_2nd_size); ret dec_verify_image((void *)(uintptr_t)fip_param2.blcp_2nd_runaddr, fip_param2.blcp_2nd_size, 0, fip_param1); flush_dcache_range(fip_param2.blcp_2nd_runaddr, fip_param2.blcp_2nd_size);rtos_base mmio_read_32(AXI_SRAM_RTOS_BASE);init_comm_info(0);。。。 if (rtos_base CVI_RTOS_MAGIC_CODE) {mmio_write_32(AXI_SRAM_RTOS_BASE, fip_param2.blcp_2nd_runaddr); } else {reset_c906l(fip_param2.blcp_2nd_runaddr);NOTICE(RSC.\n); // 小核启动前打印RSC.mmio_clrbits_32(0x3003024, 1 6); mmio_setbits_32(SEC_SYS_BASE 0x04, 1 13);mmio_write_32(SEC_SYS_BASE 0x20, reset_address); // 将RTOS入口地址低32位写入寄存器0x020B_0020mmio_write_32(SEC_SYS_BASE 0x24, reset_address 32); // 将RTOS入口地址高32位写入寄存器0x020B_0024mmio_setbits_32(0x3003024, 1 6);分析如下 fip_param1 (void *)PARAM1_BASEfip_param1地址直接由宏硬编码定义值为0x0C03_9000。2 sys_pll_init(mode)load_rest过程中先对时钟系统进制初始化暂不展开 load_blcp_2nd(retry)即加载RTOS镜像到DDR中运行其中有如下过程 NOTICE(C2S/0x%x/0x%x。。。启动打包信息C2S解释C2,BLCP_2NDS,Start 实际打印如C2S/0xc400/0x9fe00000/0x3600.即加载地址0xc400拷贝rtos镜像到DDR地址0x9fe0_0000镜像大小0x3600 RTOS镜像有效性检查包含文件是否为空运行地址是否有效大小是否溢出 真正执行向运行地址的镜像搬移 CRC验证搬移过程中无差错 解密与检验RTOS镜像(未使能安全启动时动作为空) 刷新RTOS镜像范围内的D-Cache 检查寄存器AXI_SRAM_RTOS_BASE(地址0x0E00_007C)是否为默认值CVI_RTOS_MAGIC_CODE(值0xABC0DEF) 如果仍为默认值寄存器0x0E00_007C中写入RTOS运行地址fip_param2.blcp_2nd_runaddr即0x9FE0_0000如不为默认值(实现测试)寄存器0x020B_0000中写入RTOS运行地址0x9FE0_0000重启C906小核开始运行RTOS 关于这个AXI_SRAM_RTOS_BASE标致检测猜测可能是一种防重入机制具体原因与开源开发同事确认中。 至此找到了小核引导RTOS的启动的关键实现。 总结 ​ 本文主要记录MilkV DuoS 上是如何引导C906L小核运行RTOS的记录介绍从编译框架、文件打包、源码跟读方式最终确认找到启动入口过程中记录了一些特别的收获这其中包含 Makkefile一些对列属性的使用如.DEFAULT_GOAL、MAKEOVERRIDES一些特别的目标文件生成方法如$(CC) 。。。 -xc -c - -o $(BUILD_DIR)/build_message.o由标准输入生成目标文件BL1固定符号地址由BL2来调用如p_rom_api_load_imagePython结构体数据的表达如Entry.make(MAGIC1, 8, int, bCVBL01\n\0),文件的拼接如generate_fip启动流程RISC-V兼容ARM的启动流程可以OpenSbi等效于ARM中的BL31C906核启动方式较C910手册中提及的方式相似------向寄存器BOOT_REG写入程序入口地址重启即完成该核的启动 回顾整个小核CPU引导RTOS启动流程的梳理即使有一些前置工作但好像还是有些简单粗暴可能这是THead系列的特别设计。**庆幸的是MilkV DuoS有两个小核所以可以切换到A53核引导RTOS的再梳理一篇。 思考 BootRom 属于不开放的BL1而BL2中也会有多处调用BL1接口的地方说明BL1已经集成很多基础的、使用概率较高的实现。 从行业方案看来这与树莓派等硬件不开源的方案相类似形成了一种趋势随着IC厂商BL1功能变得愈发完备板级适配(DDR等)工作也由IC厂商完成最终产品端的BSP开发的需求将会变得越来越弱。 备注 // fsbl/plat/sg200x/include/platform_def.h #define TPU_SRAM_ORIGIN_BASE 0x0C000000 #define TPU_SRAM_SIZE 0x40000 // 256KiB#if ROM_LOCATION ROM_LOCATION_HSPERI_ROM#ifdef __riscv#define ROM_BASE 0x04418000 // no mirrored address for c906b#define TPU_SRAM_BASE TPU_SRAM_ORIGIN_BASE // no mirrored address for c906b#define SYSMAP_MIRROR_OFFSET 0x20000000 // ------------------------------------------------- // fsbl/plat/sg200x/include/mmap.h #define BL_RAM_BASE TPU_SRAM_BASE #define BL2_BASE (BL_RAM_BASE) #define BL2_SIZE (0x37000) #define BOOT_LOG_BUF_BASE (BL2_BASE BL2_SIZE) #define BOOT_LOG_BUF_SIZE 0x2000 #define PARAM1_BASE (BOOT_LOG_BUF_BASE BOOT_LOG_BUF_SIZE)// 转化PARAM1_BASE(BOOT_LOG_BUF_BASE BOOT_LOG_BUF_SIZE)((BL2_BASE BL2_SIZE) BOOT_LOG_BUF_SIZE) 0x0C000000 0x37000 0x2000 0x0C03_9000SRAM 起始地址0x0C00_0000大小0x3_9000(256KiB)即bl2.bin之后还有剩余36KiB空间。 ↩︎ PARAM1_BASE换算 ↩︎
http://www.pierceye.com/news/373772/

相关文章:

  • 网站建设(信科网络)谷歌推广怎么开户
  • 活动策划网站有哪些温州网页设计美工
  • 网站描述代码怎么写做正规小说网站
  • 无锡外贸网站制作公司php网站开发薪资 深圳
  • 做卡盟网站赚钱吗为企业制定网络营销方案
  • lol视频网站模板网站定制案例
  • 海兴县网站建设郑州嵌入式培训机构
  • 网站建设怎么记账韩国 电商网站
  • 公司介绍网站怎么做的网站建设的广告语
  • 茂名网站建设托管阿里云 wordpress主机名
  • 投票活动网站怎么做郑州营销型网站制作教程
  • 如何做一个导航网站凡科建设网站怎么保存
  • 哪个网站能叫我做直播回放广州十大猎头公司排名
  • 四川网站建设那家好百度爱采购竞价
  • 怎么做提卡密网站万游wordpress 验证
  • 威宁住房和城乡建设局网站网站介绍怎么写
  • 百度站长平台快速收录wordpress hook机制
  • 衡水提供网站设计公司哪家专业网站维护简单吗
  • 域名购买后 怎么创建网站网站内部优化是什么
  • 做微信公众号第三网站整站外包优化公司
  • 济南协会网站设计团队网站后台建设编辑器
  • 行业查询网站拖式网站建设
  • 网站设计文献网站开发与维护岗位说明书
  • 公司制作网站东莞南城房价
  • 智能建站系统seo网站优化方案
  • 南宁网站建设找建站通成都seo推广
  • 网站做镜像的有什么用建设银行流水网站
  • 湖北网站定制开发价格表宣传片制作协议
  • 开网站要多少钱自己怎样做网站
  • 建设网站的教程免费的wordpress分类在哪设置