我们先看一下入口地址的确定,同一文件。
SECTIONS
{
/*
* XXX: The linker does not define how output sections are
* assigned to input sections when there are multiple statements
* matching the same input section name. There is no documented
* order of matching.
*
* unwind exit sections must be discarded before the rest of the
* unwind sections get included.
*/
/DISCARD/ : {
*(.ARM.exidx.exit.text)
*(.ARM.extab.exit.text)
ARM_CPU_DISCARD(*(.ARM.exidx.cpuexit.text))
ARM_CPU_DISCARD(*(.ARM.extab.cpuexit.text))
ARM_EXIT_DISCARD(EXIT_TEXT)
ARM_EXIT_DISCARD(EXIT_DATA)
EXIT_CALL
#ifndef CONFIG_MMU
*(.text.fixup)
*(__ex_table)
#endif
#ifndef CONFIG_SMP_ON_UP
*(.alt.smp.init)
#endif
*(.discard)
*(.discard.*)
}
. = PAGE_OFFSET + TEXT_OFFSET;
.head.text : {
_text = .;
HEAD_TEXT
}
这个 SECTIONS 比较长,只放一部分。在这里有个比较重要的东西:
. = PAGE_OFFSET + TEXT_OFFSET;
这一句表示了 Linux 系统真正的启动地址。
PAGE_OFFSET 是 Linux 内核空间的虚拟起始地址,定义在:
linux4.14/arch/arm64/include/asm/memory.h
注意,这里的地址都很重要,很多地方会用到。当然,这里的地址可能会随着 Linux 内核版本的不同和硬件的不同,会变化。这里没有一个具体的数,因为 VA_BITS 中的数字是可选的,大家可以根据自己的平台算一下。
TEXT_OFFSET 定义在:
linux4.14/arch/arm/Makefile 中:
这个值一般是 0x00008000 ,算出 PAGE_OFFSET 后加上这个值就是 Linux 内核的起始地址。
修改这个偏移量就可以使Linux内核拷贝到不同的地址,自己修改注意内存对齐。
全部0条评论
快来发表一下你的评论吧 !