补充链接脚本的注解

    百图画鸿蒙 + 百文说内核 + 百万注源码  => 挖透鸿蒙内核源码
    鸿蒙研究站 | 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)
上级 22a4bdde
此差异已折叠。
......@@ -127,7 +127,7 @@ OsGetArgsAddr:
bx lr
#endif
reset_vector: //鸿蒙开机代码
reset_vector: //内核启动入口
/* clear register TPIDRPRW */
mov r0, #0 //r0 = 0
mcr p15, 0, r0, c13, c0, 4 //复位线程标识符寄存器TPIDRPRW , 不复位将导致系统不能启动
......
......@@ -466,7 +466,7 @@ STATIC INLINE struct Vnode *OsProcessExecVnodeGet(const LosProcessCB *processCB)
extern UINTPTR __user_init_entry; ///< 第一个用户态进程(init)的入口地址 查看 LITE_USER_SEC_ENTRY
extern UINTPTR __user_init_bss; ///< 查看 LITE_USER_SEC_BSS ,赋值由liteos.ld完成
extern UINTPTR __user_init_end; ///< init 进程的用户空间初始化结束地址
extern UINTPTR __user_init_load_addr;///< init进程的加载地址
extern UINTPTR __user_init_load_addr;///< init 进程的加载地址 ,由链接器赋值
extern UINT32 OsSystemProcessCreate(VOID);
extern VOID OsProcessNaturalExit(LosProcessCB *processCB, UINT32 status);
extern VOID OsProcessCBRecycleToFree(VOID);
......
......@@ -92,7 +92,7 @@ SECTIONS
{
/DISCARD/ : { *(.comment .note) } //过滤掉所有输入文件的 .comment .note
.ram_vectors TEXT_BASE : { //内核代码段开始位置
.ram_vectors TEXT_BASE : { //内核中断向量区开始位置,此处用 TEXT_BASE 宏有误导嫌疑, 因为真正的(.text)并不在此 @notethinking
__ram_vectors_vma = .; //定位到当前位置,即TEXT_BASE处
KEEP (*(.vectors)) //告诉链接器 强制保留所有输入文件中的 .vectors
} > ram //中断向量是开机代码的位置 , 可翻看 鸿蒙内核源码分析(开机启动篇) (中断管理篇)
......
......@@ -39,11 +39,11 @@ INCLUDE board.ld // > ram 指放入ram这个地址范围中, ram在board.ld中
SECTIONS
{
//节地址是指该节的VMA地址。如果改地未明确指定,连接器会在考虑严格对齐情况下,首先按照region参数分配内存,其次根据当前位置计数器向下分地址。
_start = .; //特殊符号.指示当前位置计数器 此处刚开始表示为 0
_start = .; //特殊符号 .表示当前位置计数器,即紧挨着中断向量结束的位置
.set_sysinit_set : {
__start_set_sysinit_set = ABSOLUTE(.);
KEEP (*(.set_sysinit_set))//在连接命令行内使用了选项–gc-sections后,连接器可能将某些它认为没用的section过滤掉
__stop_set_sysinit_set = ABSOLUTE(.);//此时就有必要强制连接器保留一些特定的 section,可用KEEP()关键字达此目的。
__start_set_sysinit_set = ABSOLUTE(.); //
KEEP (*(.set_sysinit_set))//所有输入文件中的 .set_sysinit_set 链接到此
__stop_set_sysinit_set = ABSOLUTE(.);//定位结束 .set_sysinit_set 区结束位置
} > ram
.got ALIGN(0x4) : { *(.got.plt) *(.got) } > ram
......@@ -61,7 +61,7 @@ SECTIONS
__text_start = .; //当前位置为 __text_start 开始位置
*(.text* .sram.text.glue_7* .gnu.linkonce.t.*) //*(.text)
} > ram
//重定向代码 Relocation ,包括 代码区和数据区的重定位
.rel.text : { *(.rel.text) *(.rel.text.*) *(.rel.gnu.linkonce.t*) } > ram
.rela.text : { *(.rela.text) *(.rela.text.*) *(.rela.gnu.linkonce.t*) } > ram
.rel.data : { *(.rel.data) *(.rel.data.*) *(.rel.gnu.linkonce.d*) } > ram
......@@ -85,11 +85,11 @@ SECTIONS
.rel.dyn : { *(.rel.dyn) } > ram
.dummy_post_text : {
__text_end = .;
__text_end = .; //代码区结束位置
} > ram
.rodata ALIGN(0x1000) : {
__rodata_start = .;
__rodata_start = .; // 只读数据区开始位置
__kernel_init_level_0 = ABSOLUTE(.);
KEEP(*( SORT (.rodata.init.kernel.0.*)));
__kernel_init_level_1 = ABSOLUTE(.);
......@@ -112,9 +112,9 @@ SECTIONS
KEEP(*( SORT (.rodata.init.kernel.9.*)));
__kernel_init_level_10 = ABSOLUTE(.);
*(.rodata .rodata.* .gnu.linkonce.r.*)
__exc_table_start = .;
__exc_table_start = .; //异常表开始位置
KEEP(*(__exc_table))
__exc_table_end = .;
__exc_table_end = .; //异常表结束位置
} > ram
/*
......@@ -124,31 +124,31 @@ SECTIONS
*/
.dummy_post_rodata : {
_hdf_drivers_start = .;
KEEP(*(.hdf.driver))
KEEP(*(.hdf.driver)) // 统一驱动框架也放在了只读区
_hdf_drivers_end = .;
__rodata_end = .;
__rodata_end = .; //数据只读区结束
} > ram
.data ALIGN(0x1000) : {
/* writable data */
__ram_data_start = .;
__vdso_data_start = LOADADDR(.data);
KEEP(*(.data.vdso.datapage))
. = ALIGN(0x1000);
KEEP(*(.data.vdso.text))
. = ALIGN(0x1000);
__vdso_text_end = .;
__ram_data_start = .; //可写入数据开始位置
__vdso_data_start = LOADADDR(.data); // vdso区 (virtual dynamic shared object)开始位置
KEEP(*(.data.vdso.datapage)) //vdso由数据区+代码区两部分组成, 可翻看 鸿蒙内核源码分析(vdso篇)
. = ALIGN(0x1000);//vdso 的特性是 代码在内核区, 但运行却在用户区
KEEP(*(.data.vdso.text))//vdso 的代码区
. = ALIGN(0x1000);//按4K对齐,因啥要按4K对齐,因为需要页表映射,而一页为4K
__vdso_text_end = .;//vdso区结束位置
*(.data .data.* .gnu.linkonce.d.*)
. = ALIGN(0x4);
KEEP(*( SORT (.liteos.table.*)));
} > ram
.ctors : ALIGN(0x4) {
.ctors : ALIGN(0x4) { //constructor属性 全局构造
__ctor_list__ = .;
KEEP (*(.ctors .init_array))
__ctor_end__ = .;
} > ram
.dtors : ALIGN(0x4) {
.dtors : ALIGN(0x4) { //destructor属性 全局析构
__dtor_list__ = .;
KEEP (*(.dtors .fini_array))
__dtor_end__ = .;
......@@ -159,10 +159,10 @@ SECTIONS
* but not aligned to the next section necessarily.
*/
.dummy_post_data : {
__ram_data_end = .;
__ram_data_end = .; //可写入数据区结束
} > ram
.user_init USER_INIT_VM_START : ALIGN(0x1000) {//开始地址设为 USER_INIT_VM_START
//这里指的是 init 应用程度的位置
.user_init USER_INIT_VM_START : ALIGN(0x1000) {//开始地址设为 USER_INIT_VM_START = 0x1000000;
. = ALIGN(0x4);
__user_init_load_addr = LOADADDR(.user_init);//应用程序的加载地址
__user_init_entry = .;//应用程序的入口地址
......@@ -173,20 +173,20 @@ SECTIONS
__user_init_data = .;//设置数据段开始位置 __user_init_data
KEEP(libuserinit.O (.user.data))
. = ALIGN(0X4);
__user_init_bss = .;//将当前位置给__user_init_bss
__user_init_bss = .;//init 进程的 bss开始位置
KEEP(libuserinit.O (.user.bss))
. = ALIGN(0x1000);
__user_init_end = .;
__user_init_end = .; //init 进程结束位置
} > user_ram AT > ram
__user_init_size = __user_init_end - __user_init_entry;
__user_init_size = __user_init_end - __user_init_entry; //计算init进程占用大小
/* uninitialized data (in same segment as writable data) */
/* uninitialized data (in same segment as writable data) | 未初始化数据 */
.bss : {
. = ALIGN(0x800); //当前位置按 0x800对齐
__int_stack_start = .; //将当前位置给__int_stack_start
__int_stack_start = .; //内核栈开始位置
*(.int_stack);
. = ALIGN(0x4);
. = ALIGN(0x4);//4字节对齐
KEEP(*(.bss.prebss.*))
. = ALIGN(0x8);
__bss_start = .; //将当前位置给__bss_start,将所有的目标*(.bss .bss.*) .. 链接到 .bss中
......@@ -201,8 +201,8 @@ SECTIONS
_end = .;
/* mmu temp page table(sys aviliable mem is start with __bss_end) */
. = ALIGN(0x4000);
__mmu_ttlb_begin = .;
__mmu_ttlb_begin = .;//临时页表开始位置
/* Strip unnecessary stuff */
/DISCARD/ 0 : { *(.comment .note) } > ram
/DISCARD/ 0 : { *(.comment .note) } > ram //过滤不需要的块
}
git add -A
git commit -m ' 完善链接脚本的注解
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.
先完成此消息的编辑!
想要评论请 注册