gem5-salam加速器模拟器boot.s文件学习 - baremetal

gem5-salam加速器中的boot.s文件是为基于ARM架构的系统编写的汇编代码,主要用于设置和处理中断。下面是对代码进行分析

.section INTERRUPT_VECTOR, "x"

首先定义了一个名为INTERRUPT_VECTOR的段(section),用"x"标记表示这部分是可执行的。这通常是程序的开始处,包含了中断向量表。

.global _Reset
_Reset:
    B Reset_Handler    /* Reset */
    B .                /* Undefined */
    B .                /* SWI */
    B .                /* Prefetch Abort */
    B .                /* Data Abort */
    B .                /* reserved */
    B irq_handler      /* IRQ */
    B .                /* FIQ */

定义了各种中断向量的入口点。这包括了重置、未定义指令、软件中断、预取中止、数据中止、保留、IRQ(普通中断请求)和FIQ(快速中断请求)。
“ B . ” 表示对当前位置的分支,实际上是个占位符,通常会被替换为具体的中断处理函数的地址。

.equ Len_Stack,        0x1000;  // 4kB of stack memory
.equ Len_IRQ_Stack,    0x1000;  // 4kB of stack memory for IRQ Mode

进行栈的初始化,定义了两个等值标签(equ),分别为常规栈和IRQ模式下栈的大小

.equ GIC_Dist_Base,		0x2c001000
.equ set_enable1,       0x104
.equ set_enable2,       0x108
.equ timer_irq_id,    131   // 36 <64 => set_enable1 Reg
.equ kmio_irq_id,     44
.equ uart0_irq_id,    37
.equ rtc_irq_id,      36
.equ top_dev_id,      68

进行GIC配置,定义了与GIC(Generic Interrupt Controller)配置相关的一些基地址和偏移量,以及几个特定设备的中断ID。

.global Reset_Handler
Reset_Handler:
    mov R1, #0b11010010 // interrupts masked, MODE = IRQ
    msr CPSR, R1    // change to IRQ mode
    ldr SP, =stack_base + Len_Stack + Len_IRQ_Stack // set IRQ stack

将处理器切换到IRQ模式,并设置IRQ模式下的栈指针

    mov R1, #0b11010011 // interrupts masked, MODE = SVC
    msr CPSR, R1    // change to SVC mode
    ldr SP, =stack_base + Len_Stack // set stack

切换到SVC(超级调用)模式,并设置SVC模式下的栈指针。

    bl config_gic_dist
    bl config_gic_cpu_interface

调用函数配置GIC的分布式接口和CPU接口。

    ldr r0, =GIC_Dist_Base
    mov r1, #1
    str r1, [r0]
    mov R1, #0b01010011 // IRQ not masked, MODE = SVC
    msr CPSR, R1

启用GIC,允许接收中断,并将处理器状态切换回SVC模式,准备接收中断。

    bl main
    B .

跳转到main函数开始程序的主体执行,然后进入无限循环等待中断发生。

这段代码首先设置处理器状态和栈,然后配置GIC分布式控制器和CPU接口,最后进入主函数main。这里用到了改变当前处理器状态寄存器(CPSR)的值来切换处理器模式,并设置栈指针(SP)。

.global config_gic_dist
config_gic_dist:
    ...
.global config_gic_cpu_interface
config_gic_cpu_interface:
    ...

config_gic_dist 和 config_gic_cpu_interface 函数负责配置GIC。这包括启用特定的中断并配置CPU接口以接收中断。

.global irq_handler
irq_handler:
 ...

irq_handler是IRQ中断的通用处理函数。它首先保存当前的上下文,然后根据中断号(从GIC的中断确认寄存器读取)执行相应的处理。处理完成后,向GIC的中断结束寄存器写入以结束中断,并恢复上下文。

整体而言,这段代码展示了在基于ARM的系统中如何设置中断向量表,初始化栈和中断控制器,以及如何处理中断。它为深入理解ARM架构下的低级中断处理提供了实践基础。

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清枫♚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值