검수요청.png검수요청.png

커널

해시넷
이동: 둘러보기, 검색

커널(Kernel)은 컴퓨터의 운영체제의 핵심이 되는 컴퓨터 프로그램의 하나로, 하드웨어응용프로그램 사이에서 인터페이스를 제공하여 응용 프로그램이 하드웨어에서부터 오는 자원을 관리하고 사용할 수 있게 해준다. 즉, 시스템의 모든 것을 완전히 통제한다.[1][2]

개요[편집]

커널은 종료된 입출력 연산 등 커널의 서비스를 경쟁적으로 요구하는 모든 요청을 처리하는 '인터럽트 처리기'와 어떤 프로그램들이 어떤 순서로 커널의 처리 시간을 공유할 것인지를 결정하는 '스케쥴러', 그리고 스케쥴이 끝나면 실제로 프로세스에게 컴퓨터의 사용권을 부여하는 '수퍼바이저' 등이 포함되어 있다. 또한, 커널은 저장장치나 메모리 내에서 운영체계의 주소 공간을 관리하고, 이들을 주변 장치들과 커널의 서비스들을 사용하는 다른 사용자들에게 고루 나누어 주는 '메모리 관리자'를 가지고 있다. 커널을 유지하기 위한 코드는 지속적으로 사용되기에, 보통 자주 사용되지 않는 운영체계 안의 보호된 메모리 영역에 적재된다.[3]

특징[편집]

컴퓨터에 속한 자원들의 접근을 중재한다. 커널은 운영체제의 핵심 부분이고, 역할 또한 운영체제의 핵심역할이다. 입출력을 관리하고 소프트웨어로부터의 요청을 하드웨어가 처리할 수 있도록 변환한다.

기능[편집]

  • 메모리 관리: 메모리가 어디에서 무엇을 저장하는 데 얼마나 사용되는지를 추적한다.
  • 프로세스 관리: 어떤 프로세스가 중앙 처리 장치(CPU)를 얼마나 오랫동안 사용할지를 결정한다.
  • 장치 드라이버: 하드웨어와 프로세스 사이에서 중재자의 역할을 수행한다.
  • 시스템 호출 및 보안: 프로세스의 서비스 요청을 수신한다.[4]
  • 파일 시스템 관리: 파일 저장의 기본적인 구조와 시스템 관리를 위한 기본 환경을 제공한다. 계층적인 트리 구조의 형태이다.[5]
  • 디바이스 제어: 장치들을 디바이스 드라이버를 통해 일관되게 접속하도록 해준다.
  • 네트워크 관리: 네트워크 장치를 소켓이라는 개념으로 제공해준다.[6]
  • 자원 관리: 한정된 자원을 효율적으로 관리하여 프로그램의 실행을 원활하게 한다.
  • 추상화: 프로그래머가 여러 장비에서 작동하는 프로그램을 개발하는 것을 돕는다.[7]

종류[편집]

  • 단일형 커널(Monolithic Kernel): 커널의 다양한 서비스 및 수준 높은 하드웨어 추상화를 하나의 주소 공간으로 묶은 것으로, 모듈들이 분리되어 있지 않기 때문에 모듈 간의 통신 비용이 줄어들어 성능이 좋다. 하지만 버그나 오류 발생 시에 여러 기능이 상호 의존성이 높아 작은 결함에도 시스템 전체가 위험해지고, 처리 또한 까다로우며, 유지보수가 어렵다. 높은 수준의 가상 계층은 기본 연산 집합과 관리자 모드에서 작동하는 동시성, 메모리 관리, 프로세스 관리 등의 운영 체제 서비스를 구현하기 위한 시스템 콜로 되어 있다.[7][8][9]
  • 혼합형 커널(Hybrid Kernel): 운영체제에 추가되어야 하는 메커니즘을 최소한으로 제공하는 초소형 커널로, 성능 향상을 위해 코드를 추가로 커널 공간에 넣은 것을 제외하면 많은 부분은 순수 마이크로 커널이라고 한다.[8]
  • 엑소커널(ExoKernel): 낮은 수준의 하드웨어 접근을 위한 최소한의 추상화를 제공한다. 엑소커널 시스템에서는 커널이 아닌 라이브러리가 단일형 커널 수준의 추상을 제공한다.[8]
  • 계층형 커널(Layered Kernel): 비슷한 기능을 가진 모듈들을 묶어서 계층을 만들어, 계층 간의 통신으로 운영체제를 구현한다. 단일형 구조보다 버그나 오류를 쉽게 처리할 수 있고, 디버깅이 쉽다. 하지만 상하관계가 생겨 하나의 계층에 이상이 생기면, 다른 계층도 동작하지 못할 수 있고, 운영체제가 커지고 복잡해지면 많은 계층이 발생하게 되어 커널의 크기가 커지고, 하드웨어의 용량도 늘어난다. [9]
  • 마이크로커널(MicroKernel): 하드웨어 추상화에 대한 간결한 집합을 제공하고, 더 많은 기능은 응용 소프트웨어를 통해 제공한다. 또한, 프로세스 관리, 메모리 관리, 프로세스 간의 통신 관리 등 기본적인 기능만 제공하고, 나머지는 사용자 영역에 구현하는 구조이다. 커널의 크기가 작아 커널과 일부 서비스만으로 작은 운영체제를 구성하여 임베디드 시스템에 사용할 수 있고, 하나의 커널로 다수의 운영체제를 동시에 수행할 수 있다. 그리고 이식성이 좋고, 모듈 크기가 아주 작아져 안정성이 높아졌으며, 각 모듈이 독립적으로 작동하기에 하나의 모듈이 실패해도 전체 운영체제가 멈추지 않는다. 하지만 통신이 자주 필요하여 성능이 저하될 우려가 있다.[9]
  • 나노커널(NonoKernel): 모든 커널 코드의 양이 매우 작은 커널로, 실질적으로 모든 서비스를 책임진다.[10]

단일형 커널 vs 마이크로커널[편집]

단일형 커널은 운영체제에서 제공할 수 있는 여러 커널에 한 덩어리로 묶여있다. 반면 마이크로커널은 기본적으로 필요한 기능들을 제외하고 서버라는 개념으로 유저 모드에 올라와 있다. 단일형 커널에는 포함된 장치 드라이버가 마이크로커널에는 없다.[11] 단일형 커널은 커널과 애플리케이션이 단계별로 나누어져 있지만, 마이크로커널은 하나의 구조로 통합되어 있다. 즉, 단일형 커널은 커널과 애플리케이션 바이너리가 따로 만들어지지만, 마이크로커널은 커널과 애플리케이션이 하나의 바이너리로 만들어진다. 리얼타임 성능적인 부분에 있어서 마이크로 커널이 단일형 커널보다 훨씬 월등하다.[12]

리눅스 커널[편집]

프로세서와 시스템 메모리에 상주하면서 디바이스나 메모리 같은 하드웨어 자원을 관리하고, 프로세스의 스케줄을 관리하여 다중 프로세스를 구현하고, 시스템에 연결된 입출력을 처리하는 운영체제의 핵심역할을 수행한다.

  • 모놀리식 커널: 리눅스 커널은 대부분 유닉스 커널과 같은 모놀리식(Monolithic)이다. 그렇기에 논리적으로 구분되는 여러 구성 요소들이 상호 간에 연결되어 동작한다.
  • 비선점형과 선점형: 비선점형 커널은 프로세스의 동작 상태가 사용자 모드에서 커널 모드로 진입하면 외부에서 해당 프로세스를 중지시키지 못한다. 즉, 해당 프로세스가 커널 모드에서 빠져나왔을 경우에만 스케줄링이 가능하다. 선점형 커널은 프로세스가 커널 모드로 동작하더라도 스케줄링 정책이 다른 외부적인 접근을 통해 프로세스를 강제로 중지시킬 수 있다. 수행 중인 프로세스가 커널 모드로 진입되어 있어도, 우선권이 높은 프로세스로 즉시 전환할 수 있다.[8]
  • 가상 메모리 시스템(VM): 메모리 사용량이 늘어나면 디스크 일부를 확장된 (RAM)처럼 사용할 수 있게 해준다. 커널은 실제 메모리(RAM)에 올라와 있는 블록 중에 당장 쓰이지 않는 것을 디스크에 저장하는데, 이로 인해 사용 가능한 메모리 영역을 훨씬 늘릴 수 있게 된다.[13]
  • 메모리 관리 장치(MMU) 지원 안 함: 주로 메모리 관리 장치(MMU)를 이용하여 메모리 관리를 수행한다. 하지만 임베디드 시스템에서 사용하는 프로세서의 경우는 메모리 관리 장치(MMU)가 없는 경우도 있다.[14]
  • 모듈을 이용한 커널 확장: 운영체제가 동작하는 중에 커널 코드를 추가하거나 삭제할 수 있다.[8][14]
  • 가상파일 시스템(VFS): 표준 유닉스 파일 시스템이 제공하는 모든 시스템 콜을 처리하는 소프트웨어 계층으로, 여러 종류의 파일 시스템에 대해 공통 인터페이스를 제공한다.[15]

커널 패닉[편집]

운영체제가 치명적인 내부 오류를 감지하여 안전하게 복구할 수 없을 때 취하는 동작이다.[16] 커널은 운영체제의 핵심이기 때문에 커널 패닉일 경우 컴퓨터를 사용할 수 없게 된다. 이 경우에 재부팅을 하면 되지만, 그다음부터 컴퓨터를 쓸 수 없는 경우도 가끔 발생한다. 대표적으로 윈도의 블루스크린이 있다. 커널 드라이브에서 문제가 발생했다면 잠시 정지했다가 드라이버 재시작을 시도한다. 재시작에 성공하면 커널 패닉 메시지는 뜨지 않는다.[17]

취약점[편집]

UMPD

윈도 커널 요소인 UMPD에서 발견됐다. UMPD는 프린터 그래픽 DLL과 프린터 인터페이스 DLL 두 가지 요소로 구성되어 있다. 문제는 UMPD와 특정 윈도 커널 기능들이 상호작용을 하기 시작할 때 발생한다. 사용자가 인쇄와 관련된 기능들을 사용할 때, UMPD가 그래픽 엔진을 가동하고, '콜백(callbacks)'이라는 것을 커널로부터 받기 시작한다. 이 상호작용이 일어나는 방식이 취약해지면, 공격자들이 특정 코드를 주입할 수 있게 된다. 마이크로소프트(MS)는 이미 로그인된 공격자만이 익스플로잇 할 수 있는 권한 상승 취약점이라고 묘사했었고, 익스플로잇에 성공한 공격자는 프로그램 설치, 데이터 열람, 조작 및 삭제, 권한 높은 계정 생성 등의 악성 행위를 할 수 있다고 경고했다. 하지만 블랙햇 유럽(Black Hat Europe)행사에서 사용자 모드의 콜백 메커니즘을 사용하여 커널 층위의 공격에 성공했다. 오래된 취약점, 잘 알려진 취약점, 공격 가능성이 작다고 치부된 취약점은 고질적인 보안 문제이다.[18]

리눅스 커널

두 개의 취약점들이 발견되었지만, 패치되지 않았다. 이 취약점들을 익스플로잇 할 경우 디도스 공격이 가능해진다. 둘 다 널 포인터 역참조(NULL pointer dereference) 오류들이며, 로컬에서 익스플로잇이 가능하다. 하나의 취약점은 CVE-2018-19406으로, 이 오류의 경우 APIC(Advanced Programmable Interrupt Controller)맵이 올바르게 시작되지 않았을 때 발동된다. 취약점을 익스플로잇 하기 위해서 로컬의 공격자가 조작된 시스템 요청을 사용해 APIC 맵이 제대로 시작되지 않는 상황을 유발해야 한다. 두 번째 취약점은 CVE-2018-19407로, 입출력(I/O) APIC가 제대로 시작되지 않을 때 발동된다. 로컬의 사용자가 조작된 시스템 호출을 통해 공격 가능한 상황을 만들 수 있다. 취약점은 scan ioapic 로직과 관련이 있어, 패치의 방향성은 I/O APIC가 발동되지 않은 상태에서 scan ioapic 로직이 시작되지 않도록 해야 한다.[19]

가상 메모리 영역

리눅스 커널이 페이지에서 발생한 오류를 다루기 위해 가상 메모리 영역(VMA)에 접근할 때, 올바른 답을 찾기 위해 코드 내 모든 가상 메모리 영역을 크롤링하는 과정이 발생한다. 이 과정은 매우 느리고, 효율이 낮다. 그래서 캐싱(caching)을 활용하였다.. 하지만 효율이 높아진 대신 다른 문제가 발생했다. 가상 메모리 영역이 사용된 이후, 모든 스레드의 가상 메모리 영역 캐시들을 무효화시켜야 한다. 그렇지 않으면 다음 가상 메모리 영역 검색 혹은 사용 시 댕글링 포인트(dangling pointer)를 따라가게 된다. 한 프로세스에도 많은 스레드가 있을 수 있어, 모든 스레드의 가상 메모리 영역 캐시들을 반복 처리하는 것만으로도 시스템 퍼포먼스에 문제가 생길 수 있다. 이것을 해결하기 위해서 스레드들에 시퀀스 번호를 붙여 구분하는 절차가 필요하다. 하지만 시퀀스 번호는 32bit로 제한점이 있다. 따라서 오버플로우 처리 로직이 추가되어 UaF 취약점을 유발한다. UaF 취약점이란, 사용이 끝난 메모리 공간에 접근하려는 시도를 지지한다. 이로 인해 프로그램이 어떤 메모리 영역에 대한 해제 책임을 지고 있는지 혼선이 발생함으로써 야기된다.[20]

활용[편집]

양자컴퓨터

정보처리의 기본 단위로 '큐비트'를 쓰는 양자컴퓨터는 기존 컴퓨터보다 정보 처리와 연산 능력이 뛰어나다. 기존 컴퓨터와는 연산 방법이 달라 복잡한 데이터를 다루는 인공지능(AI) 기술인 기계학습에 적용하기 어렵다. 양자컴퓨터는 본질적으로 일차방정식을 잘 푸는 선형적인 특성이 있다. 복잡한 데이터를 다루는 비선형적 기계학습에 적용하는 데 어려움이 있다. 매우 적은 계산량으로 빠른 연산이 가능하여 대규모 계산량이 필요한 현재 인공지능 기술을 능가할 것이다. 학습 데이터와 테스트 데이터를 양자 정보로 생성한 후 양자 정보의 병렬 연산을 가능하게 하는 기술과 양자 측정 기술을 조합하여 양자 데이터 간의 유사성을 효율적으로 계산하는 지도학습 구현이 가능한 양자 알고리즘 체계를 만들었다. 기계학습을 구현하기 위해 주어진 데이터의 특징을 구분해 분류해야 한다. 이 과정에서 비선형 커널 기술이 필요하다. 저차원 입력 공간에 데이터를 큐비트로 표현되는 고차원 데이터 특징 공간으로 옮겨 양자화된 학습 데이터와 테스트 데이터 간의 커널 함수를 양자 중처 현상을 이용하여 동시에 계산하고 테스트 데이터 분류를 효율적으로 결정하도록 했다.[21]

윈도, 크롬

구글과 마이크로소프트가 오픈소스 운영체제인 리눅스 커널을 윈도우 10과 크롬 OS 안에 통합한다. 마이크로소프트는 2016년 갑작스럽게 발표했던 리눅스용 윈도 서브 시스템을 손봤다. 사용자가 다른 리눅스 소프트웨어나 배시 애플리케이션을 명령줄에서 실행할 수 있다. 하지만 에뮬레이터에 의존하기에 성능이 종종 떨어진다. 2019년 마이크로소프트 빌드 행사에서 발표된 리눅스용 윈도 서브 시스템 2는 완전한 리눅스 커널 버전 4.19를 윈도 안에 경량 가상 머신으로 들여왔다. 이 도구를 사용하는 개발자 입장에서는 역량 향상으로 이용할 수 있다. 애저에서도 같은 커널이 사용되는데, 두 경우 모두 리눅스 부팅 시간이 줄어들었고, 메모리 사용이 단순해졌다. 크롬 OS는 리눅스 기반으로 구축되어 크롬북에도 리눅스를 설치할 수 있다. 2018년 구글은 베타 채널에 크롬북 리눅스 애플리케이션 실행 기능을 추가했다. 하지만 크롬북 특정 제품에서만 사용할 수 있었다. 그 후 구글은 인텔, AMD, ARM 등 어떤 프로세서 상관없이 모든 크롬북이 리눅스 앱을 실행 할 수 있게 되었다. 윈도 10과 크롬 OS에 리눅스가 녹아들었고, 원래 적었던 리눅스 배포판까지 합쳐 어떤 PC를 선택해도 리눅스 커널과 리눅스 소프트웨어를 선택할 수 있다.[22]

각주[편집]

  1. 커널(컴퓨팅)〉, 《위키백과》
  2. Anderson Kim, 〈(운영체제) 커널이란?〉, 《IT 내맘대로 끄적끄적》, 2019-08-27
  3. (커널) 알아봅시다, '커널(Kernel)'〉, 《오픈소스소프트웨어》, 2013-05-16
  4. Linux 커널이란 무엇일까요?〉, 《레드햇》
  5. 리눅스 구성 요소(커널, 셸, 파일 시스템)〉, 《티스토리》, 2020-03-29
  6. 삽잡이 shovelman, 〈(Surro) 1. 리눅스 커널의 이해〉, 《한글로는 삽잡이, 영어로는...》, 2013-10-29
  7. 7.0 7.1 커널〉, 《아이티위키》
  8. 8.0 8.1 8.2 8.3 8.4 커널(kernel)〉, 《티스토리》, 2016-02-17
  9. 9.0 9.1 9.2 Kernel(커널)〉, 《티스토리》, 2019-03-10
  10. 마이크로커널〉, 《위키백과》
  11. chelsea, 〈(운영체제) Kernel〉, 《첼시-velog》, 2020-07-08
  12. jangpro, 〈모노리틱 커널 vs 마이크로 커널〉, 《네이버 블로그》, 2010-11-03
  13. 리눅스에서의 가상 메모리란?〉, 《티스토리》, 2017-01-28
  14. 14.0 14.1 리눅스 커널과 모듈〉, 《티스토리》, 2010-01-26
  15. 리눅스 커널 공부 정리 0X04 - 가상 파일 시스템〉, 《티스토리》, 2017-01-28
  16. 커널 패닉〉, 《위키백과》
  17. 커널 패닉(r20200302판)〉, 《더위키》
  18. 문가용 기자, 〈오래된 윈도 커널 요소 취약점의 익스플로잇 등장〉, 《보안뉴스》, 2020-12-10
  19. 문가용 기자, 〈리눅스 커널에서의 두 가지 취약점, 아직 패치되지 않아〉, 《보안뉴스》, 2018-11-28
  20. 문가용 기자, 〈리눅스 커널 내에서 또! 루트 권한 넘겨주는 취약점 나와〉, 《보안뉴스》, 2018-10-01
  21. 김민수 기자, 〈국내 연구진, 양자컴퓨터에서 AI 구현하는 알고리즘 개발〉, 《동아사이언스》, 2020-07-07
  22. Brad Chacos, 〈윈도우 10, 크롬 OS, 일제히 리눅스 커널 적용 발표〉, 《아이티월드》, 2019-05-13

참고자료[편집]

같이 보기[편집]


  검수요청.png검수요청.png 이 커널 문서는 소프트웨어에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.