首页 > 解决方案 > GNU 汇编器和异常向量表

问题描述

我已经完成了 Baking Pi 教程,并且我研究了 SVC 系统调用,在 Baking Pi 教程中,它将我的程序的基数设置为 0x8000 但向量表基数为 0,我如何通过 GNU 汇编程序访问 0x0 和使用我现在使用的哪个 kernel.ld?

标签: raspberry-piarm

解决方案


根据 Pi,您可以默认从 0x8000 或 0x80000 开始。现在有不同的文件名来引导引导加载程序选择你想要的处理器 kernel.img、kernel7.img kernel32.img 或一些不同的组合,你可以很容易地找到它。

烘焙 Pi 首先遇到了书面问题,但在 Raspberry Pi 网站裸机论坛中多次询问和回答(这是一个非常好的资源,如果没有的话,我在很长一段时间内见过最好的资源)。您将需要使用旧的 pi 或 Pi Zero 才能使教程正常工作,除非它已更新。

这是你拥有整个地址空间的裸机,如果你想把一些东西放在零,你只需这样做。

另一种方法是您可以创建一个 config.txt 文件,您可以告诉 GPU 中的引导加载程序将您的图像加载到 arm 地址空间中的 0x00000000。根据您使用的 arm 核心,您还可以使用 VTOR 寄存器(如果存在)来更改向量表的位置(因此将其设置为 0x80000 而不是 0x0000。我认为 Pi 零或旧的旧 pi 中的 arm11 不允许尽管如此。较新的32位模式确实如此,但它们是多核的,这将解开任何学习练习。正如我喜欢在启动时所说的那样,您必须“对核心进行排序”,隔离一个以继续并放置其他人处于无限循环中,因此它们不会干扰。gpu 在那些 Pi 上为您设置的引导代码会为您执行此操作,因此只有一个命中 0x8000 或 0x80000,因此人们考虑使用 config.txt 方法,

他们网站上的 raspberrypi 裸机论坛中链接了许多教程,这些教程应该会让您远远超出烘焙 Pi 的范围。和/或帮助你度过那些与他们斗争了一段时间的人。

像这样的链接描述文件

MEMORY
{
    ram : ORIGIN = 0x8000, LENGTH = 0x10000
}
SECTIONS
{
    .text : { *(.text*) } > ram
    .rodata : { *(.rodata*) } > ram
    .bss : { *(.bss*) } > ram
    .data : { *(.data*) } > ram
}

像这样的引导程序

.globl _start
_start:
    mov sp,#0x8000
    bl main
hang: b hang

应该让你启动。

对于链接描述文件,您可能需要 0x80000 而不是 0x8000,并且如果您至少有一个 .data 项,例如全局变量:

unsigned int x = 5;

然后引导程序不必将 .bss 归零(如果您的编程风格如此依赖)。objcopy 将使用 .rodata 和 .data 之间的零填充 -O 二进制文件,如果那里有 .data 负责清零 bss。

就异常表而言,您可以让工具为您完成工作:

.globl _start
_start:
    ldr pc,reset_handler
    ldr pc,undefined_handler
    ldr pc,swi_handler
    ldr pc,prefetch_handler
    ldr pc,data_handler
    ldr pc,unused_handler
    ldr pc,irq_handler
    ldr pc,fiq_handler
reset_handler:      .word reset
undefined_handler:  .word hang
swi_handler:        .word hang
prefetch_handler:   .word hang
data_handler:       .word hang
unused_handler:     .word hang
irq_handler:        .word irq
fiq_handler:        .word hang

reset:
    mov r0,#0x8000
    mov r1,#0x0000
    ldmia r0!,{r2,r3,r4,r5,r6,r7,r8,r9}
    stmia r1!,{r2,r3,r4,r5,r6,r7,r8,r9}
    ldmia r0!,{r2,r3,r4,r5,r6,r7,r8,r9}
    stmia r1!,{r2,r3,r4,r5,r6,r7,r8,r9}

现在,如果这不是 Pi Zero,那么向量表的工作方式会有所不同,您无论如何都需要阅读 arm 文档,然后再进入此类内容,但请阅读核心和模式以及您正在使用的架构文档。较新的 Pis 有 armv7 模式和 armv8 模式(aarch32 和 aarch64),每个都有自己的挑战,但它们都已在论坛中介绍。


推荐阅读