我正在将程序从GNU / Linux移植到VxWorks,我遇到了fork()
的问题,我无法找到替代方案; VxWork的API为spwan RTP / Task提供了两个有用的调用taskSpawn( )
和rtpSpawn( )
,但这些API不会复制调用进程(fork会这样做)。有没有人知道将fork()移植到Vxworks?
答案 0 :(得分:0)
我对VxWorks内存模型一无所知,但可能无法移植fork。原因是当进程分叉时,原始进程的内存将被复制到新进程中。重要的是,这两个进程必须使用相同的内部虚拟地址,否则指针就会破坏。
显然,这两个进程必须具有不同的物理地址,这意味着为了fork,需要一个具有内存管理单元(MMU)的平台,并且内核必须支持允许程序共享相同虚拟地址的内存模型。这就是为什么没有用于创建新线程的fork等价物。
除此之外,复制大型流程可能非常昂贵。所以Linux使用所谓的copy-on-write。这意味着所有fork都将所有内存页标记为只读。尝试写入时,会产生中断,然后才会复制存储页面。
实时操作系统RTOS不太可能支持写时复制,因为这意味着存储器写入时间不受限制并且违反了操作系统的实时保证。
因此,根本不支持fork就更容易实现API,以便在没有重复的情况下生成全新的流程。
答案 1 :(得分:0)
如果我记得我的vxWork正确 - 你不能。 fork()需要虚拟内存管理,我相信VxWorks 5.5没有提供,至少不是实现fork所需的完整语义。 (虽然如果我没记错的话,它已经在vxwork 6中添加了。)