※ 공부한 것을 정리한 노트입니다. 참고만 하세요. ※
3. 커널과 시스템 호출
응용프로그램의 자원 접근 문제
- 오늘날의 운영체제는 다중프로그래밍 운영체제이다
- 문제
- 응용 프로그램이 직접 하드웨어에 접근하면 충돌 및 훼손 가능성 매우 큼
- ex) 타 응용 프로그램이 적재된 메모리 훼손, 또는 만들어둔 파일 삭제 및 훼손, 커널이 적재된 영역 훼손
- 응용 프로그램이 직접 하드웨어에 접근하면 충돌 및 훼손 가능성 매우 큼
- 해결
- 응용프로그램의 모든 하드웨어 직접접근 불허, 오직 커널만이 가능
- 구체적인 해결
- 메모리 공간을 사용자 공간(응용프로그램 적재)과 커널 공간(커널 적재)으로 분리
- CPU의 실행모드를 사용자 모드와 커널 모드로 분리
- 응용프로그램은 사용자모드에서만, 커널 코드는 커널모드에서만
- because, 사용자 공간에서 커널 공간 직접접근 못하게 하기 위해, 접근 시도시 응용프로그램 강제 종료
- 응용프로그램은 시스템 호출을 통해서만 커널 코드 이용 가능
사용자 공간, 커널 공간
- 사용자 공간 : 모든 응용 프로그램들이 나누어 사용하는 공간 → 응용프로그램들이 적재되는 공간
- 커널 공간 : 커널만 사용할수 있는 공간, 커널에 의해 배타적으로 사용되는 공간 (디바이스 드라이버 포함)
- 분리 이유 : 커널 코드, 데이터를 악의적 응용프로그램, 코딩 실수로부터 지키기 위함
- 사용자 공간과 커널 공간의 크기는 운영체제마다 다르다. 윈도우는 기능이 (리눅스에 비해)많고, 하이브리드 커널이기 때문에 커널 공간이 크고, 리눅스는 마이크로 커널이다.
- 사용자 공간의 크기는 곧 한 응용프로그램의 최대 크기(stack + heap + data + code segment)와 주소 범위를 결정한다.
- ex) 32bit window 운영체제에서는 2GB크기까지의 응용프로그램만 개발 가능
주소 공간은 가상 주소 공간
- 주소 공간 = 사용자 공간 + 커널공간
- 주소 공간 = 가상 주소 공간 → 물리 메모리(실제 메모리) 주소 범위와 무관
- 가상 주소 공간
- 사용자나 응용프로그램 관점에서 보는 주소 범위 → 사용자가 메모리 전체를 사용하고 있다고 착각
- 각 응용 프로그램은 32bit windows 기준 2GB의 사용자 주소 공간을 가짐. 즉 사용자 코드와 데이터가 최대 2GB이고, 사용자는 이 2GB의 메모리를 독점 사용한다고 착각
- 커널 공간 : 2GB ~ 4GB - 1의 주소범위, 모든 응용프로그램들은 커널 공간 공유
- 2가지 의문
- 응용 프로그램들의 사용자 공간 충돌?
- (32bit windows 기준) 실제 물리메모리가 4GB보다 작은 경우?
- 사용자 공간 충돌 문제 해결 : 가상 주소 공간을 물리 메모리에 매핑
- 각 응용프로그래밍의 가상 주소 공간을 물리 주소 공간으로 매핑 → 매핑 테이블, 운영체제에서 관리
- 물리 메모리를 여려 응용 프로그램의 사용자 공간이 나눠 사용 → 실제 응용프로그램들은 사용자공간의 일부만 사용
- 커널 역시 물리 메모리에 매핑, 커널 공간에 대한 매핑 테이블 부분은 모든 응용프로그램에서 동일
- 물리 메모리가 작은 경우 물리 메모리를 하드디스크에 저장하여 물리 메모리의 빈 영역 확보 (가상 메모리 기법)
사용자 모드와 커널 모드
- CPU는 사용자 모드와 커널 모드중 하나의 모드로 실행
- 사용자 모드
- CPU mode bit = 1
- CPU가 사용자 공간의 코드, 데이터에 액세스중
- CPU의 커널 공간 접근 불허 → 응용프로그램으로부터 커널 영역 보호
- 특권 명령 실행 불허
- 커널 모드
- CPU mode bit = 0
- 커널 코드와 사용자 공간 접근 가능
모드 전환과 특권 명령
- 사용자 모드에서 커널 모드로 전환하는 경우는 오직 2가지, 시스템 호출과 인터럽트
- 시스템 호출
- 시스템 호출을 실행하는 기계명령으로 진행
- ex) int 0x80, sysenter, trap, syscall 등 다양함
- cpu mode bit를 커널 모드로 전환
- 인터럽트
-
CPU가 인터럽트를 수신하면 커널 모드로 자동 전환
-
CPU는 인터럽트 서비스 루틴 실행
-
인터럽트 서비스 루틴이 끝나면 CPU는 사용자 모드로 자동 전환
-
- 특권 명령
- I/O, 컨텍스트 스위칭등 인터럽트 금지등 특별한 목적으로 설계된 명령으로, 커널 모드에서만 실행 가능
- 종류
- I/O 명령
- 하드웨어 제어 및 I/O
- 하드웨어에 직접 접근하기에 커널 모드에서만 실행되어야 하는 특권 명령
- Halt
- CPU 작동을 중지시켜 유휴 상태로 만드는 명령
- (인텔)hlt 명령
- 인터럽트 플래그 on/off
-
CPU 내에 있는 인터럽트 플래그 비트를 제어하여 CPU가 인터럽트를 허용하거나 무시하도록 지시
-
cli/sti 명령
-
-
타이머 설정 명령
- 컨텍스트 스위칭 명령
-
메모리 지우기 명령
-
장치 상태 테이블 수정 등의 명령
- I/O 명령
커널의 실체
- 커널 : 부팅시에 커널공간에 적재된 함수들과 데이터 집합
- 바이너리 형식, 하드디스크 특정 영역에 저장, 부팅시 커널공간에 메모리 적제
- 커널 코드 : 함수의 집합, 커널 모드에서 실행되는 함수들과 데이터들의 집합
- 따라서 커널은 프로세스가 아니다. 그러니 커널은 실행되지도 않는다.
- 커널이 스케줄링을 한다(X)
- 커널의 스케줄러 함수를 호출한다(O)
라이브러리와 응용프로그램 빌딩
- 라이브러리
- 응용 프로그램에서 활용하도록 미리 작성된 함수들, 미리 컴파일되어 바이너리 형식으로 제공
- 라이브러리없이는 개발 불가
- 유형
- 표준 라이브러리
- 사용자가 작성하기 힘든 함수 제공
- 이름 및 사용법은 운영체제, 하드웨어 독립적
- 시스템 호출 라이브러리
- 시스템 호출 함수들을 포함
- 시스템 호출 진행 → 커널 모드로 변경 후, 커널로 진입하여 커널 함수 실행
- 이름이 운영체제 종속적 → 운영체제 비호환
- 커널 api라고도 부름
- 사용자 코드와 라이브러리 코드 링킹
- 실행 파일 만들어지는 과정
- 응용 프로그램 코드 : 라이브러리 코드와의 링킹을 통해 하나의 실행파일로 만들어짐
- 실행
- 사용자 공간에 적재
- 실행 파일 내 사용자 코드와 라이브러리 코드의 메모리 적재
- 실행 파일 내 사용자 전역변수와 라이브러 전역변수 적재
- 응용 프로그램은 사용자 모드로 실행 시작
- 사용자 공간에 적재
- 실행 파일 만들어지는 과정
- 표준 라이브러리
함수 호출과 시스템 호출
- function call로 라이브러리 활용
- 사용자 공간의 함수가 사용자 공간의 다른 함수(라이브러리 함수 포함) 호출
- 사용자 모드에서 실행
-
호출 과정
-
사용자 공간의 스택에 돌아올 주소, 매개변수 전달, 호출된 함수의 지역변수 생성
-
사용자 공간에 적재된 함수의 주소로 점프
-
함수가 끝나면 함수를 호출한 곳으로 복귀
-
- 시스템 호출로 커널 코드 실행
-
응용프로그램이 운영체제의 기능을 사용하고자 할 때, 커널에 작성된 함수 실행
-
시스템 호출 라이브러리에 포함된 시스템 호출 함수가 시스템 호출 일으킴
-
과정
-
시스템 호출을 일으키는 특별한 기계 명령 실행
-
이 명령이 사용자 모드에서 커널 모드로 전환, 커널 함수마다 매겨진 고유 번호 전달
-
커널의 시스템 호출 핸들러 실행
-
시스템 호출 핸들러가 전달받은 커널 함수의 고유 번호 분석, 해당 커널 함수 호출
-
커널 함수에서가 리턴할 때 사용자 모드로 전환, 사용자 프로그램으로 복귀
-
시스템 호출
- 사용자 공간에서 커널 서비스를 요청하는 과정, 혹은 커널 함수를 호출하는 과정
- 운영체제는 시스템 호출 라이브러리 제공
- 시스템 호출을 일으키는 기계명령
- 표준 라이브러리를 통해 간접적 시스템 호출
시스템 호출에 따른 비용
- 시스템 호출이 많을수록 프로그램의 실행 속도가 저하한다.
- fread()(C언어 표준) vs read()(시스템 호출 함수)
4. 운영체제와 인터럽트
인터럽트
-
입출력 장치들이 비동기적 사건을 CPU에게 알리는 행위
- 비동기적: 예정되지 않거나 발생 시간을 예측할 수 없는 사건
- ex) 키보드 입력, 네트워크로부터 데이터 수신
- 하드웨어 인터럽트
- 장치들이 어떤 상황 발생을 CPU에 알리는 하드웨어 신호
- 소프트웨어 인터럽트
-
CPU 명령으로 발생시키는 인터럽트
- 하드웨어 인터럽트와 동일하게 처리
-
인터럽트 서비스 루틴과 운영체제
- ISR
- 위치: 디바이스 드라이버, 커널코드, 임베디드 컴퓨터 ROM
인터럽트의 존재 의의
- 인터럽트는 다중프로그래밍 실현의 키
- 여러 프로세스 동시 실행
- 한 프로세스에서 I/O 발생 (I/O 인터럽트) → 다른 프로세스로 스케줄링
- I/O 완료 역시 인터럽트 발생 → 원래 작업하던 프로스세로 복귀
- 인터럽트의 효과
- I/O 장치와 CPU가 각자 일함
→ I/O 장치는 CPU기준에서 매우 많이 느리고, 또 언제 작업이 일어날지 모른다(비동기성). I/O작업은 장치에게 맡기고, CPU는 여러 프로세스를 실행하며 CPU를 효율적으로 사용한다.
- I/O 장치와 CPU가 각자 일함
'대학교 > 운영체제' 카테고리의 다른 글
chap2. 컴퓨터 시스템과 운영체제 (1) (0) | 2023.04.26 |
---|---|
chap1. 운영체제의 개념과 태동, 그리고 발전 (2) | 2023.03.14 |
chap0. 운영체제 교재 정보 (0) | 2023.03.10 |