[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

💻 CS/운영체제

[운영체제] 보호 / 캐시 / 부트스트래핑 / 커널의 종류

inu 2020. 3. 28. 16:22
반응형

이중모드와 모드비트

  • '보호'라는 것은 기본적으로 커널의 모든 데이터가 응용 프로그램 등의 영향에 의해 손상되지 않도록 하는 것을 의미한다. 하지만 커널의 구성요소는 다양하다. 이 모든 것에 대해 하나하나 보호 방법을 강구하는 것을 매우 소모적이다. 따라서 보다 근본적이고 연쇄적으로 작용할 수 있는 해결법을 찾는 것이 중요하다.
  • 이중모드 : 커널 모드와 사용자 모드 모두를 분리하는 방식이다. 메인 메모리를 사용자 공간과 커널 공간으로 나누고 CPU가 사용자 공간 프로그램을 수행할 때는 사용자 모드로, 커널 공간 프로그램을 수행할 때는 커널 모드로 동작하도록 한다. 즉, 어떤 응용 프로그램에서 커널이나 다른 프로그램의 오동작을 야기 시킬 수 있는 함수(코드)를 사용해야 할 때 커널 모드로 전환하여 이를 수행하는 것이다. 이러한 이중 모드를 사용하는 이유는 잘못된 명령어 사용, 운영체제나 타 프로그램의 주소 접근, 잘못된 입출력 등으로 하나의 응용프로그램의 오작동이 다른 프로그램의 오작동을 야기할 수 있기 때문이다. 하지만 사용자 모드에서는 메모리 참조 영역이 제한되어 어느정도 보호가 이루어지지만 커널 모드에서는 제한이 없어지므로 코드 작성시 매우 신중해야 한다.
  • 이중모드의 실현 : 상태 레지스터에 모드비트를 두어 해당 비트가 0이면 커널 모드, 1이면 사용자 모드로 전환된다. CPU는 해당 비트를 참조하여 해당 비트가 0(커널 모드)인 경우에만 특권 명령어를 수행할 수 있도록 한다. 이 특권 명령어에는 입출력, 인터럽트, 모드 비트 변경 등에 관련된 명령어 등이 포함된다. 시스템 콜 후 트랩 과정을 거치면서 모드비트를 0으로 바꾸어 이러한 특권 명령어를 사용한다. 리턴할 때는 다시 모드비트가 1로 바뀐다.

핵심 보호

  • 불법(illegal) I/0 차단 : 모든 I/O 관련 명령어를 특권 명령어로 설정해놓음으로서 시스템 호출(트랩)을 통해서만 I/O가 가능하도록 하였다. 물론 I/O 관련 커널 영역인 ISR, 시스템 버퍼, 인터럽트 벡터, 디바이스 드라이버 등의 영역을 사용자 프로그램이 직접 접근할 수 없도록 하는 사전 작업이 동반되어야 한다. (이러한 메모리 영역 보호방법은 메모리 경영 파트에서 알아볼 것이다.)
  • 불법(illegal) 메모리 접근 차단 : Base 레지스터와 Limit 레지스터로 프로그램 공간을 정의한다. 특정 프로그램이 메모리를 접근하려 할 때 대상주소가 해당 범위를 벗어나는지 하드웨어적인 메모리 관리 유닛이 체크하고, 벗어나면 이에 트랩을 걸어 커널이 처리하도록 한다. 리눅스 C프로그래밍시에 종종 발생하는 'Segmentation Fault' 오류는 주소 설정이 잘못되어 Base 레지스터 ~ Limit 레지스터의 공간을 벗어났을 때 발생하는 오류이다.
  • 무한루프 방지 : 시분할 방식에서는 '타임 슬라이스'를 사용한다. 타임슬라이스는 타이머 인터럽트로 구현되는데 이는 특권 명령어로 만들어진 것이다. 그러면 응용프로그램이 악의적으로 타이머 인터럽트를 변경할 수 없게 되고, 시분할 시스템이 제대로 돌아가 무한 루프에 빠져 CPU 작동이 멈추는 것을 방지할 수 있게 된다.

캐시

  • 레지스터, 캐시, 메인메모리, 디스크 순서로 용량은 커지지만 속도는 느려진다. 이 중 캐시는 CPU의 레지스터와 메인 메모리 사이의 접근 속도 또는 전송량 차이를 완화시키기 위해 고안되었다. CPU에서 메인메모리에 접근 시 해당 자료를 속도가 빠른 캐시에 복사해놓고 다음 접근시 필요한 자료가 캐시에 존재하면 이를 활용한다.
  • 다만 캐시에 무조건 자료가 존재하지 않을 것이라는 것이 문제인데, 이는 알고리즘으로 개선이 가능하다. 특정 알고리즘을 활용해 이 확률(Hit Ratio라고 부른다)을 90% 이상까지 개선 가능하다.
  • 메모리 계층 구조 : 캐시의 개념을 확장하여 구성한다. 메모리는 레지스터-캐시-메인메모리-하드디스크-광디스크-자기테이프의 계층으로 이루어져 있다. 이렇게하면 전체 용량은 최하위 기억장치의 용량처럼, 접근 속도는 최상위 기억장치의 속도처럼 활용할 수 있을 것이다. (물론 이론적인 이야기이다.)

부트스트래핑

  • 부트스트래핑 : 흔히 부르는 '부팅'이다. 어원적으로는 장화 뒤쪽에 달린 고리를 의미한다. 해당 고리는 남의 도움없이 장화를 혼자 신을 수 있게 하는 도구인데, 이 개념이 확장되어 남의 도움없이 자기가 직접 일을 한다는 뜻이 되었다. 즉, 운영체제의 시동을 운영체제 일부 기능이 스스로 수행한다는 의미이다.
  • 처음 전원이 들어오면 메인 메모리 공간에는 아무것도 없다. 따라서 전원을 켰을 때 아주 작은 프로그램이라도 어딘가에 존재해야만 부팅 과정을 시작할 수 있다. 이 프로그램이 ROM에 20~30바이트 정도로 존재하는 '롬 로더'이다. 이 롬 로더는 DMA를 이용해 하드디스크 섹터에 존재하는 마스터 부트 레코드로부터 부트스트랩 로더의 첫번째 블록을 메인 메모리에 적재하고, 그 후 첫번째 블록의 작용으로 나머지 블록이 모두 적재되면 롬 로더는 메모리 상위장소로 이동되고 이번엔 커널 프로그램을 읽어들여 하위 기억장소에 적재한다. 커널 적재가 모두 마무리되면 약속된 장소로 점프하여 커널을 시작시킨다.

커널의 종류

  • 커널은 구성상 특징으로 두가지로 구분된다.
  • 모노리틱 커널 : 커널이 하나의 통으로만 이루어져 있다. 프로세스 관리, 메모리 관리, 파일 시스템, 입출력 관리 및 네트워크 관리 등의 모든 기능이 커널에 포함되어 잇다. 따라서 효율성은 매우 높지만 다른 플랫폼으로의 이식성이나 확장성에 한계가 있다. 이러한 한계를 극복하기 위해 환경에 관련된 부분은 계층적으로 분리하기도 한다. 대표적인 예로 리눅스가 있다. 리눅스는 모듈 개념을 사용해 확장성 문제를 해결했다. 이러한 모노리틱 커널은 앞서 언급했듯이 효율성이 좋아 시스템 호출 속도가 빠르다는 장점이 있다. 하지만 새로운 하드웨어 플랫폼에 대한 이식성이 떨어지고, 모두 하나의 통에 들어있어 한 부분에서 발생한 문제가 다른 시스템에 영향을 줄 수 있으며, 구성요소 간 의존성이 높은만큼 디버깅이 어렵다는 단점이 있다.
  • 마이크로 커널 : 프로세스간 통신, 메모리 관리, 클럭 인터럽트 처리와 CPU 스케쥴링 등의 핵심기능만 커널에 포함시키고 나머지는 서버 형태로 두어 사용자 모드의 프로세스를 수행하도록 한 형태이다. 응용 프로그램이 시스템 호출을 하면 통신을 통해 파일 시스템이나 디바이스 드라이버 수행 프로세스로 메세지를 보내는 방식이다. (시스템 호출의 결과도 메세지로 전달된다.) 통신 프로토콜이나 다바이스 드라이버 등의 수행은 사용자 프로세스로 존재하고 파일 시스템의 일종이 서버 프로세스로 수행된다. 인터럽트도 메세지를 보내 처리된다. 이러한 마이크로 커널은 유연성이 좋고 한 부분에서 발견된 오류가 전체로 퍼지지 않는다는 장점이 있다. 커널이 소형화되어 있고 서버들 중 필요한 부분만 골라서 제품을 구성할 수 있기 때문에 소형 내장 시스템에 활용하기도 좋다. 하지만 메세지 전송이 빈번해지면 속도가 느려지는 등의 성능적 문제가 발생할 수 있다는 단점이 있다.
반응형