从零开发一个RTOS系列--loader篇

RTOS只是一个内核,要正常启动,和Linux的Uboot类似存在一个loader的模块,这个loader可以做的很专用,不考虑通用情况,只针对某一款特定的平台,特定的RTOS而编写。

下面这个GitHub上的代码库就是笔者简单修改的一个loader。

https://github.com/JeremyLi/bootloader

之前提到的这款RTOS是静态编译、链接的(可以通过-fPIC和链接脚本联合控制),也即是其运行地址是固定的,要使RTOS正常工作只需要把RTOS的Kernel搬运到那个固定地址再跳过去运行就行了。

下面说一下这个BootLoader的主要代码的功能:

从零开发一个RTOS系列--loader篇_第1张图片

 

主要函数是_relocate 和 _load_kernel。_relocate是模仿UBoot的relocate函数,重定BootLoader自身的位置无关代码的逻辑,这里只是简单的把.data和.bss段设置一下,.text段没动。_load_kernel函数是加载RTOS内核的代码,其主要是把Kernel的.text段从lma拷贝到vma,同时也把.data段拷贝到特定地址,把.bss段清零。另外在RTOS内部一般会把.bss后面的 RAM当做heap来用,C库的malloc函数会依据.bss的最后地址初始化_sbrk相关变量以供后面内存申请和释放时使用。

你可能感兴趣的:(bootloader,加载地址,位置无关代码,重定位,运行时地址)