두문단 추가.

9 views
Skip to first unread message

Min Lee

unread,
Nov 10, 2010, 1:38:39 PM11/10/10
to osin...@googlegroups.com
다음의 두문단 추가. 보통 커널공부 시작할때 task_struct와 커널 스택정도부터
공부하죠..

--

보통 PCB(Process control block)이라고 부르는 구조체가 하나의 프로세스를 대
표합니다. 리눅스의 경우 task_struct 라는 구조체가 sched.h에 있죠. 흥미로운
것은 이 구조체를 각 태스크의 커널스택의 밑바닥에 놓는다는 것입니다. 일단 커
널코드안에서는 커널진입전에 실행중이던 태스크가 무엇인지 알필요가 있는데요,
즉 현재의 context를 알아내야하죠. (물론 interrupt context에선 의미없겠지만)
커널스택에 놓은 편법이 이를 편하게 해줍니다. 일단 슬랩할당자로 task_struct
할당을 한후에 커널스택 바닥에 넣으면 커널내의 어느 시점에서든 esp를 적당히
bitwise and시켜주면 (하위 12개 혹은 13개 비트면 reset해주면) 구조체에 쉽게
접근할수 있다는 것이죠. current 매크로가 이것을 처리해줍니다. 그래서 현재
태스크를 쉽게 구할수 있죠. 2.6에서는 task_struct와 서로간의 pointer를 가지
는 thread_info 라는 구조체로 바뀌었고 이걸 스택의 바닥에 놓습니다. 그리고
포인터로 task_struct로 연결되어있죠. arch-dependent한 부분을 따로 독립시킨
것이죠.

편의상 그리고 보안상 각 쓰레드는 커널 스택을 가집니다. 즉 커널모드에서 사용
하는 스택입니다. x86에서는 TSS라는 구조체에 커널스택으로의 포인터를 넣어서
커널에 진입하면 자동적으로 스택 스위치가 이루어집니다. 태스크 하나가 사용하
는 메모리는 이 스택+PCB가 거의 전부라고 할수 있겠습니다. 매 태스크마다 존재
하기때문에 메모리 사용량이 꽤 되죠. 그래서 예전엔 커널스택이 2페이지 였습니
다만, 요즘엔 1페이지로 줄어든것같습니다. 2페이지는 메모리 낭비가 심하기때문
이고, 또...TODO

Reply all
Reply to author
Forward
0 new messages