커널 스택과 task struct에 관한 질문..

iamcan의 이미지

학교에서 시스템 프로그래밍 수업을 듣고 있는 한 학생입니다.

task struct를 분석하다가 saved_kernel_stack, kernel_stack_page 라는 것이 있더라구요.

여기에서 찾아보니까 커널 스택이라는 것이 프로세스마다 하나씩 가지고 있는것이고, 유저모드와 커널모드 스택을 한개씩 갖고 있다고 하고,

유저모드에서 커널모드로 진입시 context switch 와 비슷하게 스택 등의 필요한 정보를 백업하고 들어간다고 뭐 그러더라구요..

근데 그럼 user_stack 같은 구조체도 선언이 되어 있어야 하는데, 전혀 찾아봐도 없더라구요..
그리고 정확하게 saved_kernel_stack 이 어떤 데이터를 담는 녀석인지도 궁금합니다..

Q의 이미지

유저모드는 Virtual memory입니다.
VM위에서 자신만이 가지는 공간에서
1~1000까지는 Data영역, 1001~2000은 Code영역, 2001~3000은 BSS영역, 0xBFFF7000~0xC0000000은 스택영역(유저) 과 같이 VM에 나열됩니다.
즉 유저모드에서의 스택은 커널이 관여할바는 아니죠. 다만 context switching할때 유저모드에서의 ss, sp값만 지정위치에 위치시켜주기만 하면됩니다.

커널모드에서의 스택은 한 process(task)가 system_call에 의해서 커널의 관련 함수를 실행하고자 할때(커널에 대한 함수를 이용하고자), 함수call자체가 스택이 필요하므로 존재하는겁니다. 그런이유로 커널모드에서의 스택이 필요한거고, 특별한설정이 없는한 8k로 되어있을겁니다.(커널함수가 재규호출없고, depth도 깊지 않아 8k를 넘지않는다고 커널개발자들은 장담(?)합니다.)