User stack vs Kernel stack

user task가 생성될때마다 스택이 각각 유저 스택과 커널 스택이 하나씩 만들어진다.

user stack

  • 유저 스택의 크기는 스레드 생성 시 지정될 수 있고, default 크기는 역시 아키텍처마다 다른다. 최대 사이즈 확인 방법은 “ulimit -a”를 사용한다.(32bit ARM은 8MB)
$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 14846
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 14846
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

 

kernel stack

  • task 생성 시 마다 kernel stack이 생성된다.
    • 사이즈는 유저 스택보다 적어서 보통 1 ~ 2 페이지를 사용한다.

 

Excetion 처리용 statck

  • arm 아키텍처에서는 각 exception에 대해 하나씩 있는 스택을 사용한다.
    • exception이 발생되어 해당 exception 핸들러에 진입한 경우에는 각 exception에서 사용하는 스택을 이용한다.
    • irq exception 즉, 인터럽트가 발생되어 커널로 진입한 경우 인터럽트 서비스용 스택을 이용한다.
      • pre-cpu로 생성된 irq_stack

 

context switch시 스택 사용

  • user mode에서 task(thread)가 수행되고 있을 때 syscall을 하여 kernel mode로 jump하고 context switching을 하게되는데 이 때 부터는 해당 task(thread)용 kernel stack을 사용한다.
  • 다시 kernel mode에서 user mode로 context switching을 하여 돌아가게 되면 task(thread)용 user stack을 사용한다.

stack2

 

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.