我有一些在内存有限的系统上运行的C代码。 代码执行基本上有两个阶段,即启动阶段和主阶段。 启动阶段包括生成主阶段使用的一些参数的代码。在主要阶段期间生成数据。
由于启动阶段只运行一次,我想在主阶段重用启动代码用于数据存储的内存空间。
我已经测试了一种处理这个问题的方法:
这有效,但它有它的怪癖。要获取.startup部分中的启动代码和数据,我必须在编译期间使用gcc给出的输入节名称列出它们。
现在我想启用lto(链接时间优化),并且由于输入节名称已更改,因此会破坏上述方法。
考虑测试新方法:
缺点是我无法看到启动代码和主代码如何共享两个阶段中使用的功能。如果共享函数很小,尝试共享它们可能是一个坏主意,因为lto将受到更多限制或最终内联两个版本的共享函数。
有没有人知道这种方法的首选方法或对新建议的方法有任何评论?
答案 0 :(得分:1)
我见过的方法(Rabbit处理器)正在使用叠加层。 [涉及到一些硬件,所以我不确定这个比喻是否完美。]无论如何,[在我脑海中]的概念就像电梯一样。您有少量的程序空间(电梯轿厢),它始终是安全可行的。但是如果你想访问另一个楼层,你会回到电梯(电脑就在那个小地址空间里),然后切换设置以激活另一个存储区。然后你可以离开电梯,进入新的楼层。
你有一个稍微不同的问题(想要使用更少的内存而不是没有足够的地址线),但同样的策略可能适用。
从电梯开始。运行第一个启动代码,该代码设置某些数据值,也可能是在安全区域。撤回电梯。覆盖启动代码空间。现在你可以退出电梯。但是你仍然需要新空间的地址。这些需要存储在某个地方。也许你有两组函数指针,有重叠的地址,一个用于启动,另一个用于主代码。只需在合适的时间使用正确的功能。