ZHCADC3B February 2019 – October 2023
“复制表”一词是指 TI 工具链中的一个通用功能,用于促进将数据从离线存储移动到在线存储。离线存储通常是指程序加载的位置;它可以是 ROM、较慢的存储器等等。在线存储通常是指程序运行时数据所在的位置。所复制的数据可以是代码,也可以是变量。复制表 一词是指一个源地址和目标地址表,其中注册了要复制的对象。另外还有一个库函数形式的运行时组件,用于读取该表并执行复制以响应程序中的调用。
复制表有许多应用程序,但最常见的两个是:
复制表机制不是 ABI 的一部分。已初始化变量获取其初始值的方式是通过在链接器和运行时库之间进行约定,这些库需要来自相同的工具链。但是,其他工具链遵循 TI 机制可能会有优势,或者可能需要下游工具来识别格式,因此我们在这里记录下来。
下图展示了该通用机制。在示例中,目标文件包含一个已初始化的段 .mydata。在链接时,用户指定 .myData 具有单独的加载地址和运行地址,并指定为其创建一个复制表条目。链接器从 .mysect 中删除 数据,使其成为一个未初始化段,并分配其地址作为其运行位置。它会创建一个名为 .mydata.load1 的新初始化段,其中包含编码形式的 .mydata‟s 数据,并将其放置在加载位置。它从运行时库中名为 copy_in 的函数进行链接,以在运行时解码和复制数据,以及其他特定于格式的辅助函数。最后,它会创建一个包含复制表的段(示例中为 .ovly1),该复制表是一个指向源数据和目标地址的复制记录序列,以及一个处理程序表(未显示),复制函数使用该处理程序表来选择正确的解码辅助函数。
在运行时,应用程序调用 copy_in 来解压缩并复制数据。copy_in 的实参是与该段关联的复制表的地址。该函数解析该表并执行指定的复制操作。
可以对多个对象进行编码和注册以便复制。每个都会在 .ovly (1) 段中生成自己的复制表。
可能有一些变化: