Linux의 장치 드라이버는 프로그램/프로세스입니까, 아니면 단순한 라이브러리입니까?

Linux의 장치 드라이버는 프로그램/프로세스입니까, 아니면 단순한 라이브러리입니까?

장치 드라이버는 독립적으로 실행되는 프로그램인가요, 아니면 메모리에 로드되고 프로그램이 해당 기능 중 하나를 호출할 수 있는(그래서 독립적으로 실행되지 않는) 단순한 라이브러리(함수 집합)인가요?

프로그램인 경우 프로세스 ID가 있으므로 다른 프로세스와 마찬가지로 장치 드라이버를 종료할 수 있나요?

답변1

Linux에서는 많은 장치 드라이버가 라이브러리나 프로세스가 아닌 커널의 일부입니다. 프로그램은 장치 파일(일반적으로 /dev) 및 다양한 시스템 호출(예: open, read, write, ...)을 사용하여 ioctl이러한 항목과 상호 작용합니다 .

그러나 예외가 있습니다. 일부 장치 드라이버는 커널 드라이버 스텁과 사용자 공간 라이브러리를 혼합하여 사용합니다(예를 들어UIO 사용). 다른 것들은 일반적으로 일부 비트 연결 인터페이스(UART 또는 GPIO) 위에 완전히 사용자 공간에서 구현됩니다. 두 경우 모두 일반적으로 프로세스 내에 있으므로 별도의 프로세스가 표시되지 않고 장치를 사용하는 프로세스만 표시됩니다.

장치 드라이버를 "종료"하려면 이를 사용하는 모든 프로세스를 중지한 다음 커널 모듈(모듈로 구축되었다고 가정)과 선택적으로 사용 중이지만 더 이상 필요하지 않은 다른 모듈을 삭제해야 합니다. 를 사용하여 시스템의 모듈을 나열하고 사용하거나 lsmod제거할 수 있습니다. 두 가지 모두 사용자가 없다고 표시한 경우에만 작동합니다.rmmodmodprobe -rlsmod

답변2

먼저 드라이버가 무엇인지 정의해야 합니다. 나는 이것을 장치(예: 카메라) 또는 하위 시스템(예: 파일 시스템)을 제어하는 ​​프로그램이나 서브루틴으로 정의합니다. 이것이 시스템 프로그램을 통해 직접 수행되는지, 커널 서버나 사용자 영역 프로세스를 통해 수행되는지 여부는 본질적으로 의미론적 문제에 대한 주요 관심사가 되어서는 안 됩니다.

어떤 경우에는 Linux가 소프트웨어로 작성된 일반 프로토콜만 제공하는데, 여기서 실제 "드라이버"는 장치 트리입니다. 이는 하드웨어 매개변수의 구성과 드라이버를 구성하는 데 사용되는 소프트웨어입니다.

일반적으로 드라이버 인터페이스 및 프로토콜은 장치 트리 또는 udev 규칙에 정의된 대로 필요에 따라 로드되는 커널 모듈을 사용하여 구현됩니다. 커널 모듈은 가장 엄격한 의미에서 프로세스나 라이브러리가 아닙니다.

라이브러리는 단순히 특정 프로세스에 로드할 수 있는 정적 코드 세트입니다. 최신 운영 체제는 이러한 라이브러리를 공유 메모리에 로드합니다. 프로세스 자체는 원하는 수의 공유 라이브러리에 연결할 수 있습니다.

프로세스는 시스템 프로그램이나 커널이 시스템 메모리, CPU 시간과 같은 자원을 할당하는 실행 중인 프로그램입니다. 커널 모듈 자체는 이 패턴을 따를 수도 있고 따르지 않을 수도 있지만 Linux에서는 사실상 프로세스로 간주되지 않습니다.

따라서 귀하의 질문에 답하기 위해 드라이버가 프로세스일 필요는 없지만 프로세스일 수는 있습니다. 코드는 라이브러리에 있을 수 있지만 드라이버는 커널 모듈 형태의 커널이든 사용자 공간 프로세스이든 상관없이 프로그램에 의해 여전히 메모리에 로드됩니다.

드라이버 무결성이 실제로 무엇인지 고려할 때 이는 의미론적 논쟁에 가깝습니다. 드라이버는 항상 프로그램이라고 말할 수 있지만 때로는 장치 트리의 경우는 그렇지 않습니다. 실제로는 프로세스와 모듈이 모두 있는 사용자 영역 프로세스, 장치 트리 파일, udev 규칙 및 커널 모듈일 수 있습니다. 라이브러리를 사용하여 드라이버 로직을 구성합니다.

답변3

Linux 장치 드라이버는 기본적으로커널 공간 라이브러리. 해당 호출은 주로 이를 사용하는 상위 수준 드라이버 또는 사용자 공간 프로세스에 의해 시작됩니다.

몇 가지 예외가 있습니다:

  • 커널 스레드는 드라이버에 의해 시작/중지될 수도 있습니다. 이는 본질적으로 사용자 공간 부분이 없는 프로세스입니다.
  • 인터럽트 핸들러는 사용자 공간 프로세스가 아닌 하드웨어에 의해 시작됩니다.

GNU Hurd와 같은 다른 시스템에서 드라이버는 본질적으로 데몬이며 프로세스는 드라이버와 상호 작용할 수 있습니다. Linux에서 드라이버는 라이브러리입니다. 그러나 두 개념 모두 장점과 단점이 있습니다.

관련 정보