본문 바로가기

not기초

[운영체제] interrupt stack pointer

깃헙 블로그 설정을 바꿔야 해서 일단은 여기에 포스팅..

운영체제 공부하다가 의문점이 생겼다. 책을 읽으면서 공부하고 있는데 시스템 스택이나 스택 포인터, 제어 스택 등 어디서 많이 들어본 용어들이 나오는데 그게 정확히 무엇인지 모르겠어 열심히 구글링을 했다.


<그림1 책에 나온 메모리 구조>

<그림2 (달고나) 와우해커 BOF 기초문서에 나오는 x8086 computer architecture>

구글링을 해서 의문점을 정리했다. 크게 두 가지로 나눌 수 있었다.
1. 그림1에서 제어 스택과 인터럽트 처리 루틴은 kernel이 자리 잡은 공간이라고 들었다. 제어 스택의 top을 가리키는 스택 포인터와 기존에 알고 있던 stack pointer(stack segment 꼭대기를 가리키는 레지스터)이 동일한 것인가?
2. 제어 스택은 call stack(기존에 알고 있는 실행 중인 서브루틴 관련 정보를 저장하는 스택)과 동일한 용어라고 한다. 하지만 제어 스택은 kernel 영역에 있는데 call stack(kernel 영역 위에 있음)과 동일할 수 있는가?
의문점들로 머리가 엉켰는데 결국 답이 무엇인지 알아냈다.

interrupt를 공부하기 전에 dual mode를 공부했었다. 시스템은 다른 프로세스 보호를 위해 User Mode와 Kernel Mode를 번갈아가며 실행한다고 했었다. 하나의 프로세스는 kernel 영역과 Available 영역에 각각 stack을 생성한다. sp 레지스터는 User mode에서 실행될 때는 Avaliable 영역의 stack의 top을 가리키다가 Kernel mode로 바뀌면 kernel 영역의 stack의 top을 가리킨다.
하나의 stack pointer가 kernel 영역도 가리킬 수 있는 것이다. (1번 해결)
kernel stack도 기존에 알고 있던 stack과 같이 서브루틴 관련 정보를 저장하기 때문에 제어 스택과 콜 스택을 혼용해서 써도 된다. (2번 해결)

자세한 과정은 좀 더 깊게 파야 알겠지만 의문점은 여기서 해결할 수 있었다.

참고
커널 스택이 궁금합니다.
콜 스택

'not기초' 카테고리의 다른 글

PC와 IP의 차이점  (0) 2020.06.07