2008. 10. 3. 20:38

커널스택 정리

커널스택.bmp
  • 태스크마다 커널 스택이 주어진다.
    • 이것은 커널이 각 태스크 마다의 스택을 한 곳에 쌓아두어 처리하는 게 아니라, 태스크마다 커널을 스택을 두어 처리한 다는 의미로, 커널이 스택 관리를 일일이 하지 않는다는 의미가 된다.
  • 태스크당 2페이지의 크기를 가진다.
    • 32비트 아키텍쳐 -> 8KB (한 페이지당 4KB)
    • 64비트 아키텍쳐 -> 16KB (한 페이지당 8KB)
  • 커널 스택 안에는 무엇이 들어가는가?
    • 유저 프로세스로 복귀할 리턴 주소
    • 유저 프로세스가 커널에 넘기는 매개 변수들
    • 시스템 콜 핸들러에 등록된 함수의 자동 변수와 같은 스택값
    • 인터럽트 핸들러에서 사용하는 스택값
  • 2.6 커널부터 싱글페이지 커널 스택 옵션이 제공
    • 프로세스당 메모리 소모를 더 줄이게 되었다.
    • 시스템이 오래 가동할 수록 물리적으로 연속된 가용한 두 개의 페이지를 찾기가 점점 어려워지기 때문에, 즉 메모리가 단편화될수록 새 태스크를 할당항하기 위해 가상메모리가 들여야 하는 비용은 증가하게 된다.
  • 인터럽트 스택
    • 싱글페이지 사용시 인터럽트 핸들러가 더 이상 들어맞지 않게 될 수 있다.
    • 따라서 추가 옵션을 두어, 인터럽트 스택을 각 프로세스마다 따로둘 수도 있다.
  • 스택 사용법
    • 최대 200~300바이트 이내로 사용하자.
    • 큰 배열이나 구조체와 같은 큰 데이터를 스택에 정적으로 할당하는 것은 매우 위험하다.
    • 커널은 스택을 관리하지 않으므로, 스택이 오버플로우 되는 경우 초과된 데이터는 스택의 경계를 넘어가게 된다. 우선, 이 자리에는 thread_info 구조체가 있다. 스택너머에는 어떤 커널 데이터가 숨어있을지 알 수 없으므로, 스택이 오버플로우 되면 최선의 경우 시스템이 크래쉬(Crash)할 것이고, 최악의 경우 커널의 일부 데이터가 오염될 것이다