网站制作网站设计jsp网站开发标准
web/
2025/9/25 15:58:11/
文章来源:
网站制作网站设计,jsp网站开发标准,深圳关键词排名首页,最近新闻小学生摘抄目录
一、启动程序的入口
二、初始化硬件浮点单元fpu
三、全局指针
四、设置系统栈
五、设置内存
六、设置Cache
七、配置协处理器
八、初始化TLB 一、启动程序的入口 FRAME(_start, sp, 0, ra)#xff1a;这一行是一个汇编宏#xff0c;用于创建一个函数框架。_star…目录
一、启动程序的入口
二、初始化硬件浮点单元fpu
三、全局指针
四、设置系统栈
五、设置内存
六、设置Cache
七、配置协处理器
八、初始化TLB 一、启动程序的入口 FRAME(_start, sp, 0, ra)这一行是一个汇编宏用于创建一个函数框架。_start 是函数的入口地址sp 是栈指针0 表示没有保存寄存器的空间ra 是返回地址寄存器。 .set noreorder这个指令告诉汇编器不要重新排序指令。 #if (__mips_hard_float)这是一个条件编译指令检查是否启用了硬件浮点运算。 li v0, SR_CU1将 SR_CU1 的值加载到寄存器 v0 中。 mtc0 v0, C0_SR将寄存器 v0 的值写入 CP0 寄存器 C0_SR 中。 #else mtc0 zero, C0_SR /* clr IntMsks/ kernel/disabled mode */ #endif nop空操作指令。 li v0, CAUSE_DC将 CAUSE_DC 的值加载到寄存器 v0 中。 mtc0 v0, C0_CAUSE将寄存器 v0 的值写入 CP0 寄存器 C0_CAUSE 中。 nop空操作指令。 lui v0, 0xFFFF将 0xFFFF 的高 16 位加载到寄存器 v0 中。 mtc0 v0, C0_COMPARE将寄存器 v0 的值写入 CP0 寄存器 C0_COMPARE 中。 nop空操作指令。
这段代码主要是针对 MIPS 架构的初始化设置。根据是否启用了硬件浮点运算设置相应的寄存器值清除软件中断和定时器中断。
二、初始化硬件浮点单元fpu #if (__mips_hard_float)这是一个条件编译指令检查是否启用了硬件浮点运算。 li t3, 0xAAAA5555将常数 0xAAAA5555 加载到寄存器 t3 中。 mtc1 t3, fp0将寄存器 t3 的值写入浮点寄存器 fp0 中。 mtc1 zero, fp1将寄存器 zero 的值0写入浮点寄存器 fp1 中。 mfc1 t0, fp0将浮点寄存器 fp0 的值读取到通用寄存器 t0 中。 mfc1 t1, fp1将浮点寄存器 fp1 的值读取到通用寄存器 t1 中。 nop空操作指令。 bne t0, t3, 1f如果寄存器 t0 的值不等于 t3则跳转到标签 1f 处执行。 nop空操作指令。 bne t1, zero, 1f如果寄存器 t1 的值不等于 0则跳转到标签 1f 处执行。 nop空操作指令。 ctc1 zero, fcr31将寄存器 zero 的值写入浮点控制寄存器 fcr31 中即清除浮点控制状态寄存器。 j 2f无条件跳转到标签 2f 处执行。 nop空操作指令。 li v0, 0x0将常数 0x0 加载到寄存器 v0 中。 mtc0 v0, C0_SR将寄存器 v0 的值写入 CP0 寄存器 C0_SR 中即重置状态寄存器。 nop空操作指令。 2:标签 2用于跳转。 #endif结束条件编译指令块。
这段代码主要用于检查是否存在浮点处理器FPU如果存在则清除浮点控制状态寄存器并重置状态寄存器。
三、全局指针 la gp, _gp将全局指针 _gp 的地址加载到全局指针寄存器 gp 中用于初始化全局指针寄存器。 la v0, _fbss将未初始化数据段bss段的起始地址 _fbss 加载到通用寄存器 v0 中。 la v1, _end将未初始化数据段的结束地址 _end 加载到通用寄存器 v1 中。 3:标签 3用于循环中的跳转。 sw zero, 0(v0)将寄存器 zero 的值0存储到地址为 v0 的内存位置即清零未初始化数据段中的一个字。 bltu v0, v1, 3b如果 v0 的值小于 v1 的值则跳转到标签 3 处执行。这是一个无符号数比较分支指令用于在清零未初始化数据段的过程中循环处理直到结束。 add v0, 4将寄存器 v0 的值加上4即增加一个字的大小用于指向下一个未初始化数据段的地址。
这段代码的主要作用是初始化全局指针寄存器并清零未初始化数据段bss段的内容确保其在使用之前被正确初始化。
四、设置系统栈 la t0, _stack_end: 将系统栈的结束地址 _stack_end 加载到临时寄存器 t0 中。 sub t0, t0, (4 * 4): 从系统栈的结束地址减去4个字即16个字节。这可能是为了留出一些空间用于栈帧或其他用途。“XXX overhead” 注释可能表示这个操作有一定的额外开销。 move sp, t0: 将临时寄存器 t0 中的值移动到栈指针寄存器 sp 中从而设置系统栈。 la a0, _RamSize: 将 RAM 的大小 _RamSize 加载到寄存器 a0 中。
五、设置内存 jal set_memory_size: 调用函数 set_memory_size这可能是设置内存大小的函数。 nop: 空操作指令用于填充延时槽或优化。
六、设置Cache jal config_cache: 调用函数 config_cache用于确定 D I caches 的大小。 nop: 空操作指令。 la a0, memory_cfg_struct: 将内存配置结构体 memory_cfg_struct 的地址加载到寄存器 a0 中。 jal get_memory_conf: 调用函数 get_memory_conf可能用于填充内存配置结构体。 nop: 空操作指令。 jal flush_cache: 调用函数 flush_cache用于初始化缓存。 nop: 空操作指令。
七、配置协处理器 mfc0 v0, C0_CONFIG, 0: 从协处理器0的配置寄存器中特权级0读取数据将其存储到通用寄存器 v0 中。 and v0, v0, ~CFG0_K0: 将 v0 的值与 CFG0_K0 的按位取反值进行按位与操作可能是为了清除特定位的设置。 or v0, v0, CFG_C_CACHABLE: 将 CFG_C_CACHABLE 的值与 v0 进行按位或操作可能是为了设置缓存为可缓存的模式。 mtc0 v0, C0_CONFIG, 0: 将寄存器 v0 的值写入到协处理器0的配置寄存器中特权级0。 nop: 空操作指令。
这段代码的主要作用是设置系统栈、内存大小、缓存配置等并进行一些与内存和缓存相关的初始化操作。
八、初始化TLB
/* Clear Translation Lookaside Buffer (TLB) */ jal init_tlb /* clear the tlb */ nop
/* End of CPU initialization, ready to start kernel */ move a0, zero /* Set argc passed to main */ jal bsp_start //C语言启动代码不返回 nop
/* Kernel has been shutdown, jump to the exit routine */ jal _sys_exit move a0, v0 # pass through the exit code
1: beq zero, zero, 1b nop .set reorder ENDFRAME(_start)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/81702.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!