很快,我需要将一个部分放在另一个部分。尽管这些部分应该位于不同的虚拟地址空间中,但这是一个问题。
详细: 有两段代码。一节(引导)在禁用MMU的情况下有效,应链接在一起,以便虚拟地址和物理地址相同。启用MMU(应用程序)且虚拟地址与物理地址偏移时,另一部分有效。
从物理上讲,两个部分都应该一个接一个地放置。
这是我正在努力解决的链接描述文件的一部分
MEMORY {
DDR_MEMORY : ORIGIN = 0x00002000, LENGTH = 0xFFFFFF
APP_VMA : ORIGIN = 0xFF002000, LENGTH = 0xFFFFFF
BOOT_LMA : ORIGIN = 0x00002000, LENGTH = 0xFFFFFF
}
SECTIONS
{
.boot : {
*(.startup)
} >BOOT_LMA AT>DDR_MEMORY
.app : {
*(.text)
*(.text*)
} >APP_VMA AT>DDR_MEMORY
}
结果是: 假设“启动”代码为0x5C字节。因此,引导部分链接为虚拟和物理0x2000-0x205C。
应用代码应位于引导部分的后面,我希望将其放置在0xFF002060(虚拟)和0x2060(物理)处。但是我得到的APP_VMA
是 0xFF002000 (没有0x60偏移),其物理位置是 0x2060 (这与预期的一样)。
所以问题是如何为APP_VMA添加偏移量,以获取与物理地址匹配的虚拟地址(例如0xFF002060)?
谢谢。
PS:我使用的是clang链接程序,但几乎可以肯定,它也适用于gcc。
答案 0 :(得分:0)
很快,解决方案是添加一个“ phony”部分,以递增APP_VMA
和DDR_MEMORY
链接器计数器。
我添加了一个新的部分,其大小为'boot'部分,该部分增加了链接器计数器,并强制链接器将'app'放置在正确的虚拟地址空间中并位于引导部分的后面。
MEMORY {
DDR_MEMORY : ORIGIN = 0x00002000, LENGTH = 0xFFFFFF
APP_VMA : ORIGIN = 0xFF002000, LENGTH = 0xFFFFFF
BOOT_LMA : ORIGIN = 0x00002000, LENGTH = 0xFFFFFF
}
PHDRS
{
mmu_on PT_LOAD;
no_mmu PT_LOAD;
}
SECTIONS
{
.boot : {
*(.startup)
_boot_sizeof = SIZEOF(.boot);
} >BOOT_LMA : no_mmu
.boot_phony : {
. += _boot_sizeof ;
/* Reserve a space to adjust counters APP_VMA and DDR_MEMORY */
} >APP_VMA AT>DDR_MEMORY :no_mmu
.app : {
*(.text)
*(.text*)
} >APP_VMA AT>DDR_MEMORY : mmu_on
}