DEVELOP
article thumbnail

본 게시물은 운영체제 과목의 강의영상과 강의자료를 바탕으로 작성한 학습용 게시물입니다.


커널과 시스템 호출

# 커널 vs. 시스템 프로그램

  • 커널 
    - 운영체제의 핵심부분, 메모리에 상주하는 부분
    - 주로 자원 관리 및 자원 사용에 관한 서비스
    - 시스템 호출을 제공 
  • 시스템 프로그램
    - 커널 이외의 프로그램 
    - 운영체제 개발자가 기본적으로 제공하는 라이브러리나 운영체제 사용 도구 
    - ex) 편집기, 컴파일러, 디버거, 쉘, 쉘 명령어 등

# 커널 

  • 기능적 측면의 구성요소 - 부팅 단계의 기능 
    - 하드웨어 진단 및 초기화 
    - 디스크 상의 커널 프로그램을 메모리로 적재 
  • 기능적 측면의 구성요소 - 부팅 후 기능 
    - 프로세스 경영
    - 중앙처리장치 경영 
    - 주기억 장치 경영 
    - 파일 시스템과 보조 기억장치 경영 
    - 시스템 클럭 경영
    - 네트워크 경영 
    - 입출력 장치 경영 
    - 보안 및 정보보호 기능 
  • 형태적 측면의 구성요소 
    - 시스템 호출 함수들의 집합 
    : 응용 프로그램에게 제공되는 시스템 호출을 수행하기 위한 함수들의 집합 
    - 인터럽트 처리기의 집합 
    : 시스템 클럭 및 대부분의 입출력 장치와 관계된 장치 드라이버의 핵심들이 됨 

# 시스템 호출 

  • 파라메터 전달 방법 
    - Linux, Solaris → 레지스터를 통한 주소 전달
    : 메모리 상의 블록이나 테이블에 파라메터 값을 기록하고 시작 주소를 레지스터에 기록하면 커널에서 레지스터 상의 주소를 얻어 파라메터에 접근 
    - 다른 방식 → 스택 활용  
    : 스택에 파라메터 값을 Push하면 커널에서 Pop
  • 시스템 호출 실행 
    : 시스템 호출 번호를 파라메터 전달용 레지스터와는 다른 CPU 내 레지스터에 기록하고 소프트웨어적인 인터럽트인 트랩 명령어(소프트웨어 인터럽트)를 실행 
  • 국제 표준 - POSIX

# 응용프로그램의 입출력 관점 - 동기식 vs. 비동기식

  • 응용 프록램이 장치를 사용하는 관점의 문제 
  • 동기식 (blocking call)
    - 입출력을 시작시키고 끝날 때까지 대기 
    - 대기하는 동안 CPU를 다른 프로세스가 사용 
    - read 후 넘어오면 다음 라인 실행, read가 실행되는 동안 멈춰있음
  • 비동기식 (non-blocking call)
    - 입출력을 시작시키고 바로 다음 연산을 수행 
    - 입출력이 이루어지는 동안 자신도 CPU를 사용할 수 있음 
    - 프로그램에게 입출력 종료를 알려주는 방법이 필요 ㅣ 이벤트

입출력 시스템

  • 커널과 입출력 장치의 인터페이스 

입출력 시스템

  • Device driver가 Device Controller를 통해, 장치를 제어 ㅣ HDD
  • 레지스터 
    - 명령 레지스터 : 장치가동을 위한 명령 코드 적재 
    - 상태 레지스터 : busy/done 플래그, 오류코드 표현 
    - 자료 레지스터 : 장치 내의 하드웨어 버퍼

# 세 종류 인터페이스 

  • 응용 프로그램과 커널 사이 → 시스템 콜 
  • 커널과 장치제어기 사이 → HW인터페이스 
    - 장치 생산업체에서 제공 
    - 디바이스 드라이버는 시스템 콜을 하드웨어 기능으로 번역해 HW 인터페이스를 통해 장치 제어기에 전달 
  • 커널과 디바이스 드라이버 사이 
    - 디바이스 드라이버가 바뀔 경우 커널 전체를 recompile 할 수는 없는 노릇 
    - 장치 업체의 다변화로 장치구동기와 커널의 인터페이스를 표준화해 필요한 드라이버만 재구성할 수 있도록 함 
    : plug & play 

# HW 인터페이스 

  • 장치 경영 방식 
    - 접근 방식에 의한 분류 (레지스터 접근 방식)
    : 격리형 / 메모리 사상형
    - 자료이동 방식에 따른 분류
    : 직접 입출력 방식 / DMA  
    - 제어 방법에 의한 분류 (제어기 상태 변화 전달 방식)
    : 폴링(polling) / 인터럽트 

# 레지스터 접근 방식 

  • 격리형 입출력 (Isolated I/O , I/O mapped I/O ) 
    - 하드웨어 구조상 주변장치를 위하여 메모리와는 별도의 주소공간 사용 
    - 제어기 레지스터 접근을 위해 하드웨어에 특화된 특수한 입출력 명령어 사용 
    - 장점 : 입출력이 메모리 주소 공간의 크기나 할당에 영향 x
    - 단점 : 메모리 접근 명령어와는 별도의 입출력 명령어를 사용하게 되어 프로그래밍의 일관성이나 이식성 ↓
  • 메모리 사상형 (Memory-Mapped IO) 입출력 
    - 장치를 위한 별도의 주소 공간과 명령어를 정의하지 않고 메모리의 논리적 주소 공간에 제어기의 레지스터를 사상(mapping)
    - 별도의 주소 공간과 입출력 명령어가 필요 없고 기존의 메모리 접근을 위한 명령어를 사용 
    - 장점 : 명령어 개수 ↓, 일관성과 이식성 좋음 
    - 단점 : 입출력을 위해 메모리의 일부를 사용하므로 메모리 영역 ↓(큰 손해는 x)

# 자료 이동 방식 

  • 직접 입출력 
    - CPU가 메모리와 제어기의 자료 레지스터 사이의 자료 이동을 직접 관장 
    - 장점 : CPU가 입출력을 동시에 처리할 수 있음
    - 단점 : 매 입출력을 위해 인터럽트를 처리해야 함 (블록장치의 경우에는 문제)
    -> DMA 방식으로 개선 
  • DMA ( Direct Memory Access)
    : CPU 도움 없이 독자적으로 메모리에 접근해 한 입출력 명령으로 많은 자료를 입출력/전송 
    - 한 블록의 입출력 완료 시 한번만 인터럽트 발생시켜 빈도 수 ↑

# 제어 방법에 의한 분류

  • 폴링 방식 - 인터럽트와 비교할 때 대기 방식에 해당 
    1. 응용 프로세스로부터 입력이 요청됨
    2. 장치구동기가 장치제어기의 명령 레지스터에 명령어 적재 → 장치 가동 
    3. 상태 레지스터가 busy 상태에서 done으로 바뀔 때까지 대기 
    4. done이 되면 제어기의 자료레지스터 내용을 응용 프로세스 공간으로 복제 
    - 루프를 사용해 제어기 상태를 체크하는 것은 CPU 낭비 
    - 인터럽트가 제공되지 않는 장치의 경우 일정시간 주기적으로 제어기 상태 조사 필요 
  • 인터럽트 방식
    - (인터럽트가 발생하면)
    1. (중단) 현재 진행중인 프로세스 또는 하위의 ISR 수행을 즉시 중단 
    2. (문맥보존) 프로그램 카운터 및 CPU 레지스터 값들을 보존 
    3. (마스크설정) 현재의 인터럽트에 해당하는 마스크를 설정해 자신보다 하위 인터럽트가 먼저 처리되지 않도록 함 
    4. (ISR 진입) 현재의 인터럽트에 해당하는 ISR로 제어를 넘김 
    - (인터럽트 처리가 끝나면)
    : 인터럽트 당한 프로세스 또는 수행중이던 하위 ISR을 계속 실행시키기 위해 보존된 레지스터 내용을 복구
    → 운영체제의 결정이 필요

 


인터럽트

# 다수준 인터럽트와 인터럽트 마스크 

  • 시스템의 모든 장치에 대해 비트번호를 지정 
  • 인터럽트 마스크를 통해 interrupt priority level 적용 
    - 임의 인터럽트가 들어오면 해당 인터럽트와 현재의 마스크를 비교해(마스킹) 우선순위 판단 
    - 상위 수준의 인터럽트가 들어오면 처리 중이던 인터럽트 처리를 임시로 중지 
    - ISR 시작에 앞서 인터럽트 마스크를 재설정하고, ISR 종료시 원상복구 

# Fast Interrupt Handler

  • Fast Interrupt 
    : 특별히 빠른 처리 혹은 빠른 반응을 위해 다른 인터럽트 처리를 disable ㅣ clock interrupt
  • Time critical 하지 않다면 일반적으로 다수준 인터럽트 적용 
  • clock interrupt (tick)
    - 클럭 인터럽트는 time critical한 작업이지만, 타임슬라이스 관리와 스케쥴링, 주기적 작업 수행, 메모리 부족상태 검사 및 처리 등 많은 작업을 동반 
    - 순수 인터럽트 처리와 나머지 작업을 분리 
  1. System Call 
  2. read 명령 적재 (ptr함께) 
  3. sleep() & sched()
  4. DMA
  5. Interrupt
  6. Jump
  7. sched() & Wake-up
  8. Copy
  9. Return 

보호 ㅣ 하드웨어에 의한 보호

# 보호 대상 

  • 불법 I/O
  • 불법 메모리 접근 
  • 무한 루프

# 이중모드와 모드비트 

  • 자원 공유 환경에서는 한 응용 프로그램의 오작동이 다른 프로그램의 오동작을 야기 
    - 불법 명령 사용, 운영체제나 타 프로그램 주소 접근, 불법 입출력 등 
    - 커널이나 다른 프로그램의 오동작을 야기할 소지가 있는 명령어는 커널 내에서만 수행토록 해야함 
    -> 이중모드 필요 
  • 하드웨어적으로 이중모드를 지원 
    - CPU의 상태 레지스터 중 1비트를 모드비트로 사용 
    - 모드비트 변경도 커널모드에서 특권명령어로 가능 
      : user mode → mode bit = 1 , kernel mode → mode bit = 0
  • 사용자 모드 : 사용자 공간 상의 코드만 실행 가능 
    - 인터럽트나 입출력 제어와 관련된 특권명령어 수행 불가 
    - 특권명령어 수행 시도 시 트랩 발생 
    - 메모리 참조 영역도 제한 
  • 커널 모드 : 커널 공간 상의 코드만 실행가능, 특권명령어 사용 가능 
    - 사용자 프로그램의 트랩, 인터럽트 처리, 명령어 수행 오류 발생 시 발생하는 트랩 처리
    - 하드웨어적인 제한이나 보호를 수행 x

# 불법 I/O 차단 

  • 모든 I/O 명령을 특권명령어로 함 → 시스템 호출에 의한 트랩을 통해서만 I/O 가능 
  • 메모리의 커널 영역 보호 수단과 함께 사용 
    - 인터럽트 처리 루틴 (ISR) 및 장치 구동기 영역 
    - 시스템 버퍼 영역 
    - 인터럽트 벡터 영역 

# 무한 루프 방지 

  • 타임슬라이스를 구현함으로써 CPU 공유 실현 
    - 최고 우선순위 인터럽트 설정, 인터럽트 인터벌 설정 등 모두 특권 명령어로 수행 
  • 프로그램의 실행 시간을 제약함으로써 무한루프 수행 방지 

캐시와 기억 장치 구조 

# 캐시 

  • CPU에서 메인메모리에 접근시 그 자료를 메모리보다 속도가 빠른 캐시에 복사 

# 부트스트래핑 (bootstrapping) 

  • 운영체제의 시동을 운영체제 일부 기능이 스스로 수행 

# 모노리틱 커널 vs. 마이크로 커널 

  • 모노리틱 커널 ㅣ 리눅스 
    - 메모리 관리, 프로세스 관리, 파일 시스템 등 모든 기능을 커널 내부에 포함 
    - 장점 : 시스템 호출 서비스 빠름 
    - 단점 : 이식성 ↓, 의존성 높아져 디버깅 어려워짐 
  • 마이크로 커널 ㅣ CMU의 Mach 
    : 프로세스간 통신, 메모리관리, 클럭 인터럽트 처리와 CPU 스케쥴링 등 아주 핵심기능만을 커널에 포함시키고 나머지는 서버 형태로 두어 사용자 모드의 프로세스로 수행 
    - 장점 : 유연성 좋음 , 소형 내장형 시스템 활용에 유리 
    - 단점 : 문맥교환과 메시지 전송이 빈번해져서 속도 ↓
profile

DEVELOP

@JUNGY00N