天天看點

從零開發一個RTOS系列--loader篇

RTOS隻是一個核心,要正常啟動,和Linux的Uboot類似存在一個loader的子產品,這個loader可以做的很專用,不考慮通用情況,隻針對某一款特定的平台,特定的RTOS而編寫。

下面這個GitHub上的代碼庫就是筆者簡單修改的一個loader。

https://github.com/JeremyLi/bootloader

之前提到的這款RTOS是靜态編譯、連結的(可以通過-fPIC和連結腳本聯合控制),也即是其運作位址是固定的,要使RTOS正常工作隻需要把RTOS的Kernel搬運到那個固定位址再跳過去運作就行了。

下面說一下這個BootLoader的主要代碼的功能:

從零開發一個RTOS系列--loader篇

主要函數是_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相關變量以供後面記憶體申請和釋放時使用。

繼續閱讀