자세한 정보는 아래 글을 참조 하시면 될 것 같습니다.
커널 스택의 이용 : http://kldp.org/node/73308
커널 스택에 대한 기본적 정보 : http://blog.naver.com/puertok?Redirect=Log&logNo=140041524904
위의 정보를 종합해 보면
1. 커널 스택은 각 프로세스마다 할당 된다.( 일반적으로 2page, 8KB (1page가 4KB라면, 32bit 아키텍쳐 기준) )
*커널 스택의 아래 부분에 thread_info 구조체 포인터에서 task_struct 구조체 포인터를 얻을 수 있다.
2. 유저 공간에서 커널 공간으로 넘어가면( system call 같은 )
* 스택을 가르키는 esp 레지스터가 유저공간 stack 영역을 가르키다가 커널 스택을 가르킨다. (x86 아키텍쳐 기준에서)
(커널 공간에서 수행하는 함수들이 이 스택에 쌓인다.)
* 유저 공간에서 쓰였던 register값(해당 프로세스의 context 중 일부인 )들은 커널 스택 상위 pt_regs 부분에 저장된다.
3. 인터럽트 되는 경우, 경우에 따라서 현재 실행중인 프로세스의 커널 스택을 이용 한다.
저는 3번은 쉽게 와닿지가 않아요 ;;
제가 한 고민은 3번이 의미하는게 2가지 중 하나일 수 있다는 겁니다. (2.6커널 부터는 선점형 커널 이므로)
1. 커널 공간에서 실행 되다가 인터럽트 신호 받는 경우
2. 유저 공간에서 실행 되다가 인터럽트 신호 받는 경우
2번째 경우는 인터럽트 신호 받을 때 실행 하던 프로세스의 커널 스택을 사용하면 될 것 같은데
1번째 경우는 이미 커널 스택을 사용하던 상태에서 또 해당 커널 스택을 사용하는 걸까요 -_-;;
만약 그럴 경우에는 커널 공간에서 유저 공간으로 넘어갈 때 필요한 레지스트값들의 정보 뿐만아니라
인터럽트 영역을 실행하고 나중에 다시 커널 공간으로 복귀 할 때(커널 공간에서 선점되었으므로)필요한 레지스트값들을
또 해당 프로세스의 커널 스택의 pt_regs부분에 저장저장해야 할 것 같습니다. 여기까지 제 생각이네요..
너무 어렵게 생각 한건지 모르겠네요:D
하지만 예전 부터 궁금한 부분입니다.
아 그리고 혹시 궁금해 하는 분이 있을 것 같아서
스터디때 어느 분(ㅠ기억이 안나네요;;)께서 말씀 하신 사이트 입니다.
http://kernelnewbies.org/
리눅스 버전 업데이트시 무엇이 업데이트 되었는지 알려주는 사이트.
한 주간의 리눅스 소스에 대한 논쟁 거리 요약해서 알려줌.
(가난한 버전과 부자 버전? 이 있다.)
댓글 5
-
홍문화
2011.04.03 22:07
-
김남형
2011.04.06 11:17
이론적으로 가능합니다. 중첩된 인터럽트에 의한 영향인지는 확실치 않지만
실제로 몇차례 커널 스택 오버플로우 문제가 있었던 것으로 기억합니다.
따라서 커널 함수 및 인터럽트 핸들러 작성 시 스택 사용량에 주의를 기울여야 할 것입니다.
요즘은 아키텍처에 따라 인터럽트/예외 처리 용으로 별도의 스택을 사용하거나
threaded-IRQ 등을 이용하여 문제가 될 가능성을 차단하고 있는 것으로 알고 있습니다.
-
신창호
2011.04.04 08:43
1. 커널 공간에서 실행 되다가 인터럽트 신호 받는 경우
제가 알기로는 위 경우에는 사용하던 stack을 그대로 사용하는 것으로 알고있습니다. (물론... 오래된 정보라 ...신빙성은 떨어질듯...)
즉 현재 사용중이던 kernel stack을 그대로 사용한다는 것이죠~
assembly language를 공부하시면 알게 되겠지만, 일반적으로 함수 호출이 발생하게 되면, stack에 "stack frame, return addresss, parameter"들이 저장되게 됩니다. (아마도... 기억이 가물가물...), 함수콜과 마찬가지로 interrupt도 마찬가지이죠~,
따라서 kernel mode에서 interrupt가 발생할 경우 현재 사용중이던 kernel stack을 그대로 사용하여 interrupt를 처리하여도 전혀 문제가 없다는 이야기가 되는 것이죠~
-
김남형
2011.04.06 11:12
말씀하신 사이트는 LWN (Linux Weekly New) 입니다.
- 부자 버전 (;;) : http://lwn.net/ ([$] 기호가 붙은 기사는 유료입니다)
- 빈자(?) 버전: http://lwn.net/free/
-
홍문화
2011.04.06 11:25
.
글을 읽다가 이런 생각도 해봅니다.
2번의 경우 인터럽트에의해 커널 모드로 넘어가서 인터럽트 컨텍스트가 실행 중인 상태에서 이보다 더 높은 우선순위를
가지는 인터럽트가 발생 하게되면 선점 되어서 1번과 같은 상황이 될거 같고 최악의 경우 동일 커널 스택을 사용하는
시점에서 계속 선점이 일어나는 경우 커널 스택 오버플로우가 발생 하게 될거 같은데 (커널 스택은 페이지의 두배
크기로 고정 되므로) 가능성이 희박하지만 이론적으로 가능할법도 한데 궁금하네요.