我最近接到一个VOS客户的问题,他想知道如何让他的共享虚拟内存区域在他的传统非POSIX程序和新的基于POSIX的程序之间保持一致。
该客户使用create_data_object命令创建了几个不同的共享虚拟内存区域。 然后他使用绑定控制文件来确保每个程序以相同的顺序和相同的虚拟地址引用这些区域。 问题是,无论他如何使用gcc命令来绑定他的新的、基于POSIX的程序,他都无法让SVM区域对齐。新程序将SVM区域放在不同的地址。 即使使用gcc的bindfile也无济于事。
通过绑定图(或display_program_module命令的输出)可以发现,POSIX程序总是以"s_start_c_program"和"crti"对象模块开始。 s_start_c_program对象模块在遗留程序中出现的时间较晚,而crti对象模块根本没有出现。 这两个对象模块的出现,会把文件中后续的对象模块都推倒重来,从而导致错位。
没有办法阻止gcc把这两个对象模块放在程序模块的第一位。所以,解决的办法是改变传统程序的绑定方式。 由于SVM区域必须从页边界开始,而s_start_c_program和crti代码区域的总大小小于一页,所以我们需要做的就是在遗留程序的开始处多分配一个未使用的页。 使用create_data_object命令创建一个4096字节的数据对象,并将其作为第一个对象模块放入绑定控制文件中。
我们同意将这两个程序的大小控制在1页(4096)字节或更少,所以这个解决方案将继续工作。
如果你对这个技术有什么疑问,请在下面发帖。