02-启动-上半部

本文介绍了ARM架构下嵌入式系统启动的过程,包括bootloader和BIOS的角色,以及如何将kernel代码加载到指定位置执行。通过示例代码展示了启动文件boot.S、链接脚本kernel.ld和入口函数main.c的关键部分。实验中,代码在Raspberry Pi 2B上运行,关闭额外CPU核心并引导到kernel_main。最终在串口输出调试信息,实现简单的Hello World程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

俗称万事开头难,最麻烦的确实也是第一步启动,关于启动相关的实际上可以说很多,但是由于篇幅原因以及作者自身水平有限就不过多展开。在本系列文章只需要知道有bootloader或者bios会负责将编译好的kernel代码放到指定的位置,PC指向起始代码并且开始执行即可。

所以我们的第一个目标就是搭建一个代码框架,编写启动代码,并且能顺利跳到我们的main函数。

主要涉及到的文件及其作用

    1. boot.S 启动代码,跳转到我们真正的入口函数
    1. kernel.ld gcc链接脚本,负责将目标文件按脚本链接成为一个可执行文件
    1. main.c 真正的入口函数所在的源文件

涉及到的工具

    1. make
    1. gcc/ld
    1. qemu

核心代码

arch/arm/boot/boot.S

.section ".text.boot"

.p2align 2
.global _start

_start:
    // shut off extra cores
    mrc p15, 0, r5, c0, c0, 5
    and r5, r5, #3
    cmp r5, #0
    bne halt

    ldr r5, =_start
    mov sp, r5

    ldr r3, =kernel_main
    blx r3

halt:
    wfe
    b halt

简单说明:因为raspi2b使用的bcm2709为4核cpu,在这里仅使用cpu0,所以启动代码中将其他核进入死循环,而将cpu0的pc指向kernel_main处并且运行

运行结果

为了便于观察实验结果,x86会预先在vga上打印调试信息,raspi2b会在串口上打印调试信息。相关代码是直接拷贝其他教程,仅作为临时使用。

执行以下命令:

. set_raspi2b.sh
make
make qemu

如果执行无意外的话,会出现如下输出:

...(省略编译过程信息输出)
arm-linux-gnueabihf-objcopy -O binary image.elf image
arm-linux-gnueabihf-objdump -S image.elf > image.asm
qemu-system-aarch64 -M raspi2b -kernel image -serial null -serial stdio 
Hello World!

参考网址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值