Как портировать fork() в Vxwork
Я портирую программу с GNU/Linux на VxWorks, у меня проблема с fork()
и я не могу найти альтернативы; API VxWork обеспечивает два полезных вызова taskSpawn( )
а также rtpSpawn( )
Spwan RTP/Task, но эти API НЕ дублируют вызывающий процесс (fork делает). у кого-нибудь есть идея о портировании / обходном пути fork() в Vxworks?
2 ответа
Если я правильно помню свой vxWork - вы не сможете. Для fork() требуется управление виртуальной памятью, что, как я полагаю, VxWorks 5.5 не обеспечивает, по крайней мере, не полная семантика, необходимая для реализации fork. (он был добавлен в vxwork 6, хотя, если я не ошибаюсь).
Я ничего не знаю о модели памяти VxWorks, но может быть невозможно портировать fork. Причина этого заключается в том, что когда процесс разветвляется, память исходного процесса копируется в новый процесс. Важно отметить, что два процесса должны использовать одни и те же внутренние виртуальные адреса, иначе такие вещи, как указатели, могут сломаться.
Очевидно, что два процесса должны иметь разные физические адреса, что означает, что для разветвления требуется один - платформа с модулем управления памятью (MMU), а ядро должно поддерживать модель памяти, которая позволяет программам использовать одни и те же виртуальные адреса. Вот почему не существует вилочного эквивалента для создания нового потока.
В дополнение к этому, копирование большого процесса может быть очень дорогим. Так что Linux использует то, что называется копированием при записи. Это означает, что все, что делает форк - это помечает все страницы памяти только для чтения. При попытке записи генерируется прерывание, и только после этого копируется страница памяти.
Маловероятно, что ОС реального времени ОС реального времени будет поддерживать копирование при записи, поскольку это означает, что время записи в память не ограничено и нарушает гарантии ОС в реальном времени.
Поэтому гораздо проще вообще не поддерживать fork, просто внедрить API для порождения совершенно новых процессов без дублирования.