×
嵌入式 > 技术百科 > 详情

自制bootloader之程序的编译和链接

发布时间:2020-06-10 发布时间:
|

文本程序有4个:boot.s head.s main.c(led.c) image.s

boot.s:这个bootloader中真正属于boot的程序,完成板子硬件初始化并将内核程序(万能的LED流水灯)搬至SDRAM。

head.s:内核程序的前部,包括内核异常向量表和内核程序入口。

main.c:内核主程序,只是一个简单的LED流水灯~~~

inamge.s:整个bootloader的映像文件。包含boot.bin和kernel.bin,主要是将两个bin文件重定向,确保两个文件在正确的地址上。

Makefile文件如下:挺简单的~~先贴出来:

CC = arm-elf-gcc    
AS = arm-elf-as    
LD = arm-elf-ld    
OBJCOPY = arm-elf-objcopy    
ADDRESS = 0x0c000000    
.PHONY : all clean    
all : image.bin   
clean :   
    rm -f *.bin   
    rm -f *.elf   
    rm -f *.o   
image.bin : image.asm boot.bin kernel.bin   
    nasm -f bin -o $@ $<   
kernel.bin : kernel.elf   
    $(OBJCOPY) -O binary -R .comment -R .note -S $< $@   
    chmod a-x $@   
kernel.elf : head.o main.o   
    $(LD) -Ttext $(ADDRESS) -nostdinc -o $@ $^   
    chmod a-x $@    
main.o : main.c   
    $(CC) -Wall -O2 -c -o $@ $<   
head.o : head.s   
    $(AS) -o $@ $<   
boot.bin : boot.elf   
    $(OBJCOPY) -O binary -R .comment -R .note -S $< $@   
    chmod a-x $@   
boot.elf : boot.o   
    $(LD) -Ttext 0 -nostdinc -o $@ $<   
    chmod a-x $@   
boot.o : boot.s   
    $(AS) -o $@ $  

要注意的大概只有:

image.bin : image.asm boot.bin kernel.bin   
    nasm -f bin -o $@ $< 

用的是nasm程序,本人用的redhat9.0,当然要另外安装nasm 简单看了一下中文手册,还是能理解的

再帖一下image.s,有助于理解整个bootloader的安排:

image.s:

incbin    "boot.bin"   

times 0x100 - ($ - $$)  db 0   

incbin    "kernel.bin"

因为boot.bin文件大小为232字节(不足0x100),kernel.bin文件起始地址安排的是放在0x00000100的,所以中间还空了一些空间,所以选用nasm程序将两个bin文件拼接成一个image.bin,当然中间空的得用0来填充。

这里还要补充的是:为什么要用nasm再编写一个image.s文件。一般用过51单片机的,如at89s51的话,会认为完全可以像烧写51程序那样,分别把boot.bin和kernel.bin文件烧写到指定的地址(j-flash提供此功能)而不需要把两个.bin文件事先拼接成一个文件。开始我也是这么想的,后来发现不行。因为boot.bin和kernel.bin两个文件是在flash的一个扇区内,而sst39vf160芯片的编程是以扇区(统一规格为2K)为单位的。即使是在一个扇区内只需修改一个字节的数据,那么都需要对整个扇区做修改。所以,当先把boot.bin烧写到0地址后,再想把kernel.bin烧写到0x100(<2K)地址处时,会把boot.bin给覆盖掉。所以只能把两个文件拼接成一个文件一次性烧写到0地址。

至些,在程序目录中运行make就行了,能得到一个image.bin文件是需要的,将其烧录到板子的flash里,起始地址当然是0。

断电重启板子,哈哈~~~ 灯还是跑起来了,~~~还是要强化一下理解,下一个目标是要能用串口打印点什么吧~~ 

 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
示波器使用时要注意的19个问题