在考虑如何为 80286 程序实现链接器时,我遇到了以下问题:
给定一个整数n和一组节,其中每个节的大小不大于n,找到S的分区数最少的分区,使得每个分区中节大小的总和不超过n。
当试图在 16 位保护模式下将目标文件链接到 80286 体系结构的程序时会出现此问题。这种架构每个段最多有 65536 字节,复杂的程序需要分成多个段。链接器试图将程序安排到尽可能少的段中,因为每个段对应于操作系统段描述符表中的一个条目。请考虑这个问题,而不考虑 16 位保护模式已过时的事实。
作为这个问题的一个并发症,可以考虑链接程序的调用图。考虑到代码段的每次更改都会产生一些损失(CPU 必须在段描述符表中查找新段),链接器可以尝试将函数分组到同一段中,并相互调用。当调用图由预期的调用次数加权时,链接器可以尝试将程序划分为段,以便跨段边界的调用图的边具有最低的和/平方和。
问题
- 我有预感,原来的问题可能很容易成为 NP 难题,但我不确定如何证明这一点。NP难吗?
- 有没有一种快速算法来近似一个好的解决方案?
- 是否有解决第二个问题或近似一个好的解决方案的算法?
- 我很欣赏有关将代码分配到段的主题的进一步材料的指针。