完善链接脚本的注解

    百图画鸿蒙 + 百文说内核 + 百万注源码  => 挖透鸿蒙内核源码
    鸿蒙研究站 | 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 @@
.equ MPIDR_CPUID_MASK, 0xffU //#define MPIDR_CPUID_MASK 0xffU
.fpu neon-vfpv4 //支持的浮点处理器
.syntax unified
.syntax unified //.syntax命令是ARM架构独有的命令,指按照怎样的语法规则进行汇编 , unified表示ARMTHUMB指令使用统一的语法
//一般会使用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 //是否到栈底
......
......@@ -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 */
......
......@@ -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; //用户空间初始地址
......@@ -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
......
git add -A
git commit -m ' 汇编切到main后的模块注释
git commit -m ' 完善链接脚本的注解
百图画鸿蒙 + 百文说内核 + 百万注源码 => 挖透鸿蒙内核源码
鸿蒙研究站 | http://weharmonyos.com (国内)
| https://weharmony.github.io (国外)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册