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
вызывается во время сбоев страниц, чтобы скопировать ранее опубликованную страницу, на которую кто-то хотел написать, что может быть хорошим примером того, как должно выглядеть такое копирование.