2012-03-05 4 views
2

새로운 시스템 호출을 추가하는 운영 체제 할당을하고 있습니다. "dumbfork"라고하는 시스템 호출은 copy-on-write 정책을 사용하지 않고 프로세스를 포크해야합니다. 따라서 기본적으로 전체 주소 공간을 하위 프로세스에 복사해야합니다.copy-on-write를 사용하지 않고 do_fork를 호출하는 중

시스템 커널을 설치하고 다시 컴파일 할 수있었습니다. 내 사용자 지정 시스템 호출을 호출 할 수 있지만 실제로 COW 기능을 사용하지 않도록 dumbfork를 구현하는 방법을 모르겠습니다. 소스 코드 중 하나가 sys_vfork이 do_fork를 호출하는 방법을 보여줍니다. 덤프는 sys_vfork와 비슷해야합니다. do_fork의 매개 변수를 어떻게 설정할 수 있는지 모르겠습니다. 나는 sys_fork가 구현되는 방법을 모방하려고 시도했다. 그리고 그것은 NULL 포인터 역 참조 오류를 준다. 누구든지이 문제에 대해 나를 깨우칠 수 있습니까?

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

'sys_vfork'는 원하는 것과 정확히 반대입니다! –

+0

네, 맞습니다. vfork는 플래그 CLONE_VM, CLONE_VFORK 및 SIGCHLD를 do_fork로 전달하고 주소 공간을 공유합니다. 어쨌든 vfork의 자식은 exec 또는 exit를 수행하므로 의미가 있습니다. – NeoJi

답변

0

do_forkfork, vforkclone 및 전화에 사용되는 매우 일반적인 함수이다. 달성하고자하는 것과 가장 유사한 것은 분명히 fork입니다 (clone은 주로 스레드 용이며, vfork은 주소 공간을 전혀 복사하지 않습니다).

귀하의 경우 가장 좋은 해결책은 CLONE_COPY_EVERYTHING_RIGHT_NOW과 같은 새로운 플래그를 수락하는 것입니다. 그런 다음이 플래그가 do_fork으로 전달되었는지 여부에 따라 copy-on-write를 담당하는 코드를 찾아야합니다. 전체 주소 공간을 복사하거나 플래그가 전달되지 않은 경우 원래 시스템 호출 중 하나에서 do_fork이 호출되었음을 나타내는 내용을 찾아야합니다. 기존의 copy-on-write 정책을 사용하십시오. 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); 
} 

This 페이지, 오래된 있지만, 쓰기에 특히 섹션 포크 ICA복사, 매우 도움이 될 수 있습니다. fork 시스템 콜 copy_page_range 중에 호출되는 함수가 있습니다.이 함수는 페이지를 읽기 전용으로 표시합니다. 마치 메모리 복사 코드를 추가 할 때 고려해야 할 장소와 같습니다. 더욱이 함수 do_wp_page은 페이지 폴트 중에 호출되어 이전에 누군가가 쓰기를 원했던 공유 페이지를 복사하기 때문에 그러한 복사가 어떻게 보이는지를 보여주는 좋은 예가 될 수 있습니다.

+0

답변을 주셔서 감사합니다. 그러나 저는 여전히 자세히 설명하지 않습니다. 새 플래그를 사용할 수 있도록 do_fork를 수정해야한다는 것을 의미합니까? 원본 대신 수정 된 do_fork를 사용합니까? 수정 된 do_fork를 사용하려면 새로운 시스템 호출을 위해 전체 fork.c를 복사해야합니다. 맞습니까? – NeoJi

+0

do_fork를 수정하여 이전 시스템 호출 (이전과 같은 방식으로 작동해야하는 새 플래그가없는)과 새 시스템 호출 (플래그가 전달되면 전체 주소 공간을 복사해야 함)에 유용 할 것입니다. . 더 명확하게하기 위해 내 대답을 업데이트했습니다. –