개발자 끄적끄적
논리 주소 공간과 실행 모드 본문
<응용 프로그램의 자원 접근 문제>
- 다중프로그래밍 OS에서는 다수의 app 동시 실행
- app이 직접 컴퓨터 자원에 접근하면 충돌 혹은 훼손 발생 가능
- 다른 app이 적재된 메모리 훼손
- 다른 app이 생성한 파일 훼손
- app이 커널 적재된 영역 훼손
<응용 프로그램의 자원 접근 문제의 해결책>
- 응용 프로그램의 자원 접근 불허 : 자원에 대한 접근 커널에게만 부여
- 메모리 '주소 공간'을 분리
- 사용자 주소 공간 : 응용 프로그램 적재
- 커널 주소 공간 : 커널 적재
- CPU '실행 모드'를 분리
- 사용자 모드 : 응용 프로그램 실행
- 커널 기능 필요시 시스템 호출 이용 -> 커널 모드로 전환
- 커널 모드 : 커널 모드 실행
<논리 주소 공간 : 사용자 공간과 커널 공간>
- 논리 주소 공간 : 'CPU'가 접근하는 주소 범위
- 사용자 주소 공간(user space)
- 각 응용프로그램이 나누어 적재되고 사용되는 공간
- 커널 주소 공간(kernel space)
- 커널에 의해 배타적으로 사용
- 커널 코드, 커널 데이터, 디바이스 드라이버 등
- 분리 이유
- 커널 코드/데이터를 app에서 부적절하게 접근하지 못하도록 하기 위해
<주소 공간은 가상 주소 공간>
- 주소 공간은 물리 메모리 주소 범위와 무관
- 사용자/app 관점에서 보는 주소 범위
- 물리적인 실제 메모리 주소 범위와는 무관
- 각 사용자/app은 전체 메모리를 사용한다고 착각하게 끔 OS가 지원
<CPU의 실행 모드 : 사용자 모드와 커널 모드>
- CPU는 '모드 레지스터(Mode Register)'를 통해 현재 모드 식별
- 사용자 모드(User Mode)
- 사용자 주소 공간만 접근 가능
- 커널 주소 공간 접근 불허 <- 예외 발생 후 강제 종료
- 특권 명령(privileged instruction)실행 불허 <- 예외 발생 후 강제 종료
- 커널모드(Kernel Mode, Supervisor Mode)
- 모든 주소 공간 접근 가능(즉, 사용자공간과 커널공간)
- 특권 명령 실행 가능
- HW 접근 제어 가능
<특권 명령어(시스템 관련 처리를 위한 특별한 CPU 명령)>
- 커널 모드에서 실행할 목적으로 설계된 명령어
- I/O : 하드웨어 제어 및 장치로부터의 입출력
- halt
- CPU의 작동을 중지시키고 idle 상태로 만든다
- 인터럽트 수신 때까지 일시 중지하여 전력 소모를 줄인다
- 인터럽트 플래그 설정 : 인터럽트를 허용할 지의 여부를 결정
- 타이머 설정
- 컨텍스트 스위칭
<사용자 모드와 커널 모드의 비교>
- 사용자 모드(User Mode)
1) CPU 메모리 엑세스 범위 : 사용자 공간에 국한, 커널 공간 액세스 불가
2) CPU의 하드웨어 엑세스 여부 : 불가
3) CPU가 처리 가능 명령 : 특권 명령어(Prvilieged instruction)를 제외한 모든 CPU 명령어
4) 오류 발생 시 처리 : 사용자 프로그램만 실행 종료, 시스템은 종료되지 않는다
- 커널 모드(Kernel Mode)
1) CPU 메모리 엑세스 범위 : 커널 공간을 포함한 모든 메모리 공간
2) CPU의 하드웨어 엑세스 여부 : 모든 하드웨어 액세스 가능
3) CPU가 처리 가능 명령 : 특권 명령어(Prvilieged instruction)를 포함한 모든 CPU 명령어
4) 오류 발생 시 처리 : 시스템에서 심각한 오류가 발생한 것으로 시스템 종료
<실행 모드와 관련된 다양한 이슈>
1. 사용자 모드와 커널 모드는 누구의 기능인가? : CPU의 기능(모드 레지스터)이다
2. OS가 모드를 구분해 작동하는 이유는? :
- 커널 공간(코드와 데이터)에 대한 보안/보호
- 실수/고의로 인한 접근으로부터 보호
- app에서 오류 발생 시 전체 시스템에 영향을 주지 못한다
3. app이 커널 코드를 호출할 수 있는가? 불가, 반드시 시스템 호출을 통해 간접호출해야한다 -> 운영체제가 제공해주는 시스템 호출을 이용
4. 어느 모드가 많이 사용될까? : 커널모드(ex. System idle process 등)
'운영체제' 카테고리의 다른 글
운영체제와 인터럽트(Interrupt) (0) | 2024.03.13 |
---|---|
커널(Kernel)과 시스템 호출(System Call) (0) | 2024.03.13 |
운영체제 (0) | 2024.03.09 |