머리터지는줄알았고
중간에 포기하고싶었다.
포크 커널쓰 피쓰 모두 두포크 를 사용하고
시스 클론 시스템콜 쓴다
커널쓰레드는 시스템콜없이 직접 두포크 씀.
포크는 쉽고, 복제니까
어려운건 커널스레드랑 피쓰레든데
얘들은 스택이 기존의 것과 다르다.
일단 커널스레드는 스택을 따로지정할필요가 없음. 왜냐? 유저코드가없으니까.
두포크에서 설정하는 스택은 커널스택이 아님.
그래서 커널스레드는 두개의 인자를 따로 보내는데,
하나는 kthread 라는 실행환경, 두번째는 실행환경에 전달할 인자.
그리고 참고로 커널스레드의 생성은 큐에 생성요청을 보내면 kthreadd가 복제함.
번식용 씨퇘지♡ 나듀 kthreadd같은 삶을 살랫!♡♡♡
그다음 피쓰레드.
피쓰레드는 좀 복잡함.
포크는 스택복사, 커널쓰는 스택사실상 없음. 이라면 피쓰레드는 유저스택을 만들어야함.
별거없음.
일단 유저스택에 start_thread 라는 실행환경, 그리고 그 실행환경에 전달할 인자.
를 스택에다가 생성함.
인자안에는 핸들러와 핸들러에 전달할 인자가 있음
그러면 새로운 쓰레드는 ret_from_fork 로 가게 되어있음.
얘는 부모의 레지스터를 복사했기땜에 부모의 lr레지스터,
즉 sys clone 시스템콜 직후로 점프함. 단 이 맥락은 피쓰레드한정임. 모두 시스클론을 호출하는데, 시스콜직후맥락은 피쓰레드한정.
그 직후에 리턴값을보고 0 즉 자식이면
스택에서 값을 꺼내와서
실행환경에 인자 집어넣음.
핸들러는 인자안에 들어있음. 글구 핸들러의 인자도 있음.
핸들러(핸들러인자) 실행함.
후 끝.
찐 포크같은경우는 그냥 시스 클론 바로적용해도 문제없더라
스택 변경하지마라.
스택변경은 피쓰레드땜에 있는거다.
글구 스택이랑관련없지만 커널쓰레드쪽에 인자로 쓰기 위함
중간에 포기하고싶었다.
포크 커널쓰 피쓰 모두 두포크 를 사용하고
시스 클론 시스템콜 쓴다
커널쓰레드는 시스템콜없이 직접 두포크 씀.
포크는 쉽고, 복제니까
어려운건 커널스레드랑 피쓰레든데
얘들은 스택이 기존의 것과 다르다.
일단 커널스레드는 스택을 따로지정할필요가 없음. 왜냐? 유저코드가없으니까.
두포크에서 설정하는 스택은 커널스택이 아님.
그래서 커널스레드는 두개의 인자를 따로 보내는데,
하나는 kthread 라는 실행환경, 두번째는 실행환경에 전달할 인자.
그리고 참고로 커널스레드의 생성은 큐에 생성요청을 보내면 kthreadd가 복제함.
번식용 씨퇘지♡ 나듀 kthreadd같은 삶을 살랫!♡♡♡
그다음 피쓰레드.
피쓰레드는 좀 복잡함.
포크는 스택복사, 커널쓰는 스택사실상 없음. 이라면 피쓰레드는 유저스택을 만들어야함.
별거없음.
일단 유저스택에 start_thread 라는 실행환경, 그리고 그 실행환경에 전달할 인자.
를 스택에다가 생성함.
인자안에는 핸들러와 핸들러에 전달할 인자가 있음
그러면 새로운 쓰레드는 ret_from_fork 로 가게 되어있음.
얘는 부모의 레지스터를 복사했기땜에 부모의 lr레지스터,
즉 sys clone 시스템콜 직후로 점프함. 단 이 맥락은 피쓰레드한정임. 모두 시스클론을 호출하는데, 시스콜직후맥락은 피쓰레드한정.
그 직후에 리턴값을보고 0 즉 자식이면
스택에서 값을 꺼내와서
실행환경에 인자 집어넣음.
핸들러는 인자안에 들어있음. 글구 핸들러의 인자도 있음.
핸들러(핸들러인자) 실행함.
후 끝.
찐 포크같은경우는 그냥 시스 클론 바로적용해도 문제없더라
스택 변경하지마라.
스택변경은 피쓰레드땜에 있는거다.
글구 스택이랑관련없지만 커널쓰레드쪽에 인자로 쓰기 위함
많이 팠네 나는 가물가물한데 기억나는건 fork 하면 부모 스레드를 그대로 메모리 공간까지 복사하고 pid는 0으로 준다음에 exec가 새로운 메모리 공간 할당하면서 pid 새로 만들어주고 이런거 기억남 운영체제 만들꺼야? 커널 존나 깊게 들어가네
pid execv할때 새로 안만들걸?
fork 하면 자식 스레드는 0으로할당되어있지않아? exec하면 메모리 공간 새로 주면서 pid 주는걸로 알고있는데 아니야?
아니야. 너가 헷갈려하는건 시스템콜의 반환값이야. 부모는 자식의 pid를, 자식은 0을 반환해. 자식의 pid가 0인건 아냐
아! 그냥 반환값이 0인거구나 고마워
그래그래 화이팅하잣!!
fork execv exit wait 4개의 페이즈가 있는건 맞아 아주 좋와. 왜이트는 왜 있냐 하면 좀비의 수거