한량처럼 살고 싶다

디바이스 드라이버 vs 커널 모듈 본문

리눅스 커널/혼자 분석한 내용

디바이스 드라이버 vs 커널 모듈

투영 2025. 1. 20. 11:56

gpio 관련 기능 개발 하다가, 내가 만든 기능이 디바이스 드라이버인지 커널 모듈인지 헷갈려 정리한다.

결론부터 말하자면 둘 다에 해당했음.

 

디바이스 드라이버

디바이스 드라이버는 컴퓨터 프로그램이다.

컴퓨터에서 device(기기)를 동작시키거나 조종하는 프로그램인 것이다.

 

리눅스는 디바이스 역시 파일이다.

그래서 디바이스 드라이버는 파일을 컨트롤하기 위한 프로그램을 의미한다.

 

커널은 application 과 소통하기 위해 VFS를 거치고, 그 이후에 시스템 콜을 거친다. 

따라서 디바이스 드라이버 역시 VFS의 형식에 맞게 작성되어야 한다.

 

디바이스 드라이버 종류

1) character device driver

바이트 단위로 데이터를 순차적으로 받아오기 때문에 버퍼와 캐시를 갖지 않는다.

예시로는 키보드, 마우스, 시리얼 포트 등등이다.

 

2) block device driver

일정 크기의 버퍼 (블록 단위) 를 통해 데이터를 처리한다.

커널 내부의 파일 시스템에서 관리하고 예시로는 하드 디스크, 램 디스크 등이 있다.

 

3) network device driver

네트워크 계층과 연결되어 네트워크 통신을 통해 네트워크 패킷을 송수신할 수 있는 기능을 제공한다.

이더넷 등이 있다.

 

커널 모듈

커널의 기능을 동적으로 확장하거나 변경할 수 있는 독립적인 코드 조각이다.

 

일반적으로 하드웨어에 무관하다.

그리고 실행 중인 커널에 동적으로 추가하거나 제거가 가능한 코드이다.

 

헷갈렸던 점은 디바이스 드라이버도 커널 모듈로 제작이 가능하다는 것이다.

 

커널 모듈로 제작하는 디바이스 드라이버

드라이버를 커널 모듈 형태로 구현하며, 커널이 실행 중일 때 동적으로 로드 및 언로드 될 수 있다.

  • 실행 중에 insmod 와 rmmod를 통해 추가와 제거가 가능하다.
  • 디바이스 드라이버에 변경 사항이 생겨도 전체 커널을 다시 빌드하지 않아도 된다.
  • 커널 이미지 (vmlinuz)와 별도로 드라이버를 관리할 수 있다.
  • 문제가 생겼을 때 해당 모듈만 수정하고 재 로드가 가능하다.
  • 부팅 시점에 필요한 필수 하드웨어 드라이버로는 적합하지 않다.

 

정적 디바이스 드라이버로 제작

드라이버 코드를 커널 소스에 포함시켜 커널 빌드 시 함께 컴파일 한다. 그리고 커널 이미지 (vmlinuz)에 통합되어 부팅 시 로드된다.

 

  • 커널 부팅 시점에 드라이버가 자동으로 초기화된다.
  • 드라이버 로드 실패나 의존성 문제를 방지할 수 있다.
  • 수정하면 전체를 다시 빌드해야 하고, 커널 크기가 증가한다.
  • 부팅 디스크, 루트파일 시스템, 초기화 장치 등 부팅에 필수적인 하드웨어 장치에 어울린다.

 

내 안에선 둘 다 그냥 커널에 들어가는 하나의 프로그램인데 왜 나눠놨는지 궁금했다.

아직도 직관적으로 이해가 된 건 아니지만 의존성 문제인 것 같다.

개발을 많이 해보면 알겠지

 

커널 모듈과 정적 드라이버 차이와 역할

커널 모듈

  1. 동적 로드 및 언로드 가능: insmod, rmmod 명령을 통해 실행 중인 커널에 기능(드라이버 포함)을 추가하거나 제거 가능
  2. 목적
    1. 새로운 하드웨어나 기능을 커널 재부팅 없이도 추가 가능함
    2. 개발 및 디버깅이 편리함 -> 모듈만 교체하면 되니까
    3. 필요하지 않을 때 메모리에서 해제하여 자원 절약 가능

 

정적 드라이버

  1. 커널에 포함: 커널이 부팅될 때 로드되며 실행 중에는 제거할 수 없음
  2. 목적
    1. 부팅에 필수적인 하드웨어를 지원해야 할 때 사용 (루트파일 시스템, 초기화 과정에서 필요한 장치)
    2. 성능과 안정성이 중요한 환경 (정적으로 포함되어 있어 로드 속도가 빠르고 의존성 문제 없음)

 

커널 모듈과 정적 드라이버를 나눠둔 이유

 

모든 것을 동적 드라이버 혹은 커널 모듈로 만들지 않은 이유가 궁금했다.

 

성능

정적 드라이버는 커널에 이미 포함되어 있기 때문에 부팅 시점부터 바로 사용할 수 있음

  • 부팅 초기에는 동적 모듈을 로드할 수 있는 사용자 공간 도구 (udev 등) 이 아직 실행되지 않은 경우가 많다
  • 예로는 부팅 시 반드시 필요한 루트파일 시스템을 마운트하기 위한 스토리지 드라이버 등이 있음

 

안전성

동적으로 추가/제거되는 커널 모듈은 실시간으로 시스템에 영향을 줄 수 있음

  • 잘못된 모듈을 로드하면 커널 패닉이 발생할 수 있음
  • 정적 드라이버는 부팅 시 검증된 상태에서 로드되므로 안정성이 높음

 

의존성 문제

커널 모듈은 종종 다른 모듈에 의존한다

  • 모든 것이 동적으로 구성되면, 올바른 순서로 로드하거나 의존성을 만족시키는 과정에서 복잡성이 증가한다
  • 정적 드라이버는 커널 빌드 시 이미 필요한 모든 의존성이 해결된 상태로 포함된다.

 

부팅 시간

부팅 시점에 동적 로드를 처리하려면 추가 작업 (모듈 검색 및 로드) 이 필요하기 때문에 시간이 더 걸릴 수 있다.

  • 정적 드라이버는 커널이 부팅될 때 이미 메모리에 로드되어 있으므로 부팅 시간이 단축된다.

 

특수 환경

일부 임베디드 시스템이나 리얼타임 시스템에서는 모든 것이 정적으로 설정되어야만 성능과 안정성이 보장된다.

  • 의료기기, 항공 시스템, 자동차용 시스템 등

 

요약하자면 커널 모듈은 유연성과 확장성, 개발 편의성을 제공하기 위해 만들고 정적 드라이버는 안정성, 성능, 초기화 요구사항을 보장하기 위해 만든다.

 

리눅스는 요구사항에 따라 개발자가 편리하게 개발할 수 있도록 여러 선택지를 제공한 것이다.

'리눅스 커널 > 혼자 분석한 내용' 카테고리의 다른 글

sysfs  (0) 2025.01.16
[커널 분석] thermal_hwmon.c  (0) 2024.12.31