diff --git a/arch/arm/arm/src/startup/reset_vector_mp.S b/arch/arm/arm/src/startup/reset_vector_mp.S index 59c0e6d2239ab127803e07ea027fa6717cf9f30c..71d4942b9d9d6955d746bee1dc5feb31c0fc03fb 100644 --- a/arch/arm/arm/src/startup/reset_vector_mp.S +++ b/arch/arm/arm/src/startup/reset_vector_mp.S @@ -71,7 +71,8 @@ .equ MPIDR_CPUID_MASK, 0xffU //#define MPIDR_CPUID_MASK 0xffU .fpu neon-vfpv4 //支持的浮点处理器 - .syntax unified + .syntax unified //.syntax命令是ARM架构独有的命令,指按照怎样的语法规则进行汇编 , unified表示ARM和THUMB指令使用统一的语法 + //一般会使用unified , 以减少汇编器的报错 .arch armv7-a //支持芯片指令集 .arm //支持CPU架构 @@ -454,8 +455,8 @@ stack_init: ldr r3, =OS_STACK_INIT /* Main loop sets 32 bytes at a time. | 主循环一次设置 32 个字节*/ stack_init_loop: - .irp offset, #0, #8, #16, #24 - strd r2, r3, [r0, \offset] /* 等价于strd r2, r3, [r0, 0], strd r2, r3, [r0, 8], ... , strd r2, r3, [r0, 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, 16] , strd r2, r3, [r0, 24] */ .endr add r0, #32 //加跳32个字节,说明在地址范围上 r1 > r0 ==> __exc_stack_top > __svc_stack cmp r0, r1 //是否到栈底 diff --git a/kernel/base/include/los_vm_zone.h b/kernel/base/include/los_vm_zone.h index bced0b576398700c093c5d54d22a79426d60daf6..9bbd96f7f6aaac7f2e9bf2f7108f1d7fa04eb3ec 100644 --- a/kernel/base/include/los_vm_zone.h +++ b/kernel/base/include/los_vm_zone.h @@ -132,7 +132,7 @@ extern "C" { #ifdef LOSCFG_KERNEL_MMU // #ifdef LOSCFG_TEE_ENABLE -#define KERNEL_VADDR_BASE 0x41000000 +#define KERNEL_VADDR_BASE 0x41000000 //用于链接器层面的宏配置 | 基地址 #else #define KERNEL_VADDR_BASE 0x40000000 #endif @@ -148,10 +148,10 @@ extern "C" { #define _U32_C(X) X##U #define U32_C(X) _U32_C(X) -#define KERNEL_VMM_BASE U32_C(KERNEL_VADDR_BASE) ///< 速度快,使用cache -#define KERNEL_VMM_SIZE U32_C(KERNEL_VADDR_SIZE) +#define KERNEL_VMM_BASE U32_C(KERNEL_VADDR_BASE) ///< 内核内存管理层面的宏配置 | 基地址 +#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 ///< 内核空间大小 /* Uncached vmm aspace */ diff --git a/platform/board.ld.S b/platform/board.ld.S index f9c76a3ee53bb443260a6706b403fb7725f6d02e..5576df7d16dd2ff123871611353d6c11977e51ef 100644 --- a/platform/board.ld.S +++ b/platform/board.ld.S @@ -58,6 +58,7 @@ USER_INIT_VM_START = 0x1000000; ***********************************************/ /* https://www.jianshu.com/p/42823b3b7c8e +https://sourceware.org/binutils/docs/ld/MEMORY.html MEMORY:内存布局,描述板上的存储器位置 语法为 NAME1 [(ATTR)] : ORIGIN = ORIGIN1, LENGTH = LEN2 @@ -81,22 +82,22 @@ LENGTH :关键字,区域的大小,可简写成len 或l OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") OUTPUT_ARCH(arm) - -MEMORY +MEMORY //链接器的默认配置允许分配所有可用内存,描述链接器可以使用哪些内存区域 { //ram,sram为存储区域的名字,可以随意取 - ram : ORIGIN = KERNEL_VADDR_BASE, LENGTH = KERNEL_VADDR_SIZE - sram : ORIGIN = 0x40000000, LENGTH = 0x1000 - user_ram : ORIGIN = 0x1000000, LENGTH = 0x100000 + ram : ORIGIN = KERNEL_VADDR_BASE, LENGTH = KERNEL_VADDR_SIZE //用户空间范围 + sram : ORIGIN = 0x40000000, LENGTH = 0x1000 + user_ram : ORIGIN = 0x1000000, LENGTH = 0x100000 //用户空间内存范围 USER_ASPACE_BASE ,此大小不是真正最后映射到用户空间的大小 } SECTIONS { - /DISCARD/ : { *(.comment .note) } //过滤掉 .comment .note 段 + /DISCARD/ : { *(.comment .note) } //过滤掉所有输入文件的 .comment .note 段 - .ram_vectors TEXT_BASE : { - __ram_vectors_vma = .; - KEEP (*(.vectors)) + .ram_vectors TEXT_BASE : { //内核代码段开始位置 + __ram_vectors_vma = .; //定位到当前位置,即TEXT_BASE处 + KEEP (*(.vectors)) //告诉链接器 强制保留所有输入文件中的 .vectors 节 } > ram - __ram_vectors_lma = LOADADDR(.ram_vectors); + __ram_vectors_lma = LOADADDR(.ram_vectors);//加载地址和链接地址一致,说明内核设计者希望从加载地址处运行指令 } - -USER_INIT_VM_START = 0x1000000; +//LMA:加载存储地址,指加载到存储器的地址,即加载或烧写到哪里 +//VMA:虚拟存储地址,也就是链接地址,即代码和数据运行的时候应在哪里 +USER_INIT_VM_START = 0x1000000; //用户空间初始地址 diff --git a/tools/build/liteos.ld b/tools/build/liteos.ld index 83a29e48e5b73affe9902b013ddd250e0c53979d..908c600f025e0370843bec35ea829653a24e3ee7 100644 --- a/tools/build/liteos.ld +++ b/tools/build/liteos.ld @@ -29,17 +29,21 @@ * 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中定义 -/* 这是脚本中最重要的命令了,所有的LD脚本都会有这个命令,用来指定如何将输入文件映射到输出文件等等 */ -SECTIONS -{ - _start = .; +/* SECTIONS 是脚本中最重要的命令,所有的LD脚本都会有这个命令,用来指定如何将输入文件映射到输出文件等等 */ +SECTIONS +{ + //节地址是指该节的VMA地址。如果改地未明确指定,连接器会在考虑严格对齐情况下,首先按照region参数分配内存,其次根据当前位置计数器向下分地址。 + _start = .; //特殊符号.指示当前位置计数器 此处刚开始表示为 0 .set_sysinit_set : { __start_set_sysinit_set = ABSOLUTE(.); - KEEP (*(.set_sysinit_set))//在连接命令行内使用了选项–gc-sections后,连接器可能将某些它认为没用的section过滤掉,此时就有必要强制连接器保留一些特定的 section,可用KEEP()关键字达此目的。 - __stop_set_sysinit_set = ABSOLUTE(.); + KEEP (*(.set_sysinit_set))//在连接命令行内使用了选项–gc-sections后,连接器可能将某些它认为没用的section过滤掉 + __stop_set_sysinit_set = ABSOLUTE(.);//此时就有必要强制连接器保留一些特定的 section,可用KEEP()关键字达此目的。 } > ram .got ALIGN(0x4) : { *(.got.plt) *(.got) } > ram @@ -53,9 +57,9 @@ SECTIONS .ARM.exidx ALIGN(0x8) : { __exidx_start = .; *(.ARM.exidx* .gnu.linkonce.armexidx.*) ;__exidx_end = .;} > ram /* text/read-only data */ - .text ALIGN(0x1000) : { - __text_start = .; - *(.text* .sram.text.glue_7* .gnu.linkonce.t.*) + .text ALIGN(0x1000) : { //代码区 按4K对齐 + __text_start = .; //当前位置为 __text_start 开始位置 + *(.text* .sram.text.glue_7* .gnu.linkonce.t.*) //*(.text) } > ram .rel.text : { *(.rel.text) *(.rel.text.*) *(.rel.gnu.linkonce.t*) } > ram diff --git a/zzz/git/push.sh b/zzz/git/push.sh index 5a3f0e3808e746c7dcc8ceafbf8363d034364175..f1581873d6e206adac2b04ca183be5ec79c97a1f 100644 --- a/zzz/git/push.sh +++ b/zzz/git/push.sh @@ -1,5 +1,5 @@ git add -A -git commit -m ' 汇编切到main后的模块注释 +git commit -m ' 完善链接脚本的注解 百图画鸿蒙 + 百文说内核 + 百万注源码 => 挖透鸿蒙内核源码 鸿蒙研究站 | http://weharmonyos.com (国内) | https://weharmony.github.io (国外)