From 9b7c33c96e0514368ca97e0a7a069cd14f72f371 Mon Sep 17 00:00:00 2001 From: kuangyufei Date: Tue, 24 May 2022 11:23:30 +0800 Subject: [PATCH] =?UTF-8?q?=20=E5=AE=8C=E5=96=84=E9=93=BE=E6=8E=A5?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E7=9A=84=E6=B3=A8=E8=A7=A3=20=20=20=20=20?= =?UTF-8?q?=E7=99=BE=E5=9B=BE=E7=94=BB=E9=B8=BF=E8=92=99=20+=20=E7=99=BE?= =?UTF-8?q?=E6=96=87=E8=AF=B4=E5=86=85=E6=A0=B8=20+=20=E7=99=BE=E4=B8=87?= =?UTF-8?q?=E6=B3=A8=E6=BA=90=E7=A0=81=20=20=3D>=20=E6=8C=96=E9=80=8F?= =?UTF-8?q?=E9=B8=BF=E8=92=99=E5=86=85=E6=A0=B8=E6=BA=90=E7=A0=81=20=20=20?= =?UTF-8?q?=20=20=E9=B8=BF=E8=92=99=E7=A0=94=E7=A9=B6=E7=AB=99=20|=20http:?= =?UTF-8?q?//weharmonyos.com=20(=E5=9B=BD=E5=86=85)=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20|=20https://weharmony.github.io=20(?= =?UTF-8?q?=E5=9B=BD=E5=A4=96)=20=20=20=20=20oschina=20|=20https://my.osch?= =?UTF-8?q?ina.net/weharmony=20=20=20=20=20=E5=8D=9A=E5=AE=A2=E5=9B=AD=20|?= =?UTF-8?q?=20https://www.cnblogs.com/weharmony/=20=20=20=20=20=E7=9F=A5?= =?UTF-8?q?=E4=B9=8E=20|=20https://www.zhihu.com/people/weharmonyos=20=20?= =?UTF-8?q?=20=20=20csdn=20|=20https://blog.csdn.net/kuangyufei=20=20=20?= =?UTF-8?q?=20=2051cto=20|=20https://harmonyos.51cto.com/column/34=20=20?= =?UTF-8?q?=20=20=20=E6=8E=98=E9=87=91=20|=20https://juejin.cn/user/756888?= =?UTF-8?q?642000808=20=20=20=20=20=E5=85=AC=E4=BC=97=E5=8F=B7=20|=20?= =?UTF-8?q?=E9=B8=BF=E8=92=99=E7=A0=94=E7=A9=B6=E7=AB=99=20(weharmonyos)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- arch/arm/arm/src/startup/reset_vector_mp.S | 7 +++--- kernel/base/include/los_vm_zone.h | 8 +++---- platform/board.ld.S | 25 +++++++++++---------- tools/build/liteos.ld | 26 +++++++++++++--------- zzz/git/push.sh | 2 +- 5 files changed, 37 insertions(+), 31 deletions(-) diff --git a/arch/arm/arm/src/startup/reset_vector_mp.S b/arch/arm/arm/src/startup/reset_vector_mp.S index 59c0e6d2..71d4942b 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 bced0b57..9bbd96f7 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 f9c76a3e..5576df7d 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 83a29e48..908c600f 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 5a3f0e38..f1581873 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 (国外) -- GitLab