본문 바로가기

Programming/Linux_Kernel

linux process memory usage

원문 : http://blog.naver.com/PostView.nhn?blogId=yesing1&logNo=70120580840



linux kernel stack에 대한 오해

출처 : http://blog.naver.com/lache96?Redirect=Log&logNo=140051813931

 

정리하면

3G~4G영역에 프로세스마다 커널 스택이 존재한다.

인터럽트 발생시 커널 스택에 현재 프로세서의 context를 push한다. 인터럽트 핸들러를 처리 후 scheduler에 의해 같은 프로세스가 실행되면

push 되었던 프로세서 context를 pop하여 동작한다.(다른 프로세스가 먼저 선택되면 역시 kernel stack의 정보를 pop하여 사용한다.

커널스택은 프로세스마다 같은 공간을 사용한다.

 

 

 

 출처 : http://kldp.org/node/73308

1.커널 스택은 프로세스마다 하나씩 생성되는 건가요 ?
2.
커널 스택에는 어떤 정보가 들어가게 되나요 ? (얼핏 알기로는 해당 프로세스에 인터럽트가 걸리면 이에 필요한 정보들을 커널 스택에저장해 놓고 사용한다고 하던데요...)
3.
프로세스 하나는 4기가의 가상 공간을 사용한다고 들었습니다 중에서 0~3기가 까지는 응용프로그램에서 사용하는 공간이고 3~4기가는 커널이 사용하는 공간이라고 알고 있는데요...
여기서 3~4기가 공간과 커널 스택이 어떠한 연관 관계가 있나요?

 

최근에 Linux Understanding Kernel 이란 책을 일부분 봤는데 어느 정보 아는 부분이라 지나가다 적어봅니다모든 설명은 80x86 아키텍처를 기준으로 합니다.

1. 커널 스택은 프로세스마다 하나씩 생성됩니다.
일반적인 프로세스는 User Mode 스택과 Kernel Mode 스택을 각각 하나씩 가지고 있습니다.
User Mode
에서 Kernel Mode로의 전환은 시스템호출이나 인터럽트가 발생하면 일어납니다.
, esp 레지스터는 프로세스가 User Mode이면 User Mode 스택의 top 가르키다가
Kernel Mode
 전환이 되면 Kernel Mode 스택의 top 가르킵니다.

2. Kernel Mode 스택은 적어도 다음 두가지 목적으로 사용됩니다다른 사용처는 딱히 생각나지 않네요.
. Kernel Mode 전환된 프로세스는 언젠간 다시 User Mode 되돌아가야 합니다.
따라서 User Mode 전환하기위해 필요한 정보  일부를 저장합니다. (일부는 다른 곳에 저장합니다.)
. Kernel Mode에서 함수를 호출하게 되면  함수의 지역변수는 Kernel Mode 스택에서 할당됩니다. (User Mode에서 함수를 호출하면 지역변수가 User Mode 스택에 할당되는 것과 같습니다.)
참고로 80x86 아키텍처에서 커널 스택으로 할당된 공간의 크기는 8KB 고정되어있습니다프로세스 생성때 한번 할당되어 작아지지도커지지도 않습니다따라서 커널에 있는 함수에서는 지역변수를 많이 할당하거나 재귀 함수 호출을 하면 좋지 않습니다.

3. 어떻게 설명드려야할  상당히 난해한 질문이군요.
커널은 주소 공간 3~4GB 사용합니다. Kernel Mode 스택은 Kernel Mode에서만 사용되므로 커널 주소 공간에서 할당됩니다.
, User Mode 스택을 가르키는 esp 값을 읽어보면 0GB~3GB 사이의 값을 가지고 Kernel Mode 스택을 가르키는 esp 값을 읽어보면3~4GB 사이의 값을 가지게 됩니다.

4. 기타

프로세스의 User Address Space 프로세스마다 각각 다르지만, Kernel Address Space 모든 프로세스가 동일하게 봅니다,프로세스 A 프로세스 B 특정 가상주소 (예를 들면 0xa0001000)  서로 다른 물리주소로 맵핑될  있습니다하지만 특정 커널 공간 주소 (예를 들면 0xc0001000)  모든 프로세스에서 동일한 물리주소로 맵핑됩니다.
이를 위해서 커널은 kernel master page table (swapper_pg_dir 변수가 가르킴) 관리하고필요할 때마다 특정 엔트리를 kernel master page table에서 해당 프로세스의 page table 복사를 합니다 -- 이런 작업은 Kernel Mode에서 페이지 폴트가 발생했을 페이지 폴트 핸들러가 수행합니다.

시스템호출인터럽트 핸들러커널 모듈 등은 임의의 프로세스의 context 이용합니다예를 들어프로세스 A User Mode에서수행되고 있을  timer interrupt 발생하는 경우 Kernel Mode 전환하여 timer interrupt service routine 수행하게 되는데 이때 프로세스 A page table Kernel Mode 스택을 빌어 쓰게됩니다.
Timer interrupt
 프로세스 A와는 별다른 연관이 없지만 interrupt 발생시점에 프로세스 A CPU 점유하고 있었기 때문에 부하가 context switch 등을 따로 하지 않고 프로세스 A context 그대로 이용하는 것입니다다만 커널 모듈 등이 기능의 일부를 따로 커널쓰레드를 생성하여 구현한 경우라면  커널 쓰레드의 context 사용하겠죠

 

출처 : http://tkss8329.springnote.com/pages/548048

 

 커널스택.bmp

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

      [출처] kernel stack|작성자 yesing1


'Programming > Linux_Kernel' 카테고리의 다른 글

CPSR  (0) 2013.10.31
arm 에서의 linux process 와 thread  (0) 2013.10.23
linux kernel - list 사용하기  (2) 2013.08.30
down() / down_interruptible() / down_trylock()  (0) 2013.08.29
linux kernel basic APIs  (0) 2013.08.08