[Kernel]커널과 디바이스 드라이버
Introduction
커널과 디바이스 드라이버의 정의와 종류를 파악하고, 서로가 어떻게 상호작용하는지를 알아봅니다.
커널에 대해 공부를 하다보니, 커널과 디바이스드라이버를 내가 명확히 이해하지 못하고 혼용해서 단어를 사용하고 있었다. 그래서 이번 기회에 직접 둘 간의 의미를 명확하게 파악하고 특징이 무엇인지, 그리고 종류는 어떤 것이 있는지 알아보는 시간을 가졌다.
커널의 정의와 핵심 기능
커널은 운영체제의 핵심 구성 요소로서, 하드웨어와 소프트웨어 간의 인터페이스 역할을 수행한다. 이는 시스템의 물리적 자원(CPU, 메모리, 저장 장치, 네트워크 등)을 효율적으로 관리하고, 사용자 애플리케이션이 하드웨어에 직접 접근하지 않고도 안정적으로 자원을 활용할 수 있도록 추상화 계층을 제공한다. 예를 들어, 파일 시스템 접근, 프로세스 스케줄링, 메모리 할당, 네트워크 통신 등의 작업은 모두 커널이 중재한다. 또한, 커널은 시스템의 보안과 안정성을 유지하기 위해 하드웨어에 대한 직접적인 접근을 제한하며, 이를 통해 운영체제의 기반 기능을 구현한다.
커널의 주요 기능은 다음과 같이 구체화할 수 있다:
하드웨어 추상화: 다양한 하드웨어를 표준화된 방식으로 제어할 수 있도록 인터페이스를 제공한다. 예를 들어, 다른 제조사의 그래픽 카드라도 커널이 제공하는 표준 인터페이스를 통해 동일한 방식으로 제어할 수 있다.
자원 관리: CPU 시간을 프로세스에 할당하거나, 메모리를 효율적으로 분배하며, 입출력 장치의 사용을 조정한다.
보안 및 접근 제어: 사용자 프로그램이 하드웨어에 직접 접근하는 것을 방지하고, 권한이 없는 작업을 차단하여 시스템의 안정성을 보장한다.
커널의 주요 유형 및 특징
커널은 설계 철학과 구조에 따라 여러 유형으로 분류되며, 각 유형은 성능, 안정성, 확장성 측면에서 고유한 특성을 지닌다.
모놀리딕 커널(Monolithic Kernel) : 메모리 관리, 파일 시스템, 장치 드라이버 등 모든 기능이 단일 커널 공간에 통합되어 있다.
장점: 시스템 호출이 직접적이어서 성능이 우수하다.
단점: 코드 복잡도가 높으며, 한 부분의 결함이 전체 시스템에 영향을 미칠 수 있다.
사례: 리눅스(Linux), 유닉스(Unix).
마이크로커널(Microkernel) : 최소한의 핵심 기능(프로세스 통신, 기본 메모리 관리)만 커널에 포함하고, 파일 시스템, 드라이버 등은 사용자 공간에서 실행한다.
장점: 모듈화로 인해 안정성이 높고, 유지보수 및 확장이 용이하다.
단점: 모놀리딕 커널에 비해 시스템 호출 오버헤드로 인해 성능이 떨어질 수 있다.
사례: Minix, macOS의 Mach 커널.
하이브리드 커널(Hybrid Kernel) : 모놀리딕과 마이크로커널의 장점을 결합한 형태로, 필수 기능은 커널 공간에 두되 일부 모듈을 유연하게 확장할 수 있다.
- 사례: Windows NT.
엑소커널(Exokernel) : 하드웨어 자원을 최소한으로 추상화하여 애플리케이션이 직접 자원을 제어할 수 있도록 한다.
장점: 특수 목적 시스템에서 높은 성능과 유연성을 제공한다.
단점: 개발 복잡도가 높아 범용성은 떨어진다.
사례: 연구용 운영체제에서 주로 활용.
디바이스 드라이버의 역할과 구조
디바이스 드라이버는 하드웨어 장치와 커널 간의 통신을 중개하는 소프트웨어 모듈이다. 각 하드웨어 장치는 고유한 제어 방식을 가지며, 드라이버는 이를 커널이 이해할 수 있는 표준 인터페이스(예: read(), write())로 변환한다. 이를 통해 커널은 다양한 하드웨어를 일관된 방식으로 관리할 수 있다. 드라이버는 커널 모드 또는 사용자 모드에서 실행되며, 실행 환경에 따라 성능과 안정성이 달라진다.
드라이버의 주요 기능은 다음과 같다:
하드웨어 제어: 장치의 상태를 모니터링하고, 명령을 전달하여 동작을 제어한다.
데이터 전송: 장치와 시스템 간의 데이터를 효율적으로 전송한다.
에러 처리: 장치에서 발생한 오류를 감지하고, 이를 커널에 보고하여 적절한 조치를 취한다.
디바이스 드라이버의 분류 및 특성
디바이스 드라이버는 실행 환경, 접근 방식, 제어 대상에 따라 다음과 같이 분류된다.
커널 모드 드라이버 : 커널 공간에서 실행되며, 하드웨어에 직접 접근할 수 있다.
장점: 빠른 성능.
단점: 드라이버 오류가 시스템 전체의 불안정을 초래할 수 있다.
사례: 네트워크 카드, 저장 장치 드라이버.
유저 모드 드라이버 : 사용자 공간에서 실행되어 커널의 안정성을 보호한다.
장점: 오류 발생 시 시스템 전체가 다운되지 않는다.
단점: 성능이 상대적으로 낮다.
사례: 일부 USB 장치 드라이버.
문자(Character) 장치 드라이버 : 데이터를 바이트 단위로 순차적으로 처리하는 장치(키보드, 마우스, 직렬 포트)를 제어한다.
블록(Block) 장치 드라이버 : 고정된 크기의 데이터 블록을 처리하는 장치(하드 디스크, SSD)를 관리한다.
가상(Virtual) 장치 드라이버 : 물리적 하드웨어가 아닌 가상 자원(예: RAM 디스크, 네트워크 인터페이스)을 에뮬레이션한다.
커널과 디바이스 드라이버의 상호작용
- 커널과 드라이버의 기본 상호작용 구조
커널과 디바이스 드라이버는 시스템의 핵심 구성 요소로서, 하드웨어와 소프트웨어 간의 원활한 통신을 가능하게 한다. 커널은 하드웨어 자원을 관리하고, 드라이버는 특정 하드웨어 장치를 제어한다. 이때, 드라이버는 커널이 제공하는 API(Application Programming Interface)를 사용하여 하드웨어와 통신한다. 예를 들어, 파일을 읽거나 쓰는 작업은 커널이 제공하는 read(), write() 시스템 호출을 통해 이루어진다. 드라이버는 이러한 시스템 호출을 하드웨어가 이해할 수 있는 명령어로 변환하고, 결과를 다시 커널에 반환한다.
- 구체적인 예시: 하드 디스크에서 파일 읽기
하드 디스크에서 파일을 읽는 과정을 통해 커널과 드라이버의 상호작용을 구체적으로 설명할 수 있다. 사용자 프로그램이 파일을 읽기 위해 read() 시스템 호출을 실행하면, 커널은 파일 시스템 계층에서 해당 파일의 위치를 확인한다. 파일 시스템은 논리적 파일 구조를 물리적 디스크 블록으로 매핑한 후, 하드 디스크 드라이버를 호출하여 특정 블록의 데이터를 읽도록 요청한다. 이때, 커널은 드라이버에게 I/O 요청 패킷을 전달하며, 이 패킷에는 읽을 블록의 주소, 데이터 크기, 버퍼 위치 등의 정보가 포함된다. 드라이버는 커널로부터 받은 정보를 바탕으로 하드 디스크 컨트롤러에 명령을 전달하고, 하드 디스크는 물리적 헤드를 이동시켜 지정된 섹터의 데이터를 읽어 메모리 버퍼에 저장한다. 드라이버는 하드웨어로부터 받은 데이터를 커널에 반환하고, 커널은 이를 사용자 프로그램의 버퍼로 복사하여 read() 시스템 호출을 완료한다. 사용자 프로그램은 버퍼에 저장된 데이터를 활용하여 작업을 수행한다.
- 커널과 드라이버의 통신 메커니즘
커널과 드라이버는 시스템 호출, 인터럽트, DMA(Direct Memory Access), I/O 요청 큐 등의 메커니즘을 통해 통신한다. 시스템 호출은 애플리케이션이 커널에 요청을 전달하는 기본적인 방법으로, open(), read(), write() 등의 호출이 드라이버와의 상호작용을 시작한다. 인터럽트는 하드웨어 장치가 작업을 완료하거나 오류가 발생했을 때 커널에 알리는 방식이다. 커널은 인터럽트 핸들러를 통해 드라이버와 통신하며, 필요한 조치를 취한다. DMA는 대량의 데이터를 전송할 때 CPU를 거치지 않고 직접 메모리와 하드웨어 간에 데이터를 전송하는 방식으로, 드라이버가 커널의 도움 없이도 데이터를 효율적으로 처리할 수 있게 한다. I/O 요청 큐는 커널이 드라이버에게 전달할 I/O 요청을 저장하는 공간으로, 드라이버는 이 큐에서 요청을 순차적으로 처리하며, 작업이 완료되면 결과를 커널에 반환한다.
- 오류 처리와 성능 최적화
커널과 드라이버는 시스템의 안정성과 성능을 유지하기 위해 오류 처리와 성능 최적화를 적극적으로 수행한다. 하드웨어 오류가 발생하면 드라이버는 이를 커널에 보고하고, 커널은 오류를 로그에 기록하거나 사용자에게 알리는 등의 조치를 취한다. 소프트웨어 오류의 경우, 커널은 드라이버의 결함을 감지하고 시스템을 안전하게 종료하거나 드라이버를 재시작한다. 성능 최적화를 위해 커널과 드라이버는 캐싱, 버퍼링, 병렬 처리 등의 기법을 사용한다. 캐싱은 자주 사용되는 데이터를 메모리에 저장하여 디스크 접근 횟수를 줄이고, 버퍼링은 데이터를 일시적으로 메모리에 저장하여 대량의 데이터를 효율적으로 처리한다. 병렬 처리는 여러 드라이버가 동시에 작업을 수행할 수 있도록 스케줄링하여 시스템의 전반적인 성능을 향상시킨다.
Reference
- https://www.youtube.com/watch?v=UMsscWnM67g&ab_channel=DavidEvans
- https://www.geeksforgeeks.org/monolithic-kernel-and-key-differences-from-microkernel/
- https://www.geeksforgeeks.org/device-driver-and-its-purpose/