赞
踩
从头看起,看有没有什么改变。
harmonyos/kernel/liteos_a/arch/arm/arm/src/startup/下有 reset_vector_mp.S 、reset_vector_up.S两个文件,一下子看不出来啥区别,但在harmonyos/kernel/liteos_a/platform/main.c中有
#if (LOSCFG_KERNEL_SMP == YES)
" * %d\n"
"Run Mode : SMP\n"
#else
"\n"
"Run Mode : UP\n"
#endif
所以reset_vector_up.S可以理解为单核的vectors代码, reset_vector_mp.S为多核SMP方式的vectors代码。
为了解SMP,选择HI3516DV300,选择看reset_vector_mp.S。
先了解LDS链接脚本在哪,搜索vectors,在harmonyos/kernel/liteos_a/platform/下的board.ld.S
#include "include/board.h"
#define TEXT_BASE KERNEL_VADDR_BASE
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
MEMORY
{
ram : ORIGIN = KERNEL_VADDR_BASE, LENGTH = KERNEL_VADDR_SIZE
sram : ORIGIN = 0x40000000, LENGTH = 0x1000
user_ram : ORIGIN = 0x1000000, LENGTH = 0x100000
}
SECTIONS
{
/DISCARD/ : { *(.comment .note) }
.ram_vectors TEXT_BASE : {
__ram_vectors_vma = .;
KEEP (*(.vectors))
} > ram
__ram_vectors_lma = LOADADDR(.ram_vectors);
}
USER_INIT_VM_START = 0x1000000;
内存有ram、sram、user_ram三段
KERNEL_VADDR_BASE 为 0x40000000,KERNEL_VADDR_SIZE为0x20000000(512MB)
没看到.data .bss相关的,说明还有,board.ld.S预编译为board.ld,搜索board.ld,在kernel/liteos_a/tools/build/下,有liteos.ld、liteos_llvm.ld,使用SDK的gcc,选择liteos.ld
ENTRY(reset_vector)
INCLUDE board.ld
SECTIONS
{
_start = .;
.set_sysinit_set : {
__start_set_sysinit_set = ABSOLUTE(.);
KEEP (*(.set_sysinit_set))
__stop_set_sysinit_set = ABSOLUTE(.);
} > ram
.got ALIGN(0x4) : { *(.got.plt) *(.got) } > ram
.gcc_except_table ALIGN (0x8) : { . = .; } > ram .gcc_except_table : { KEEP(*(.gcc_except_table*)) }
.exception_ranges ALIGN (0x8) : ONLY_IF_RW { *(.exception_ranges .exception_ranges*) } > ram
.ARM.extab ALIGN(0x4) : { *(.ARM.extab* .gnu.linkonce.armextab.*) } > ram
/* .ARM.exidx is sorted, so has to go in its own output section. */
.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.*)
} > ram
.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
.rela.data : { *(.rela.data) *(.rela.data.*) *(.rela.gnu.linkonce.d*) } > ram
.rel.rodata : { *(.rel.rodata) *(.rel.rodata.*) *(.rel.gnu.linkonce.r*) } > ram
.rela.rodata : { *(.rela.rodata) *(.rela.rodata.*) *(.rela.gnu.linkonce.r*) } > ram
.rel.got : { *(.rel.got) } > ram
.rela.got : { *(.rela.got) } > ram
.rel.ctors : { *(.rel.ctors) } > ram
.rela.ctors : { *(.rela.ctors) } > ram
.rel.dtors : { *(.rel.dtors) } > ram
.rela.dtors : { *(.rela.dtors) } > ram
.rel.init : { *(.rel.init) } > ram
.rela.init : { *(.rela.init) } > ram
.rel.fini : { *(.rel.fini) } > ram
.rela.fini : { *(.rela.fini) } > ram
.rel.bss : { *(.rel.bss) } > ram
.rela.bss : { *(.rela.bss) } > ram
.rel.plt : { *(.rel.plt) } > ram
.rela.plt : { *(.rela.plt) } > ram
.rel.dyn : { *(.rel.dyn) } > ram
.dummy_post_text : {
__text_end = .;
} > ram
.rodata ALIGN(0x1000) : {
__rodata_start = .;
*(.rodata .rodata.* .gnu.linkonce.r.*)
__exc_table_start = .;
KEEP(*(__exc_table))
__exc_table_end = .;
} > ram
/*
* extra linker scripts tend to insert sections just after .rodata,
* so we want to make sure this symbol comes after anything inserted above,
* but not aligned to the next section necessarily.
*/
.dummy_post_rodata : {
_hdf_drivers_start = .;
KEEP(*(.hdf.driver))
_hdf_drivers_end = .;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。