들어가기 전에 앞서, 해당 부분은 제 지식과 참고 자료를 활용하여 정리한 것이므로 틀린 부분이 있을 수도 있다는 말씀을 드립니다.

✨ 디바이스 드라이버

🫧 개념

디바이스들을 동작시키기 위해서는 구동용 소프트웨어가 필요한데, 이러한 소프트웨어를 디바이스 드라이버라고 한다.

특정 하드웨어나 장치를 제어하기 위한 프로그램이며, 운영체제 내 커널의 일부이다.

디바이스를 추상화하여 애플리케이션에서 시스템 호출 인터페이스를 통해 디바이스에 접근할 수 있도록 해주는데, 리눅스는 이를 위해 VFS(VIrtual File System) 레이어를 제공한다.

open(), read(), write() 함수와 같은 기본적인 유닉스 파일의 I/O 시스템 콜을 사용하여 데이터 입출력을 제공하게 된다.

alt text

좀 더 정확하게 말하면, 운영체제와 하드웨어 사이를 연결하는 소프트웨어 계층으로, 커널이 특정 장치를 사용할 수 있도록 장치별 제어 방식과 상태 정보를 커널 인터페이스에 맞게 연결해 주는 코드이다.

실제로 장치마다 제어 레지스터, 초기화 절차, 데이터 전송 방식, 오류 처리 방법이 모두 다르기 때문에 이 복잡성을 커널 안쪽으로 흡수해 커널과 애플리케이션이 일관된 방식으로 장치를 다룰 수 있게 해 주는 것이다.

특히, 다음과 같은 두 가지 경우에서 디바이스 드라이버를 사용한다.

  1. 응용 프로그램에서 하드웨어 장치를 이용해서 데이터를 직접 읽고 쓰거나 제어해야 하는 경우

  2. 소프트웨어적인 디바이스를 만든 경우

🫧 필요성

운영체제가 모든 장치를 직접 개별적으로 처리하려고 하면 코드가 지나치게 복잡해지고 유지보수가 어려울 것이다.

따라서 해당 문제를 해결하기 위해 디바이스 드라이버라는 소프트웨어를 활용해 Abstraction시키는 것이다.

다음과 같이 크게 세 가지의 필요성으로 정리가 가능하다.

1) 장치별 차이를 흡수해 운영체제에 일관된 인터페이스를 제공한다.

2) 장치 초기화, 상태 확인, 인터럽트 처리 같은 저수준 작업을 담당한다.

3) 운영체제가 장치를 안전하게 관리할 수 있게 해 준다.

💡 커널

여기서 커널이란, 운영체제 중 항상 메모리에 올라가 있는 운영체제의 핵심 부분으로, 하드웨어와 응용 프로그램 사이에서 인터페이스를 제공하고 컴퓨터 자원들을 관리하는 역할을 한다.

이러한 커널들은 사용자와의 상호작용을 지원하지 않기 때문에, 사용자와 직접적인 상호작용을 위해 프로그램을 제공하게 된다.

대표적으로는 Shell이라는 명령어 해석기가 있다.

또, 일반 응용 프로그램의 경우 CPU나 디스크 등 하드웨어를 직접적으로 건드릴 수 없기 때문에 커널에게 요청해야 하는데, 그 대표적인 인터페이스가 system call이다.

🫧 특징

  • 디바이스와 시스템 사이에서 데이터를 주고받기 위한 인터페이스를 제공하는 커널 내부 기능 중 하나

  • 커널의 일부분으로 내장되어 커널 모드에서 실행되며, 메모리에 상주하며 스왑되지 않는다.

  • 디바이스 드라이버는 디바이스를 하나의 파일로 추상화시켜줘서, 디바이스를 디바이스 파일(/dev/…)을 통해 파일처럼 액세스 가능하여 사용자는 파일에 대한 연산만 수행하면 된다.
    -> 디바이스마다 고유의 번호(Major number, 12bit), (Minor number, 20bit)를 가지고 있고, 이 번호로 디바이스를 구분한다.

💡 디바이스 구분

리눅스에서 디바이스는 하나의 파일이며, 그 파일들을 통해 디바이스를 관리한다.

또한, 디바이스 파일들은 Major과 Minor 번호를 갖는다.

이는 Linux 커널이 디바이스를 찾아가기 위한 식별자라고 보면 된다.

1) Major number

  • 어느 드라이버(모듈)을 통해 장치가 관리되는지 구분하기 위해 사용하는 번호
  • 즉, 디바이스가 같은 major 번호를 가지고 있다면, 그 디바이스는 같은 드라이버로 관리되고 있는 것이다.

2) Minor number

  • 드라이버 내에서 서로 다른 디바이스임을 구분하기 위해 사용되는 번호

따라서 리눅스는 드라이브를 사용할 때, major number을 통해 어느 드라이버를 사용할지 결정하고, minor number을 통해 어느 장치에게 명령을 내릴지 결정한다.

Major/Minor number의 경우 드라이버가 초기화될 때 커널의 해당 디바이스 서브시스템에 자신이 관리할 번호 영역이나 디바이스를 등록하게 된다.

💡 Directory Entry

디렉터리 엔트리란 파일 시스템 내 특정 디렉터리에 있는 파일이나 하위 디렉터리에 대한 정보를 담고 있는 데이터 구조이다.

이는 디렉터리 파일 내에 존재하며, 파일 이름과 해당 파일의 i-node 번호를 매핑하여 운영체제가 파일 시스템에서 파일을 찾고 관리할 수 있도록 돕는다.

1) 파일 이름 2) inode 번호 3) 파일 유형 (일반 파일인지, 디렉터리인지, 심볼릭 링크인지 등, but 선택적으로 나타남)

이는 파일 및 디렉터리를 매핑하는 역할을 하며, 파일 경로 탐색을 지원하고 파일 이름이 중복되지 않도록 관리한다.

🫧 역할

장치에 따라 세부 구현이 달라지지만, 공통적으로 자주 맡는 역할은 다음과 같다.

  1. 장치 초기화
  2. 데이터 송수신
  3. 상태 보고
  4. 인터럽트 처리
  5. 커널 인터페이스 연결 (Abstraction)

🫧 디바이스 종류

애플리케이션이 장치와 통신할 때 어떤 인터페이스를 제공하는지에 따라 종류가 달라진다.

1. 문자 디바이스 (Character Device)

  • 자료의 순차성을 지닌 장치로, 버퍼를 사용하지 않고 바로 읽고 쓸 수 있는 장치
  • ex) 직렬 포트, 병렬 포트, 마우스, PC 스피커, 터미널 등
  • buffer cache를 사용하지 않고 디바이스의 raw data를 애플리케이션에 전달한다.
  • 보통 /dev/… 파일에 read/write/ioctl 같은 파일 연산으로 접근한다.

2. 블록 디바이스 (Block Device)

  • 버퍼 캐시(Chache)를 통해 블록 단위로 입출력되며, 랜덤 액세스가 가능하고, 파일 시스템을 구축할 수 있다.
  • ex) 플로피 디스크, 하드 디스크, CD-ROM, RAM 디스크 등
  • 데이터 입출력을 위해 버퍼 캐시를 사용하고, 데이터 동기화를 위한 sync 과정이 필요하다.
  • 주로 파일시스템에 의해 mount된다.
  • 문자 디바이스와 비슷하게 /dev/…으로 보이지만, 실제 I/O는 블록 계층을 통해 블록 단위 요청으로 처리된다.


-> 여기서 버퍼 캐시란, 메모리 특정 영역을 지칭하는 말로, 최근 사용된 디스크 블록을 메모리에 키시하는 것을 말한다.


-> 디스크 입출력 시간이 메모리 접근 시간보다 크고, 디스크 블록의 접근 패턴에 지역성이 있기 때문에 디스크 블록의 정보를 메모리 공간에 저장해두면 읽기/쓰기 등의 작업시 응답 시간을 줄일 수 있기 때문에 도입하게 되었다.


-> 가상 메모리는 MMU와 같은 하드웨어의 지원을 받지만, 버퍼 캐시는 그렇지 않다는 특징을 가지고 있다.
–> cf) MMU : 가상주소를 물리주소로 변환하는 역할을 수행한다.
–> cf) 그렇다고 해서 버퍼 캐시가 MMU를 전혀 사용하지 않는다는 뜻은 아니다.

3. 네트워크 디바이스 (Network Device)

  • 네트워크 통신을 통해 네트워크 패킷을 주고받을 수 있는 디바이스
  • ex) Ethernet, PPP, ATM, ISDN, NIC(Network Interface Card)
  • socket() 시스템 콜에 의해 열리며, 다른 디바이스와는 달리 일반적인 디바이스 파일이 없다.
  • ifconfig와 같은 명령어를 통해 현재 네트워크 디바이스에 대한 사항들을 살펴볼 수 있다.
  • 파일로 직접 접근하지 않고, socket()을 통해 네트워크 스택을 거쳐 접근한다.

✨ 운영체제, 드라이버, 하드웨어는 어떻게 연결될까?

alt text

  1. 애플리케이션이 네트워크 전송이나 파일 저장 같은 작업을 요청한다.
  2. 커널이 그 요청을 적절한 서브시스템으로 전달한다.
    -> 서브시스템이란 운영체제 커널 자체에 이미 내장되어 있는 시스템으로, VFS, 파일시스템, TCP/UDP 등의 시스템을 의미한다.

  3. 해당 서브시스템이 장치 드라이버를 호출한다.
  4. 드라이버가 실제 장치 레지스터, 버스 인터페이스, DMA, 인터럽트 등을 다룬다.

이 구조 덕분에 애플리케이션은 장치 제조사별 차이를 몰라도 된다.

서로 다른 저장장치라도 상위 계층에서는 비슷한 파일 읽기/쓰기 인터페이스로 접근이 가능해지는 것이다.

✨ 질문

Q. major, minor 번호가 모두 같은 경우도 존재하는가?

A. 디바이스 종류가 다른 경우는 같은 major/minor 번호가 존재할 수 있다. 번호 공간이 구분되기 때문이다.

  • 그러나 디바이스 종류가 같은 경우 커널 입장에서 식별이 불가능하므로 같은 경우는 존재할 수 없다.

  • 참고로, 같은 드라이버를 쓰는 것이 반드시 major가 같다고 보장할 수는 없다.

✨ 참고자료

카테고리:

업데이트: