Showing

[운영체제] 메모리에서 유저단, 커널단 개념 정리 본문

컴퓨터 공학, 전산학/운영체제

[운영체제] 메모리에서 유저단, 커널단 개념 정리

RabbitCode 2023. 5. 10. 05:15

목차

- (1) 유저영역 커널영역

- (2) 유저모드 커널모드

- (3) 유저레벨쓰레드 커널레벨쓰레드

- (4) 유저스택 커널스택

* 핀토스 프로젝트1,2에 임하면서 작성했던 WIL에서 헷갈렸던 유저단, 커널단 개념들만 따로 정리해둔 포스팅입니다.

 

 

(1) 유저영역 커널영역

유저 영역 

: 프로그램이 동작하기 위해 사용되는 메모리 공간

→ 스택 영역, 힙 영역, 데이터 영역, 코드 영역

 

 

커널 영역 

: 운영체제를 실행시키기 위해서 필요한 메모리 공간, 메모리에서 유저 영역을 제외한 영역

  • 커널이 위치함 

 

커널 : 운영체제의 핵심부로 컴퓨터 자원(CPU, 메모리, 파일 등)들을 관리함

→ 메모리에 상주하는 운영체제의 부분 = 커널

  • 커널은 컴퓨터 자원을 관리하며 사용자와의 상호작용을 하지 않음 

 

(2) 유저모드 커널모드 

 

프로세스가 유저 모드에서 동작할 때는 커널 영역으로의 접근이 금지. 반면, 커널 모드에서 동작할 때는 모든 영역의 접근이 허용

 

사용자 모드user mode는 운영체제(커널) 서비스를 제공받을 수 없는 실행 모드. 즉, 커널 영역의 코드 실행 X

- 일반 응용 프로그램은 기본적으로 사용자 모드로 실행

- 사용자 모드로 실행 중인 CPU는 입출력 명령어와 같이 하드웨어 자원에 접근하는 명령어를 실행X

- 따라서 사용자 모드로 실행되는 일반적인 응용 프로그램은 자원에 접근X

 

커널 모드kernel mode는 운영체제(커널) 서비스를 제공받을 수 있는 실행 모드

- 커널 영역의 코드 실행 O

- CPU가 커널 모드로 명령어를 실행하면 자원에 접근하는 명령어를 비롯한 모든 명령어를 실행O

- 운영체제(커널)은 커널 모드로 실행되기 때문에 자원에 접근O

 

사용자 모드로 실행되는 프로그램이 자원에 접근하는 운영체제 서비스를 제공받으려면 운영체제(커널)에 요청을 보내 커널 모드로 전환되어야 함. 이때 운영체제 서비스를 제공 받기 위한 요청을 시스템 호출system call(시스템 콜)

사용자 모드로 실행되는 프로그램은 시스템 호출을 통해 커널 모드로 전환하여 운영체제 서비스를 제공 받을 수 있음.

 

CPU가 시스템 호출을 처리하는 순서는 인터럽트 처리 순서와 유사. 시스템 호출을 발생시키는 명령어가 실행되면 CPU는 지금까지의 작업을 백업하고, 커널 영역 내에 시스템 호출을 수행하는 코드(인터럽트 서비스 루틴)를 실행한 뒤 다시 기존에 실행하던 응용 프로그램으로 복귀하여 실행을 계속해나감.

 

예시: 한 응용 프로그램이 하드 디스크에 데이터를 저장하려 한다

사용자 모드로 실행되는 동안에는 자원(하드 디스크)에 접근할 수 없기에 커널 모드로 전환해야 함.

응용 프로그램은 하드 디스크에 데이터를 저장하는 시스템 호출을 발생시켜 커널 모드로 전환

 운영체제 내의 ‘하드 디스크에 데이터를 저장하는 코드’를 실행함으로써 하드 디스크에 접근

 그리고 하드 디스크에 접근이 끝났다면 다시 사용자 모드로 복귀하여 실행을 계속

 

일반적으로 응용 프로그램은 실행 과정에서 운영체제 서비스들을 매우 빈번하게 이용. 그 과정에서 빈번하게 시스템 호출을 발생시키고 사용자 모드와 커널 모드를 오가며 실행.

 

(3) 유저레벨쓰레드 커널레벨쓰레드

https://www.youtube.com/watch?v=sOt80Kw0Ols

(4) 유저스택 커널스택

이 개념을 완벽하게 알면 CPU도 만들어볼 법 할까?

 

스레드는 하나의 프로세스 내에서 실행되는 실행 흐름. 스레드는 프로세스 내에서 코드, 데이터, 힙 등의 자원을 공유하면서 실행. 하지만, 스레드는 각각 독립적인 스택을 가지고 있으며, 이 스택은 커널 스택과 유저 스택으로 구분.

커널 스택(Kernel stack)은 커널 모드에서 사용되는 스택 스레드가 커널 모드에서 실행되는 동안에는 커널 스택을 사용하여 중요한 정보를 저장하고 관리. 예를 들어, 인터럽트가 발생하거나 시스템 콜을 호출할 때는 커널 모드에서 실행되기 때문에, 해당 작업에서 사용되는 스택은 커널 스택. 커널 스택은 보통 운영체제에 의해 관리되며, 크기가 고정되어 있다.

유저 스택(User stack)은 유저 모드에서 실행되는 프로그램(코드)에서 사용되는 스택. 스레드가 유저 모드에서 실행되는 동안에는 유저 스택을 사용하여 함수 호출, 지역 변수 및 인자 등의 정보를 저장하고 관리. 예를 들어, C 언어로 작성된 함수가 호출되면, 해당 함수의 매개변수와 지역 변수는 유저 스택에 저장. 유저 스택은 각 스레드마다 별도로 할당되며, 크기는 스레드 생성 시에 결정.

, 커널 스택과 유저 스택은 각각 커널 모드와 유저 모드에서 사용되는 스택으로, 스레드가 실행될  각각 별도로 할당.

CPU가 커널영역의 일을 했다는 것을 표시하고 연한부분은 CPU가 커널이외의 영역, 즉 사용자 영역의 작업을 했다는 것

=CPU가 하는 일들을 링 형태로 구분해서 표현한 그림으로, 그림의 링은 안쪽에 가까울 수록 커널과 운영체제의 핵심에 가까운 일을 뜻합니다. 즉, 가장 안쪽 Ring 0는 CPU가 커널 영역에서 하는 일을 뜻합니다. CPU가 해당 영역의 작업을 수행할 때, CPU는 커널모드가 됩니다. 반대로 CPU가 Ring 0 밖의 작업을 수행할 때는 CPU가 유저모드가 됩니다.

 

CPU의 모드가 커널모드에서 사용자모드로, 사용자모드에서 커널모드로 전환하는 것을 컨텍스트 체인지(Context change)라고 합니다.

 

-1- rsp rip의 개념

RSP RIP x86 아키텍처에서 사용되는 레지스터입니다. RSP 스택 포인터(SP) 유사하며, 현재 스택의   주소를 가리킵니다. RIP 명령어 포인터(IP) 유사하며, 현재 실행 중인 명령어의 주소를 가리킵니다.

 

스택은 일반적으로 스택 포인터(SP) 레지스터를 사용하여 관리. SP 레지스터는 유저 모드에서는 유저스택의 맨 위를 가리키고, 커널 모드로 전환될 때는 커널스택의 맨 위.

커널스택 또한 SP 레지스터를 사용하여 관리됩니다.

 

함수 호출 또는 인터럽트가 발생하면 현재 실행 중인 코드의 RIP 값이 유저스택에 저장되며, 그 다음 함수 또는 인터럽트 처리를 위해 커널 모드로 전환되면서 RSP 값이 커널스택의 맨 위를 가리키게 됩니다. 이후, 커널 모드에서 해당 함수 또는 인터럽트를 처리하면서 RSP 값이 변경되며, 함수 호출이 끝나면 반환 주소(RIP)가 스택에서 팝되어 이전 실행 지점으로 돌아갑니다.

 

-2- 커널 스택과 공유 자원

커널 스택은 각 쓰레드마다 별도로 할당됩니다. 이는 각 쓰레드가 커널 모드에서 실행될 때, 해당 쓰레드의 커널 스택이 사용됨을 의미합니다.

커널 스택은 공유 자원을 가집니다. 커널 스택에 저장되는 함수 호출 정보나 지역 변수 등은 쓰레드가 실행될 때마다 달라질  있지만, 커널 스택 자체는 메모리 공간을 공유합니다. 이는 커널 스택이  쓰레드마다 크기가 동일하게 할당되며, 미리 정해진 크기만큼 메모리를 사용한다는 것을 의미합니다.

 

스택 프레임(Stack Frame)이라는 개념이 사용됩니다. 스택 프레임은 함수 호출  저장되는 함수 호출 정보와 지역 변수 등을 담는 논리적인 단위입니다.  쓰레드의 스택 프레임은 해당 쓰레드의 실행 흐름에 따라 독립적으로 관리됩니다. 하지만 커널 스택 전체에서는  쓰레드의 스택 프레임이 겹치지 않도록 관리됩니다.

 

 쓰레드는 자신만의 커널 스택을 가지지만, 커널 스택은 메모리 공간을 공유하며, 스택 프레임 단위로 각각의 쓰레드가 독립적으로 관리됩니다.