0

我正在将程序从 GNU/Linux 移植到 VxWorks,我遇到了一个问题,fork()我找不到替代方案;VxWork 的 API 提供了两个有用的调用taskSpawn( )rtpSpawn( )spwan RTP/Task,但这些 API 不会重复调用过程(fork 会)。有人知道将 fork() 移植到 Vxworks 吗?

VxWorks API 参考

4

2 回答 2

0

我对 VxWorks 内存模型一无所知,但可能无法移植 fork。这样做的原因是,当一个进程被分叉时,原进程的内存被复制到新进程中。重要的是,这两个进程必须使用相同的内部虚拟地址,否则指针之类的东西将会中断。

显然,两个进程必须具有不同的物理地址,这意味着为了分叉,一个需要具有内存管理单元 (MMU) 的平台,并且内核必须支持允许程序共享相同虚拟地址的内存模型。这就是为什么没有用于创建新线程的 fork 等效项的原因。

除此之外,复制大型流程可能非常昂贵。所以 Linux 使用所谓的写时复制。这意味着 fork 所做的只是将所有内存页面标记为只读。当尝试写入时,会产生中断,然后才会复制内存页面。

实时操作系统 RTOS 不太可能支持写入时复制,因为这意味着内存写入时间不受限制并且违反了操作系统的实时保证。

因此,完全不支持分叉要容易得多,只需实现 API 以生成全新的进程而无需重复。

于 2012-10-29T11:18:15.870 回答
0

如果我正确地记得我的 vxWork - 你不能。fork() 需要虚拟内存管理,我相信 VxWorks 5.5 没有提供,至少没有实现 fork 所需的完整语义。(如果我没记错的话,它是在 vxwork 6 中添加的)。

于 2012-10-29T14:58:56.143 回答