riscv - boot - loader


https://mp.weixin.qq.com/s/piTE9z9belhxIAkrfzwBzA

 

​簡單介紹linux kernel arch/riscv/boot/loader.S相關的內容。

 

1. loader.S

 

linux kernel arch/riscv/boot/loader.S中的代碼供bootloader如uboot等調用。在loader.S中,linux kernel的代碼被作為數據使用:

可以看到,這里直接把編譯生成的linux kernel代碼,亦即arch/riscv/boot/Image作為binary數據,放在_start的位置。

 

這是一種比較直接的做法,沒有對Image文件做處理。在arm/x86中,Image會被壓縮,然后再與被bootloader調用的啟動程序鏈接到一起,在啟動時會執行解壓縮動作。

 

2. loader.lds.S

 

loader.lds.S是loader.S的鏈接腳本:

其中:

a. arch為riscv:

b. 入口點(entry)是_start,這是指在loader.S中定義的_start;

c. 鏈接的起始地址是KERNEL_LINK_ADDR;

d. .payload段就是loader.S中包含進來的Image的內容;

 

3. Makefile

 

在arch/riscv/boot/Makefile中,定義了生成loader/loader.bin的規則:

生成loader.bin的命令如下:

 

使用objdump命令反匯編loader:

得到的內容如下:

這就是arch/rsicv/kernel/head.S中的內容,也就是Image中的內容。

 

從中也可以看出KERNEL_LINK_ADDR的值為0x80000_0000,這也符合其定義:

 

PAGE_OFFSET的定義如下:

 

如果使用命令make ARCH=riscv CROSS_COMPILE=riscv64-unknown-elf- V=1進行編譯:

可以看到-DCONFIG_PAGE_OFFSET=0x80000000的選項。

 

https://mp.weixin.qq.com/s/piTE9z9belhxIAkrfzwBzA 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM