完善链接脚本的注解

    百图画鸿蒙 + 百文说内核 + 百万注源码  => 挖透鸿蒙内核源码
    鸿蒙研究站 | http://weharmonyos.com (国内)
              | https://weharmony.github.io (国外)
    oschina | https://my.oschina.net/weharmony
    博客园 | https://www.cnblogs.com/weharmony/
    知乎 | https://www.zhihu.com/people/weharmonyos
    csdn | https://blog.csdn.net/kuangyufei
    51cto | https://harmonyos.51cto.com/column/34
    掘金 | https://juejin.cn/user/756888642000808
    公众号 | 鸿蒙研究站 (weharmonyos)
上级 b5c622a4
...@@ -71,7 +71,8 @@ ...@@ -71,7 +71,8 @@
.equ MPIDR_CPUID_MASK, 0xffU //#define MPIDR_CPUID_MASK 0xffU .equ MPIDR_CPUID_MASK, 0xffU //#define MPIDR_CPUID_MASK 0xffU
.fpu neon-vfpv4 //支持的浮点处理器 .fpu neon-vfpv4 //支持的浮点处理器
.syntax unified .syntax unified //.syntax命令是ARM架构独有的命令,指按照怎样的语法规则进行汇编 , unified表示ARMTHUMB指令使用统一的语法
//一般会使用unified , 以减少汇编器的报错
.arch armv7-a //支持芯片指令集 .arch armv7-a //支持芯片指令集
.arm //支持CPU架构 .arm //支持CPU架构
...@@ -454,8 +455,8 @@ stack_init: ...@@ -454,8 +455,8 @@ stack_init:
ldr r3, =OS_STACK_INIT ldr r3, =OS_STACK_INIT
/* Main loop sets 32 bytes at a time. | 主循环一次设置 32 个字节*/ /* Main loop sets 32 bytes at a time. | 主循环一次设置 32 个字节*/
stack_init_loop: stack_init_loop:
.irp offset, #0, #8, #16, #24 .irp offset, #0, #8, #16, #24 //.irp指令语法 .irp symbol,values . . . 这一串values会被逐一赋给symbol
strd r2, r3, [r0, \offset] /* 等价于strd r2, r3, [r0, 0], strd r2, r3, [r0, 8], ... , strd r2, r3, [r0, 24] */ strd r2, r3, [r0, \offset] /* 等价于strd r2, r3, [r0, 0], strd r2, r3, [r0, 8], strd r2, r3, [r0, 16] , strd r2, r3, [r0, 24] */
.endr .endr
add r0, #32 //加跳32个字节,说明在地址范围上 r1 > r0 ==> __exc_stack_top > __svc_stack add r0, #32 //加跳32个字节,说明在地址范围上 r1 > r0 ==> __exc_stack_top > __svc_stack
cmp r0, r1 //是否到栈底 cmp r0, r1 //是否到栈底
......
...@@ -132,7 +132,7 @@ extern "C" { ...@@ -132,7 +132,7 @@ extern "C" {
#ifdef LOSCFG_KERNEL_MMU // #ifdef LOSCFG_KERNEL_MMU //
#ifdef LOSCFG_TEE_ENABLE #ifdef LOSCFG_TEE_ENABLE
#define KERNEL_VADDR_BASE 0x41000000 #define KERNEL_VADDR_BASE 0x41000000 //用于链接器层面的宏配置 | 基地址
#else #else
#define KERNEL_VADDR_BASE 0x40000000 #define KERNEL_VADDR_BASE 0x40000000
#endif #endif
...@@ -148,10 +148,10 @@ extern "C" { ...@@ -148,10 +148,10 @@ extern "C" {
#define _U32_C(X) X##U #define _U32_C(X) X##U
#define U32_C(X) _U32_C(X) #define U32_C(X) _U32_C(X)
#define KERNEL_VMM_BASE U32_C(KERNEL_VADDR_BASE) ///< 速度快,使用cache #define KERNEL_VMM_BASE U32_C(KERNEL_VADDR_BASE) ///< 内核内存管理层面的宏配置 | 基地址
#define KERNEL_VMM_SIZE U32_C(KERNEL_VADDR_SIZE) #define KERNEL_VMM_SIZE U32_C(KERNEL_VADDR_SIZE) ///< 内核大小
#define KERNEL_ASPACE_BASE KERNEL_VMM_BASE ///< 内核空间基地址 #define KERNEL_ASPACE_BASE KERNEL_VMM_BASE ///< 内核运行空间层面的宏配置 | 基地址
#define KERNEL_ASPACE_SIZE KERNEL_VMM_SIZE ///< 内核空间大小 #define KERNEL_ASPACE_SIZE KERNEL_VMM_SIZE ///< 内核空间大小
/* Uncached vmm aspace */ /* Uncached vmm aspace */
......
...@@ -58,6 +58,7 @@ USER_INIT_VM_START = 0x1000000; ...@@ -58,6 +58,7 @@ USER_INIT_VM_START = 0x1000000;
***********************************************/ ***********************************************/
/* /*
https://www.jianshu.com/p/42823b3b7c8e https://www.jianshu.com/p/42823b3b7c8e
https://sourceware.org/binutils/docs/ld/MEMORY.html
MEMORY:内存布局,描述板上的存储器位置 MEMORY:内存布局,描述板上的存储器位置
语法为 语法为
NAME1 [(ATTR)] : ORIGIN = ORIGIN1, LENGTH = LEN2 NAME1 [(ATTR)] : ORIGIN = ORIGIN1, LENGTH = LEN2
...@@ -81,22 +82,22 @@ LENGTH :关键字,区域的大小,可简写成len 或l ...@@ -81,22 +82,22 @@ LENGTH :关键字,区域的大小,可简写成len 或l
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm) OUTPUT_ARCH(arm)
MEMORY //链接器的默认配置允许分配所有可用内存,描述链接器可以使用哪些内存区域
MEMORY
{ //ram,sram为存储区域的名字,可以随意取 { //ram,sram为存储区域的名字,可以随意取
ram : ORIGIN = KERNEL_VADDR_BASE, LENGTH = KERNEL_VADDR_SIZE ram : ORIGIN = KERNEL_VADDR_BASE, LENGTH = KERNEL_VADDR_SIZE //用户空间范围
sram : ORIGIN = 0x40000000, LENGTH = 0x1000 sram : ORIGIN = 0x40000000, LENGTH = 0x1000
user_ram : ORIGIN = 0x1000000, LENGTH = 0x100000 user_ram : ORIGIN = 0x1000000, LENGTH = 0x100000 //用户空间内存范围 USER_ASPACE_BASE ,此大小不是真正最后映射到用户空间的大小
} }
SECTIONS SECTIONS
{ {
/DISCARD/ : { *(.comment .note) } //过滤掉 .comment .note /DISCARD/ : { *(.comment .note) } //过滤掉所有输入文件的 .comment .note
.ram_vectors TEXT_BASE : { .ram_vectors TEXT_BASE : { //内核代码段开始位置
__ram_vectors_vma = .; __ram_vectors_vma = .; //定位到当前位置,即TEXT_BASE处
KEEP (*(.vectors)) KEEP (*(.vectors)) //告诉链接器 强制保留所有输入文件中的 .vectors
} > ram } > ram
__ram_vectors_lma = LOADADDR(.ram_vectors); __ram_vectors_lma = LOADADDR(.ram_vectors);//加载地址和链接地址一致,说明内核设计者希望从加载地址处运行指令
} }
//LMA:加载存储地址,指加载到存储器的地址,即加载或烧写到哪里
USER_INIT_VM_START = 0x1000000; //VMA:虚拟存储地址,也就是链接地址,即代码和数据运行的时候应在哪里
USER_INIT_VM_START = 0x1000000; //用户空间初始地址
...@@ -29,17 +29,21 @@ ...@@ -29,17 +29,21 @@
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
// GNU 链接脚本语法 https://sourceware.org/binutils/docs/ld/LD-Index.html /*
ENTRY(reset_vector) /*指定入口地址*/ 链接脚本, 各板子按自己实际情况修改
GNU 链接脚本语法 https://sourceware.org/binutils/docs/ld/LD-Index.html
*/
ENTRY(reset_vector) /*指定程序入口地址*/
INCLUDE board.ld // > ram 指的是要大于 ram这个地址, ram在board.ld中定义 INCLUDE board.ld // > ram 指的是要大于 ram这个地址, ram在board.ld中定义
/* 这是脚本中最重要的命令了,所有的LD脚本都会有这个命令,用来指定如何将输入文件映射到输出文件等等 */ /* SECTIONS 是脚本中最重要的命令,所有的LD脚本都会有这个命令,用来指定如何将输入文件映射到输出文件等等 */
SECTIONS SECTIONS
{ {
_start = .; //节地址是指该节的VMA地址。如果改地未明确指定,连接器会在考虑严格对齐情况下,首先按照region参数分配内存,其次根据当前位置计数器向下分地址。
_start = .; //特殊符号.指示当前位置计数器 此处刚开始表示为 0
.set_sysinit_set : { .set_sysinit_set : {
__start_set_sysinit_set = ABSOLUTE(.); __start_set_sysinit_set = ABSOLUTE(.);
KEEP (*(.set_sysinit_set))//在连接命令行内使用了选项–gc-sections后,连接器可能将某些它认为没用的section过滤掉,此时就有必要强制连接器保留一些特定的 section,可用KEEP()关键字达此目的。 KEEP (*(.set_sysinit_set))//在连接命令行内使用了选项–gc-sections后,连接器可能将某些它认为没用的section过滤掉
__stop_set_sysinit_set = ABSOLUTE(.); __stop_set_sysinit_set = ABSOLUTE(.);//此时就有必要强制连接器保留一些特定的 section,可用KEEP()关键字达此目的。
} > ram } > ram
.got ALIGN(0x4) : { *(.got.plt) *(.got) } > ram .got ALIGN(0x4) : { *(.got.plt) *(.got) } > ram
...@@ -53,9 +57,9 @@ SECTIONS ...@@ -53,9 +57,9 @@ SECTIONS
.ARM.exidx ALIGN(0x8) : { __exidx_start = .; *(.ARM.exidx* .gnu.linkonce.armexidx.*) ;__exidx_end = .;} > ram .ARM.exidx ALIGN(0x8) : { __exidx_start = .; *(.ARM.exidx* .gnu.linkonce.armexidx.*) ;__exidx_end = .;} > ram
/* text/read-only data */ /* text/read-only data */
.text ALIGN(0x1000) : { .text ALIGN(0x1000) : { //代码区 按4K对齐
__text_start = .; __text_start = .; //当前位置为 __text_start 开始位置
*(.text* .sram.text.glue_7* .gnu.linkonce.t.*) *(.text* .sram.text.glue_7* .gnu.linkonce.t.*) //*(.text)
} > ram } > ram
.rel.text : { *(.rel.text) *(.rel.text.*) *(.rel.gnu.linkonce.t*) } > ram .rel.text : { *(.rel.text) *(.rel.text.*) *(.rel.gnu.linkonce.t*) } > ram
......
git add -A git add -A
git commit -m ' 汇编切到main后的模块注释 git commit -m ' 完善链接脚本的注解
百图画鸿蒙 + 百文说内核 + 百万注源码 => 挖透鸿蒙内核源码 百图画鸿蒙 + 百文说内核 + 百万注源码 => 挖透鸿蒙内核源码
鸿蒙研究站 | http://weharmonyos.com (国内) 鸿蒙研究站 | http://weharmonyos.com (国内)
| https://weharmony.github.io (国外) | https://weharmony.github.io (国外)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册