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

昆明网站建设一条龙室内设计效果图马克笔

昆明网站建设一条龙,室内设计效果图马克笔,1号网站建设,2015年做哪些网站能致富U-Boot源码分析5—启动过程分析start.S 1、boot0.h2、reset2.1、vectors2.2、ELn2.2.1 EL32.2.2、EL2、EL1 2.3、SMPEN2.3、core errate2.4、lowlevel_init 前面从U-Boot编译的角度分析了其Makefile、链接脚本等#xff0c;本章开始正式分析U-Boot启动过程 从上一篇文章7、U-… U-Boot源码分析5—启动过程分析start.S 1、boot0.h2、reset2.1、vectors2.2、ELn2.2.1 EL32.2.2、EL2、EL1 2.3、SMPEN2.3、core errate2.4、lowlevel_init 前面从U-Boot编译的角度分析了其Makefile、链接脚本等本章开始正式分析U-Boot启动过程 从上一篇文章7、U-Boot源码分析4—链接脚本分析可知U-Boot启动入口_start在arch/arm/cpu/armv8/start.S中 1、boot0.h 在start.S中找到启动入口_start 这里针对汇编文件的结尾*.s和*.S进行说明其中小写的s表示文件中仅包含汇编代码编译器将不进行预编译操作而大写的S表示文件中包含相关预编译代码编译器将进行预编译操作即判断#ifdef、#ifndef、#if defined(xxx)等语句的条件是否成立并保留相关代码或将#include指令包含的文件内容替换到对应位置等等的预编译操作 这里搜索CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK发现存在定义 因此将执行第28行的语句即#include asm/arch/boot0.h对于某些芯片需要特殊的一些初始配置的话可以通过配置CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK并执行相应boot0.h中的代码来进行一些boot之前的操作内容如下 可知其语句和其它启动文件基本一样都是跳转至reset标号但是增加了与AArch64切换有关的代码查看arch/arm/mach-sunxi/rmr_switch.S中的说明其实是本例所使用芯片的特殊属性因为该芯片在复位后会进入AArch32状态所以在一些时刻需要切换到AArch64状态这里涉及ARMv8的Reset Management Register暂时先不分析 随后进行 2 3 8 2^38 238字节对齐.align 3并定义了一些符号_end_ofs、_bss_start_ofs、_bss_end_ofs是一些关键段与代码段起始位置的偏移 2、reset 跳转进入reset后首先跳转进入save_boot_params这里save_boot_params通过WEAK关键字定义为save_boot_params_retstart.S文件最后 因为使用了WEAK关键字当然也可以直接在其它文件中定义自己的save_boot_params函数需使用头文件引用或在已有的头文件中进行声明 这里搜索CONFIG_SYS_RESET_SCTRL发现没有定义因此不进行跳转继续向下执行。 其实跳转到reset_sctrl中主要是根据当前异常等级执行对应操作设置小端关MMU关I/D-cache 2.1、vectors 接下来第67行首先将中断向量vectors的地址保存在x0寄存器中中断向量的定义在arch/arm/cpu/armv8/excetions.S中 这里首先进行 2 1 1 2048 2^112048 2112048字节即2K对齐.align 11且各个中断向量地址均以 2 7 128 2^7128 27128字节对齐 每个中断向量都对应其跳转指令比如b _do_bad_sync先用bl指令跳转到do_bad_sync函数执行然后再跳转到中断退出函数exception_exit而do_bad_sync函数最终将输出各个关键寄存器的值最后调用panic函数终止正在运行的程序并进行复位 /** do_bad_sync handles the impossible case in the Synchronous Abort vector.*/ void do_bad_sync(struct pt_regs *pt_regs, unsigned int esr) {efi_restore_gd();printf(Bad mode in \Synchronous Abort\ handler, esr 0x%08x\n, esr);show_regs(pt_regs);panic(Resetting CPU ...\n); }当然这里所有中断都没有打开目前不会进入任何中断向量另外现在没有初始化堆栈等也无法执行C函数 2.2、ELn 然后第68行判断异常等级并根据判断结果从不同分支开始执行 其中switch_el在arch/arm/include/asm/macro.h中定义 /** Branch according to exception level*/ .macro switch_el, xreg, el3_label, el2_label, el1_labelmrs \xreg, CurrentELcmp \xreg, 0xcb.eq \el3_labelcmp \xreg, 0x8b.eq \el2_labelcmp \xreg, 0x4b.eq \el1_label .endm其中xreg即为传入的x1寄存器这里将CurrentEL寄存器的值放入x1寄存器中并依次和0xc、0x8、0x4进行比较根据比较结果进入不同的分支标号 CurrentEL寄存器即为Current Exception Level寄存器根据ARMv8的手册其定义如下 因此0xc、0x8、0x4即分别对应EL3、EL2、EL1 2.2.1 EL3 可知当复位后CPU处于EL3时执行如下代码 3: msr vbar_el3, x0mrs x0, scr_el3orr x0, x0, #0xf /* SCR_EL3.NS|IRQ|FIQ|EA */msr scr_el3, x0msr cptr_el3, xzr /* Enable FP/SIMD */ #ifdef COUNTER_FREQUENCYldr x0, COUNTER_FREQUENCYmsr cntfrq_el0, x0 /* Initialize CNTFRQ */ #endifb 0f首先将x0寄存器中的中断向量vectors的地址放入vbar_el3寄存器Vector Base Address Register (EL3) 其中低11位0~10保留为0对应前面中断向量最开始的2K字节对齐.align 11 随后的3行语句首先将scr_el3寄存器的值保存到x0寄存器中然后将x0寄存器或操作上0xF即将低4位置1然后保存到x0寄存器中最后将x0寄存器的值再赋给scr_el3寄存器即scr_el3寄存器低4为置1 scr_el3寄存器bit3对应EA即任何异常等级下发生的External Abort 和 SError 中断都由EL3进行处理bit2对应FIQ即任何异常等级下发生的硬件上的FIQ 快速中断请求都由EL3进行处理bit1对应IRQ即任何异常等级下发生的硬件上的IRQ 中断请求都由EL3进行处理bit0对应NS置1表示任何低于EL3的异常等级EL0、EL1等都是非安全状态无法访问安全内存空间 然后使用xzr64位全零寄存器将cptr_el3寄存器清零 即TCPAC打开EL2访问CPTR_EL2、HCPTR寄存器的权限打开EL2、EL1访问CPACR_EL1、CPACR寄存器的权限TAM打开EL2、EL1访问Activity Monitor registers的权限TTA打开系统寄存器访问trace寄存器的权限TFP使能SVE、SIMD和浮点运算但EZ又把SVE关了 因此这一行代码的功能也就是注释说的使能SIMD和FP运算 然后由于在include/configs/sunxi-common.h中定义了COUNTER_FREQUENCY的值为24000000因此将此值由x0寄存器赋给cntfrq_el0寄存器即配置系统计数器的时钟值此系统计数器一般用于精确计时 结合上述分析EL3等级对应的操作即为将中断向量地址放入vbar_el3寄存器设置相关中断请求仅由EL3实现使能SIMD和FP运算设置系统计数器的时钟值 2.2.2、EL2、EL1 对应执行的代码为均为将中断向量地址放入对应的vbar_eln寄存器使能SIMD和FP运算等这里不再详细分析 2: msr vbar_el2, x0mov x0, #0x33ffmsr cptr_el2, x0 /* Enable FP/SIMD */b 0f 1: msr vbar_el1, x0mov x0, #3 20msr cpacr_el1, x0 /* Enable FP/SIMD */2.3、SMPEN 接下来的语句是开启多核相关的操作这里虽然没有定义CONFIG_ARMV8_SET_SMPEN但注释里建立用于Cortex-A53时使能因此这里也分析一下 /** Enable SMPEN bit for coherency.* This register is not architectural but at the moment* this bit should be set for A53/A57/A72.*/ #ifdef CONFIG_ARMV8_SET_SMPENswitch_el x1, 3f, 1f, 1f 3:mrs x0, S3_1_c15_c2_1 /* cpuectlr_el1 */orr x0, x0, #0x40msr S3_1_c15_c2_1, x0 1: #endif这里的操作也一样首先判断所处的异常等级仅在EL3时进行操作首先将S3_1_c15_c2_1也即cpuectlr_el1寄存器的值放入x0寄存器然后通过orr指令将第6位置1这里cpuectlr_el1寄存器在Cortex-A53手册中ARMv8架构定义了一些必须实现的寄存器同时预留一些空间给不同处理器来实现各自的特色功能等 第6位即SMPEN置1表示使能各核心之间的数据一致性功能主要与cache有关对于多核系统来说一般各个核具有自己的L1-cache簇内共享L2-cache还有外部的L3-cache这样不同核心上的cache或ram对于同一个数据可能有多个副本会导致数据观察者CPU/GPU/DMA等能看到的数据不一致因此设置会再处理器中设置硬件来维护数据的一致性具体内容可参考【Cache篇】一文总结ARMv8架构中关于Cache的知识点 2.3、core errate 随后进行核心勘误目前仅支持Cortex-A57进行核心勘误表的设置这里跳过 /* Apply ARM core specific erratas */bl apply_core_errata .... WEAK(apply_core_errata)mov x29, lr /* Save LR *//* For now, we support Cortex-A57 specific errata only *//* Check if we are running on a Cortex-A57 core */branch_if_a57_core x0, apply_a57_core_errata 0:mov lr, x29 /* Restore LR */retapply_a57_core_errata:#ifdef CONFIG_ARM_ERRATA_828024mrs x0, S3_1_c15_c2_0 /* cpuactlr_el1 *//* Disable non-allocate hint of w-b-n-a memory type */orr x0, x0, #1 49/* Disable write streaming no L1-allocate threshold */orr x0, x0, #3 25/* Disable write streaming no-allocate threshold */orr x0, x0, #3 27msr S3_1_c15_c2_0, x0 /* cpuactlr_el1 */ #endif#ifdef CONFIG_ARM_ERRATA_826974mrs x0, S3_1_c15_c2_0 /* cpuactlr_el1 *//* Disable speculative load execution ahead of a DMB */orr x0, x0, #1 59msr S3_1_c15_c2_0, x0 /* cpuactlr_el1 */ #endif#ifdef CONFIG_ARM_ERRATA_833471mrs x0, S3_1_c15_c2_0 /* cpuactlr_el1 *//* FPSCR write flush.* Note that in some cases where a flush is unnecessary thiscould impact performance. */orr x0, x0, #1 38msr S3_1_c15_c2_0, x0 /* cpuactlr_el1 */ #endif#ifdef CONFIG_ARM_ERRATA_829520mrs x0, S3_1_c15_c2_0 /* cpuactlr_el1 *//* Disable Indirect Predictor bit will prevent this erratumfrom occurring* Note that in some cases where a flush is unnecessary thiscould impact performance. */orr x0, x0, #1 4msr S3_1_c15_c2_0, x0 /* cpuactlr_el1 */ #endif#ifdef CONFIG_ARM_ERRATA_833069mrs x0, S3_1_c15_c2_0 /* cpuactlr_el1 *//* Disable Enable Invalidates of BTB bit */and x0, x0, #0xEmsr S3_1_c15_c2_0, x0 /* cpuactlr_el1 */ #endifb 0b ENDPROC(apply_core_errata)2.4、lowlevel_init 接下来就到了大名鼎鼎的lowlevel_init本章先不分析留待下章 本章分析完毕~ 完结撒花✿✿ヽ(°▽°)ノ✿
http://www.zqtcl.cn/news/812408/

相关文章:

  • 创建了网站安卓做视频网站
  • asp自助建站系统房地产楼盘微信网站建设营销方案
  • 网站建设公司发展方向及趋势低代码小程序开发平台
  • 临沂网站建设企业响应式网站首页
  • 福州网上商城网站建设wordpress登录界面logo
  • 子目录网站wordpress无中断音乐插件
  • 网站开发算是研发支出吗淘宝客网站建设的策略
  • 如果在工商局网站上做股权质押刷推广链接的网站
  • 保定建站公司模板wordpress 华为云
  • 好的网页设计网站推荐开发定制软件公司
  • 深圳做网站设计多媒体网站开发
  • 什么是网站组件高端网站设计高端网站制作
  • 网易网站建设深圳专业营销网站制作
  • 有口碑的佛山网站建设东莞网约车资格证官网登录入口
  • 网站建设合同 保密条款wordpress网站手机端
  • 汕头建站费用wordpress转cms
  • 全美网站开发PHP 网站开发 重点知识
  • 电商网站建设重要性一个公司可以做几个网站吗
  • 婚恋网站系统淘宝联盟推广做网站违法
  • 双鸭山网站建设公司百度电脑版官网下载
  • 网站开发项目名html欧美网站模板
  • 成都哪里有做网站的雪樱wordpress主题
  • 深圳建站模板公司微商管理系统
  • 贸易建设网站网页美工设计图片
  • 网站建设尺寸规范国外h5网站模板下载
  • 怎么区分网站的好坏软件定制化开发的知识产权归属
  • 网站建设客户需求分析调研表网站建设企业网站
  • 建设网站要注意什么问题临沂网站建设团队
  • 怎么做网站和注册域名互联网行业的工作岗位
  • 北京做网站优化多少钱网站反链和外链的区别