我正在为自定义裸机 ARM 系统编写静态分页设置。 ARMv7a 使用二级分页,其中顶级页表中的条目可以指向二级表。我有一个顶级表和几个二级表,我需要将它们链接在一起,它们都在同一个 .S 文件和同一个部分中实现。
顶级表中的“链接条目”应具有以下值:
(second_level_table_addr & 0xfffffc00) | 0x9
-- 获取二级表的基地址,并清除低位并用一些配置位替换它们(详细信息请参见 ARMv7a 手册 B3.5.1)。
我的问题是:重定位后,我可以使用二级表的符号来生成顶级表中的链接条目吗?如果我尝试编写类似
.word (second_level_table_sym & 0xfffffc00) | 0x9
的表达式,则会收到以下错误:invalid operands (.boot_data and *ABS* sections) for &
。
现在我正在做的是手动设置二级表的绝对地址并将它们硬编码在链接条目中。这是可行的,但我觉得随着映射变得更加复杂,维护起来会很困难,而且一般来说,我希望尽可能将二进制布局留给工具链。这在运行时也很容易修复,但不幸的是,这些表将存储在只读内存中,因此这是不可能的。
据我了解,在组装单个文件时(出现错误的点),
second_level_table_sym
的地址是未知的,但在重定位后的最终链接时是已知的。有没有办法让汇编器(GNU arm-eabi-none-as)使用这些知识来生成我想要的表条目?
使用搬迁。让汇编器发出二级表的原始地址,并让链接器应用掩码和配置位。