머리터지는줄알았고

중간에 포기하고싶었다.

포크 커널쓰 피쓰 모두 두포크 를 사용하고
시스 클론 시스템콜 쓴다

커널쓰레드는 시스템콜없이 직접 두포크 씀.


포크는 쉽고, 복제니까

어려운건 커널스레드랑 피쓰레든데

얘들은 스택이 기존의 것과 다르다.

일단 커널스레드는 스택을 따로지정할필요가 없음. 왜냐? 유저코드가없으니까.
두포크에서 설정하는 스택은 커널스택이 아님.

그래서 커널스레드는 두개의 인자를 따로 보내는데,
하나는 kthread 라는 실행환경, 두번째는 실행환경에 전달할 인자.

그리고 참고로 커널스레드의 생성은 큐에 생성요청을 보내면 kthreadd가 복제함.
번식용 씨퇘지♡ 나듀 kthreadd같은 삶을 살랫!♡♡♡


그다음 피쓰레드.

피쓰레드는 좀 복잡함.

포크는 스택복사, 커널쓰는 스택사실상 없음. 이라면 피쓰레드는 유저스택을 만들어야함.

별거없음.

일단 유저스택에 start_thread 라는 실행환경, 그리고 그 실행환경에 전달할 인자.
를 스택에다가 생성함.
인자안에는 핸들러와 핸들러에 전달할 인자가 있음

그러면 새로운 쓰레드는 ret_from_fork 로 가게 되어있음.
얘는 부모의 레지스터를 복사했기땜에 부모의 lr레지스터,
즉 sys clone 시스템콜 직후로 점프함. 단 이 맥락은 피쓰레드한정임. 모두 시스클론을 호출하는데, 시스콜직후맥락은 피쓰레드한정.

그 직후에 리턴값을보고 0 즉 자식이면
스택에서 값을 꺼내와서

실행환경에 인자 집어넣음.

핸들러는 인자안에 들어있음. 글구 핸들러의 인자도 있음.

핸들러(핸들러인자) 실행함.


후 끝.

찐 포크같은경우는 그냥 시스 클론 바로적용해도 문제없더라

스택 변경하지마라.
스택변경은 피쓰레드땜에 있는거다.

글구 스택이랑관련없지만 커널쓰레드쪽에 인자로 쓰기 위함