вызов do_fork с отключенным копированием при записи - PullRequest
2 голосов
/ 05 марта 2012

Я выполняю задание операционной системы, которое добавляет новый системный вызов. Системный вызов, который называется "dumbfork", должен быть обработан без использования политики копирования при записи. Таким образом, в основном он должен скопировать все адресное пространство в дочерний процесс.

Мне удалось настроить и перекомпилировать ядро ​​системы. Я могу вызвать свой системный вызов, но я не знаю, как на самом деле реализовать гантель, чтобы отключить функцию COW. Один из исходных кодов показывает мне, как sys_vfork вызывает do_fork. Dumbfork должен быть похож на sys_vfork. Я не знаю, как я могу установить параметры do_fork. Я попытался имитировать, как реализован sys_fork, и это дает мне ошибку разыменования нулевого указателя. Может ли кто-нибудь просветить меня по этой проблеме.

asmlinkage long sys_dumbfork(struct pt_regs *regs)
{
  return do_fork(SIGCHLD, regs->sp, regs, 0, NULL, NULL);
}

1 Ответ

0 голосов
/ 05 марта 2012

do_fork - это очень общая функция, которая используется в вызовах fork, vfork и clone. Наиболее похоже на то, что вы хотите достичь, это, очевидно, fork (clone в основном предназначен для потоков, vfork вообще не копирует адресное пространство).

В вашем случае лучшее решение, по-видимому, - do_fork принять новый флаг, что-то вроде CLONE_COPY_EVERYTHING_RIGHT_NOW. Затем вы должны найти код, отвечающий за копирование при записи и в зависимости от того, был ли этот флаг передан в do_fork: копировать все пространство адреса или (если флаг не был передан, что будет означать, что do_fork был вызван из одного из исходные системные вызовы) использовать существующую политику копирования при записи. Ваш системный вызов dumbfork будет выглядеть почти так же, как вызов fork, за исключением дополнительного флага.

asmlinkage int sys_dumbfork(struct pt_regs *regs)
{
     return do_fork(CLONE_COPY_EVERYTHING_RIGHT_NOW | SIGCHLD, regs->sp, regs, 0, NULL, NULL);
}

Эта страница , хотя и устарела, может быть очень полезной, особенно разделы Fork ICA и Копировать при записи . Во время fork syscall copy_page_range есть функция, которая помечает страницы только для чтения. Это похоже на то место, которое вы должны рассмотреть для добавления вашего кода копирования памяти. Кроме того, функция do_wp_page вызывается во время сбоев страниц, чтобы скопировать ранее опубликованную страницу, на которую кто-то хотел написать, что может быть хорошим примером того, как должно выглядеть такое копирование.

...