"커널"의 두 판 사이의 차이
17번째 줄: | 17번째 줄: | ||
=== 종류 === | === 종류 === | ||
− | * '''단일형 커널'''(Monolithic Kernel): 커널의 다양한 서비스 및 수준 높은 하드웨어 추상화를 하나의 주소 공간으로 묶은 것으로, | + | * '''단일형 커널'''(Monolithic Kernel): 커널의 다양한 서비스 및 수준 높은 하드웨어 추상화를 하나의 주소 공간으로 묶은 것으로,<ref name="티"> 〈[https://genesis8.tistory.com/241 커널(kernel)]〉, 《티스토리》, 2016-02-17 </ref> 모듈들이 분리되어 있지 않기 때문에 모듈 간의 통신 비용이 줄어들어 성능이 좋다. 하지만 버그나 오류 발생 시에 여러 기능들이 상호 의존성이 높아 작은 결함에도 시스템 전체가 위험해지고, 처리 또한 까다로우며, 유지보수가 어렵다. |
− | * '''마이크로커널'''(MicroKernel): 하드웨어 추상화에 대한 간결한 집합을 제공하고, 더 많은 기능은 응용 소프트웨어를 통해 제공한다. | + | * '''마이크로커널'''(MicroKernel): 하드웨어 추상화에 대한 간결한 집합을 제공하고, 더 많은 기능은 응용 소프트웨어를 통해 제공한다. 또한 프로세스 관리, 메모리 관리, 프로세스 간의 통신 관리 등 기본적인 기능만 제공하고, 나머지는 사용자 영역에 구현을 하는 구조이다. 커널의 크기가 작아 커널과 일부 서비스만으로 작은 운영체제를 구성하여 임베디드 시스템에 사용할 수 있고, 하나의 커널로 다수의 운영체제를 동시에 수행할 수 있다. 그리고 이식성이 좋고, 모듈 크기가 굉장히 작아져 안정성이 높아졌으며, 각 모듈이 독립적으로 작동하기에 하나의 모듈이 실패해도 전체 운영체제가 멈추지 않는다. 하지만 통신이 자주 필요하여 성능이 저하될 우려가 있다.<ref name="토"> 〈[https://bnzn2426.tistory.com/41 Kernel(커널)]〉, 《티스토리》, 2019-03-10 </ref> |
* '''혼합형 커널'''(Hybrid Kernel): 운영체제에 추가되어야 하는 메커니즘을 최소한으로 제공하는 초소형 커널로, 성능 향상을 위해 코드를 추가로 커널 공간에 넣은 것을 제외하면 많은 부분은 순수 마이크로 커널이라고 한다.<ref name="티"> 〈[https://genesis8.tistory.com/241 커널(kernel)]〉, 《티스토리》, 2016-02-17 </ref> | * '''혼합형 커널'''(Hybrid Kernel): 운영체제에 추가되어야 하는 메커니즘을 최소한으로 제공하는 초소형 커널로, 성능 향상을 위해 코드를 추가로 커널 공간에 넣은 것을 제외하면 많은 부분은 순수 마이크로 커널이라고 한다.<ref name="티"> 〈[https://genesis8.tistory.com/241 커널(kernel)]〉, 《티스토리》, 2016-02-17 </ref> | ||
* '''나노커널'''(NonoKernel): 모든 커널 코드의 양이 매우 작은 커널로, 실질적으로 모든 서비스를 책임진다.<ref> 〈[https://ko.wikipedia.org/wiki/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%BB%A4%EB%84%90 마이크로커널]〉, 《위키백과》 </ref> | * '''나노커널'''(NonoKernel): 모든 커널 코드의 양이 매우 작은 커널로, 실질적으로 모든 서비스를 책임진다.<ref> 〈[https://ko.wikipedia.org/wiki/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%BB%A4%EB%84%90 마이크로커널]〉, 《위키백과》 </ref> | ||
* '''엑소커널'''(ExoKernel): 낮은 수준의 하드웨어 접근을 위한 최소한의 추상화를 제공한다. 엑소커널 시스템에서는 커널이 아닌 라이브러리가 단일형 커널 수준의 추상을 제공한다.<ref name="티"> 〈[https://genesis8.tistory.com/241 커널(kernel)]〉, 《티스토리》, 2016-02-17 </ref> | * '''엑소커널'''(ExoKernel): 낮은 수준의 하드웨어 접근을 위한 최소한의 추상화를 제공한다. 엑소커널 시스템에서는 커널이 아닌 라이브러리가 단일형 커널 수준의 추상을 제공한다.<ref name="티"> 〈[https://genesis8.tistory.com/241 커널(kernel)]〉, 《티스토리》, 2016-02-17 </ref> | ||
+ | * '''계층형 커널'''(Layered Kernel): 비슷한 기능을 가진 모듈들을 묶어서 계층을 만들어, 계층 간의 통신으로 운영체제를 구현한다. 단일형 구조보다 버그나 오류를 쉽게 처리할 수 있고, 디버깅이 쉽다. 하지만 상하관계가 생겨 하나의 계층에 이상이 생기면, 다른 계층도 동작하지 못할 수 있고, 운영체제가 커지고 복잡해지면 많은 계층들이 발생하게 되어 커널의 크기가 커지고, 하드웨어의 용량도 늘어난다. <ref name="토"> 〈[https://bnzn2426.tistory.com/41 Kernel(커널)]〉, 《티스토리》, 2019-03-10 </ref> | ||
=== 리눅스 커널 === | === 리눅스 커널 === | ||
53번째 줄: | 54번째 줄: | ||
* 삽잡이 shovelman, 〈[https://blog.shovelman.dev/20 (Surro) 1. 리눅스 커널의 이해]〉, 《한글로는 삽잡이, 영어로는...》, 2013-10-29 | * 삽잡이 shovelman, 〈[https://blog.shovelman.dev/20 (Surro) 1. 리눅스 커널의 이해]〉, 《한글로는 삽잡이, 영어로는...》, 2013-10-29 | ||
* 〈[https://genesis8.tistory.com/241 커널(kernel)]〉, 《티스토리》, 2016-02-17 | * 〈[https://genesis8.tistory.com/241 커널(kernel)]〉, 《티스토리》, 2016-02-17 | ||
+ | * 〈[https://bnzn2426.tistory.com/41 Kernel(커널)]〉, 《티스토리》, 2019-03-10 | ||
* 〈[https://ko.wikipedia.org/wiki/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%BB%A4%EB%84%90 마이크로커널]〉, 《위키백과》 | * 〈[https://ko.wikipedia.org/wiki/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%BB%A4%EB%84%90 마이크로커널]〉, 《위키백과》 | ||
− | |||
* 〈[https://3dmpengines.tistory.com/1663 리눅스에서의 가상 메모리란?]〉, 《티스토리》, 2017-01-28 | * 〈[https://3dmpengines.tistory.com/1663 리눅스에서의 가상 메모리란?]〉, 《티스토리》, 2017-01-28 | ||
* 〈[https://msonic.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%BB%A4%EB%84%90%EA%B3%BC-%EB%AA%A8%EB%93%88 리눅스 커널과 모듈]〉, 《티스토리》, 2010-01-26 | * 〈[https://msonic.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%BB%A4%EB%84%90%EA%B3%BC-%EB%AA%A8%EB%93%88 리눅스 커널과 모듈]〉, 《티스토리》, 2010-01-26 |
2021년 1월 18일 (월) 16:28 판
커널(Kernel)은 컴퓨터의 운영체제의 핵심이 되는 컴퓨터 프로그램의 하나로, 하드웨어와 응용프로그램 사이에서 인터페이스를 제공하여 응용 프로그램이 하드웨어에서부터 오는 자원을 관리하고 사용할 수 있게 해준다. 즉, 시스템의 모든 것을 완전히 통제한다.[1] [2]
개요
커널은 종료된 입출력 연산 등 커널의 서비스를 경쟁적으로 요구하는 모든 요청을 처리하는 '인터럽트 처리기'와 어떤 프로그램들이 어떤 순서로 커널의 처리 시간을 공유할 것인지를 결정하는 '스케쥴러', 그리고 스케쥴이 끝나면 실제로 프로세스에게 컴퓨터의 사용권을 부여하는 '수퍼바이저' 등이 포함되어 있다. 또한 커널은 저장장치나 메모리 내에서 운영체계의 주소 공간을 관리하고, 이들을 주변 장치들과 커널의 서비스들을 사용하는 다른 사용자들에게 고루 나누어 주는 '메모리 관리자'를 가지고 있다. 커널을 유지하기 위한 코드는 지속적으로 사용되기에, 보통 자주 사용되지 않는 운영체계 안의 보호된 메모리 영역에 적재된다.[3]
특징
컴퓨터에 속한 자원들의 접근을 중재한다. 커널은 운영체제의 핵심 부분이고, 역할 또한 운영체제의 핵심역할이다. 입출력을 관리하고 소프트웨어로부터의 요청을 하드웨어가 처리할 수 있도록 변환한다.
기능
- 메모리 관리: 메모리가 어디에서 무엇을 저장하는 데 얼마나 사용되는지를 추적한다.
- 프로세스 관리: 어떤 프로세스가 중앙 처리 장치(CPU)를 얼마나 오랫동안 사용할지를 결정한다.
- 장치 드라이버: 하드웨어와 프로세스 사이에서 중재자의 역할을 수행한다.
- 시스템 호출 및 보안: 프로세스의 서비스 요청을 수신한다.[4]
- 파일 시스템 관리: 파일 저장의 기본적인 구조와 시스템 관리를 위한 기본 환경을 제공한다. 계층적인 트리 구조의 형태이다.[5]
- 디바이스 제어: 장치들을 디바이스 드라이버를 통해 일관되게 접속하도록 해준다.
- 네트워크 관리: 네트워크 장치를 소켓이라는 개념으로 제공해준다.[6]
종류
- 단일형 커널(Monolithic Kernel): 커널의 다양한 서비스 및 수준 높은 하드웨어 추상화를 하나의 주소 공간으로 묶은 것으로,[7] 모듈들이 분리되어 있지 않기 때문에 모듈 간의 통신 비용이 줄어들어 성능이 좋다. 하지만 버그나 오류 발생 시에 여러 기능들이 상호 의존성이 높아 작은 결함에도 시스템 전체가 위험해지고, 처리 또한 까다로우며, 유지보수가 어렵다.
- 마이크로커널(MicroKernel): 하드웨어 추상화에 대한 간결한 집합을 제공하고, 더 많은 기능은 응용 소프트웨어를 통해 제공한다. 또한 프로세스 관리, 메모리 관리, 프로세스 간의 통신 관리 등 기본적인 기능만 제공하고, 나머지는 사용자 영역에 구현을 하는 구조이다. 커널의 크기가 작아 커널과 일부 서비스만으로 작은 운영체제를 구성하여 임베디드 시스템에 사용할 수 있고, 하나의 커널로 다수의 운영체제를 동시에 수행할 수 있다. 그리고 이식성이 좋고, 모듈 크기가 굉장히 작아져 안정성이 높아졌으며, 각 모듈이 독립적으로 작동하기에 하나의 모듈이 실패해도 전체 운영체제가 멈추지 않는다. 하지만 통신이 자주 필요하여 성능이 저하될 우려가 있다.[8]
- 혼합형 커널(Hybrid Kernel): 운영체제에 추가되어야 하는 메커니즘을 최소한으로 제공하는 초소형 커널로, 성능 향상을 위해 코드를 추가로 커널 공간에 넣은 것을 제외하면 많은 부분은 순수 마이크로 커널이라고 한다.[7]
- 나노커널(NonoKernel): 모든 커널 코드의 양이 매우 작은 커널로, 실질적으로 모든 서비스를 책임진다.[9]
- 엑소커널(ExoKernel): 낮은 수준의 하드웨어 접근을 위한 최소한의 추상화를 제공한다. 엑소커널 시스템에서는 커널이 아닌 라이브러리가 단일형 커널 수준의 추상을 제공한다.[7]
- 계층형 커널(Layered Kernel): 비슷한 기능을 가진 모듈들을 묶어서 계층을 만들어, 계층 간의 통신으로 운영체제를 구현한다. 단일형 구조보다 버그나 오류를 쉽게 처리할 수 있고, 디버깅이 쉽다. 하지만 상하관계가 생겨 하나의 계층에 이상이 생기면, 다른 계층도 동작하지 못할 수 있고, 운영체제가 커지고 복잡해지면 많은 계층들이 발생하게 되어 커널의 크기가 커지고, 하드웨어의 용량도 늘어난다. [8]
리눅스 커널
프로세서와 시스템 메모리에 상주하면서 디바이스나 메모리 같은 하드웨어 자원을 관리하고, 프로세스의 스케줄을 관리하여 다중 프로세스를 구현하고, 시스템에 연결된 입출력을 처리하는 운영체제의 핵심역할을 수행한다.
- 모놀리식 커널: 리눅스 커널은 대부분 유닉스 커널과 같은 모놀리식(Monolithic)이다. 그렇기에 논리적으로 구분되는 여러 구성 요소들이 상호 간에 연결되어 동작한다.
- 비선점형과 선점형: 비선점형 커널은 프로세스의 동작 상태가 사용자 모드에서 커널 모드로 진입하면 외부에서 해당 프로세스를 중지시키지 못한다. 즉, 해당 프로세스가 커널 모드에서 빠져나왔을 경우에만 스케줄링이 가능하다. 선점형 커널은 프로세스가 커널 모드로 동작하더라도 스케줄링 정책이 다른 외부적인 접근을 통해 프로세스를 강제로 중지시킬 수 있다. 수행 중인 프로세스가 커널 모드로 진입되어 있어도, 우선권이 높은 프로세스로 즉시 전환할 수 있다.[7]
- 가상 메모리 시스템(VM): 메모리 사용량이 늘어나면 디스크의 일부를 확장된 램(RAM)처럼 사용할 수 있게 해준다. 커널은 실제 메모리(RAM)에 올라와 있는 블록 중에 당장 쓰이지 않는 것을 디스크에 저장하는데, 이로 인해 사용 가능한 메모리 영역을 훨씬 늘릴 수 있게 된다.[10]
- 메모리 관리 장치(MMU) 지원 안 함: 주로 메모리 관리 장치(MMU)를 이용하여 메모리 관리를 수행한다. 하지만 임베디드 시스템에서 사용하는 프로세서의 경우는 메모리 관리 장치(MMU)가 없는 경우도 있다.<ref=name"스"> 〈리눅스 커널과 모듈〉, 《티스토리》, 2010-01-26 </ref>
- 가상파일 시스템(VFS): 표준 유닉스 파일 시스템이 제공하는 모든 시스템 콜을 처리하는 소프트웨어 계층으로, 여러 종류의 파일 시스템에 대해 공통 인터페이스를 제공한다.[11]
- 모듈을 이용한 커널 확장: 운영체제가 동작하는 중에 커널 코드를 추가하거나 삭제할 수 있다. <ref=name"스"> 〈리눅스 커널과 모듈〉, 《티스토리》, 2010-01-26 </ref>[7]
취약점
- UMPD
윈도 커널 요소인 UMPD에서 발견됐다. UMPD는 프린터 그래픽 DLL과 프린터 인터페이스 DLL 두 가지 요소로 구성되어 있다. 문제는 UMPD와 특정 윈도 커널 기능들이 상호작용을 하기 시작할 때 발생한다. 사용자가 인쇄와 관련된 기능들을 사용할 때, UMPD가 그래픽 엔진을 가동하고, '콜백(callbacks)'이라는 것을 커널로부터 받기 시작한다. 이 상호작용이 일어나는 방식이 취약해지면, 공격자들이 특정 코드를 주입할 수 있게 된다. 마이크로소프트(MS)는 이미 로그인된 공격자만이 익스플로잇 할 수 있는 권한 상승 취약점이라고 묘사했었고, 익스플로잇에 성공한 공격자는 프로그램 설치, 데이터 열람, 조작 및 삭제, 권한 높은 계정 생성 등의 악성 행위를 할 수 있다고 경고했다. 하지만 블랙햇 유럽(Black Hat Europe)행사에서 사용자 모드의 콜백 메커니즘을 사용하여 커널 층위의 공격에 성공했다. 오래된 취약점, 잘 알려진 취약점, 공격 가능성이 작다고 치부된 취약점은 고질적인 보안 문제이다.[12]
- 리눅스 커널
두 개의 취약점들이 발견되었지만, 패치되지 않았다. 이 취약점들을 익스플로잇 할 경우 디도스 공격이 가능해진다. 둘 다 널 포인터 역참조(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 로직이 시작되지 않도록 해야 한다.[13]
- 가상 메모리 영역
리눅스 커널이 페이지에서 발생한 오류를 다루기 위해 가상 메모리 영역(VMA)에 접근할 때, 올바른 답을 찾기 위해 코드 내 모든 가상 메모리 영역을 크롤링하는 과정이 발생한다. 이 과정은 매우 느리고, 효율이 낮다. 그래서 캐싱(caching)을 활용하였다.. 하지만 효율이 높아진 대신 다른 문제가 발생했다. 가상 메모리 영역이 사용된 이후, 모든 스레드의 가상 메모리 영역 캐시들을 무효화시켜야 한다. 그렇지 않으면 다음 가상 메모리 영역 검색 혹은 사용 시 댕글링 포인트(dangling pointer)를 따라가게 된다. 한 프로세스에도 많은 스레드가 있을 수 있어, 모든 스레드의 가상 메모리 영역 캐시들을 반복 처리하는 것만으로도 시스템 퍼포먼스에 문제가 생길 수 있다. 이것을 해결하기 위해서 쓰레드들에 시퀀스 번호를 붙여 구분하는 절차가 필요하다. 하지만 시퀀스 번호는 32bit로 제한점이 있다. 따라서 오버플로우 처리 로직이 추가되어 UaF 취약점을 유발 한다. UaF 취약점이란, 사용이 끝난 메모리 공간에 접근하려는 시도를 지지한다. 이로 인해 프로그램이 어떤 메모리 영역에 대한 해제 책임을 지고 있는지 혼선이 발생함으로써 야기된다.[14]
각주
- ↑ 〈커널(컴퓨팅)〉, 《위키백과》
- ↑ Anderson Kim, 〈(운영체제) 커널이란?〉, 《IT 내맘대로 끄적끄적》, 2019-08-27
- ↑ 〈(커널) 알아봅시다, '커널(Kernel)'〉, 《오픈소스소프트웨어》, 2013-05-16
- ↑ 〈Linux 커널이란 무엇일까요?〉, 《레드햇》
- ↑ 〈리눅스 구성 요소(커널, 셸, 파일 시스템)〉, 《티스토리》, 2020-03-29
- ↑ 삽잡이 shovelman, 〈(Surro) 1. 리눅스 커널의 이해〉, 《한글로는 삽잡이, 영어로는...》, 2013-10-29
- ↑ 7.0 7.1 7.2 7.3 7.4 〈커널(kernel)〉, 《티스토리》, 2016-02-17
- ↑ 8.0 8.1 〈Kernel(커널)〉, 《티스토리》, 2019-03-10
- ↑ 〈마이크로커널〉, 《위키백과》
- ↑ 〈리눅스에서의 가상 메모리란?〉, 《티스토리》, 2017-01-28
- ↑ 〈리눅스 커널 공부 정리 0X04 - 가상 파일 시스템〉, 《티스토리》, 2017-01-28
- ↑ 문가용 기자, 〈오래된 윈도 커널 요소 취약점의 익스플로잇 등장〉, 《보안뉴스》, 2020-12-10
- ↑ 문가용 기자, 〈리눅스 커널에서의 두 가지 취약점, 아직 패치되지 않아〉, 《보안뉴스》, 2018-11-28
- ↑ 문가용 기자, 〈리눅스 커널 내에서 또! 루트 권한 넘겨주는 취약점 나와〉, 《보안뉴스》, 2018-10-01
참고자료
- 〈커널(컴퓨팅)〉, 《위키백과》 </ref> <ref>Anderson Kim, 〈(운영체제) 커널이란?〉, 《IT 내맘대로 끄적끄적》, 2019-08-27
- 〈(커널) 알아봅시다, '커널(Kernel)'〉, 《오픈소스소프트웨어》, 2013-05-16
- 〈Linux 커널이란 무엇일까요?〉, 《레드햇》
- 〈리눅스 구성 요소(커널, 셸, 파일 시스탬)〉, 《티스토리》, 2020-03-29
- 삽잡이 shovelman, 〈(Surro) 1. 리눅스 커널의 이해〉, 《한글로는 삽잡이, 영어로는...》, 2013-10-29
- 〈커널(kernel)〉, 《티스토리》, 2016-02-17
- 〈Kernel(커널)〉, 《티스토리》, 2019-03-10
- 〈마이크로커널〉, 《위키백과》
- 〈리눅스에서의 가상 메모리란?〉, 《티스토리》, 2017-01-28
- 〈리눅스 커널과 모듈〉, 《티스토리》, 2010-01-26
- 〈리눅스 커널 공부 정리 0X04 - 가상 파일 시스템〉, 《티스토리》, 2017-01-28
- 문가용 기자, 〈오래된 윈도 커널 요소 취약점의 익스플로잇 등장〉, 《보안뉴스》, 2020-12-10
- 문가용 기자, 〈리눅스 커널에서의 두 가지 취약점, 아직 패치되지 않아〉, 《보안뉴스》, 2018-11-28
- 문가용 기자, 〈리눅스 커널 내에서 또! 루트 권한 넘겨주는 취약점 나와〉, 《보안뉴스》, 2018-10-01
같이 보기