장치 드라이버는 자체적으로 실행되는 프로그램이거나 메모리에로드 된 라이브러리 (기능 그룹) 일 뿐이며 프로그램은 해당 기능 중 하나를 호출 할 수 있습니다 (따라서 자체적으로 실행되지 않음).
프로그램 인 경우 프로세스 ID가 있습니까? 예를 들어 다른 프로세스를 종료 할 수있는 것과 같은 방법으로 장치 드라이버를 종료 할 수 있습니까?
답변
Linux에서 많은 장치 드라이버는 라이브러리 나 프로세스가 아니라 커널의 일부입니다. 이러한 사용하여 장치 파일 (일반적으로 상호 작용 프로그램 /dev
) 및 다양한 시스템 호출 등 open
, read
, write
, ioctl
…
그러나 예외가 있습니다. 일부 장치 드라이버는 커널 드라이버 스텁과 사용자 공간 라이브러리 ( 예 : UIO 사용)를 혼합 하여 사용합니다. 다른 것들은 전적으로 사용자 공간에서 구현되며 일반적으로 일부 비트 뱅킹 인터페이스 (UART 또는 GPIO) 위에 있습니다. 두 경우 모두 일반적으로 처리 중이므로 별도의 프로세스가 아니라 장치를 사용하는 프로세스 만 표시됩니다.
장치 드라이버를 “종료”하려면 장치 드라이버를 사용하는 모든 프로세스를 중지 한 다음 커널 모듈 (모듈로 빌드되었다고 가정) 및 선택적으로 사용하고 더 이상 필요하지 않은 다른 모듈을 제거해야합니다. 을 사용하여 시스템의 모듈을 나열하고 또는을 사용하여 모듈을 lsmod
언로드 할 수 있습니다 . 둘 다 사용자가없는 경우에만 작동 합니다.rmmod
modprobe -r
lsmod
답변
먼저 드라이버가 무엇인지 정의해야합니다. 장치 (예 : 카메라) 또는 하위 시스템 (예 : 파일 시스템)을 제어하는 프로그램 또는 서브 루틴으로 정의하겠습니다. 시스템 프로그램이나 커널 서버 또는 사용자 영역 프로세스를 통해 직접 수행하는지 여부는 본질적으로 의미 론적 질문에 중요하지 않아야합니다.
경우에 따라 Linux는 실제 “드라이버”가 장치 트리 인 소프트웨어로 작성된 일반 프로토콜 만 제공합니다. 이는 하드웨어 매개 변수의 구성과 드라이버를 구성하는 데 사용할 소프트웨어입니다.
일반적으로 말하기 드라이버 인터페이스 및 프로토콜은 장치 트리 또는 udev 규칙에 의해 정의 된대로로드되는 커널 모듈을 사용하여 구현됩니다. 커널 모듈은 가장 엄격한 의미에서 프로세스 나 라이브러리가 아닙니다.
라이브러리는 특정 프로세스에로드 할 수있는 정적 코드 세트입니다. 최신 운영 체제는 이러한 라이브러리를 공유 메모리에로드합니다. 프로세스 자체는 여러 공유 라이브러리에 연결할 수 있습니다.
프로세스는 시스템 프로그램 또는 커널이 시스템 메모리 및 CPU 시간과 같은 자원을 할당 한 실행중인 프로그램입니다. 커널 모듈은이 패턴 자체를 따르거나 따르지 않을 수도 있지만 Linux에서는 사실상 프로세스로 간주되지 않습니다.
따라서 귀하의 질문에 대답하기 위해 운전자는 절차가 필요하지 않지만 가능합니다. 코드는 라이브러리에 존재할 수 있지만 드라이버는 커널 모듈 형태의 커널이든 사용자 영역 프로세스이든 프로그램을 통해 여전히 memery에로드됩니다.
드라이버의 총체가 실제로 무엇인지 고려할 때 의미 론적 논쟁이됩니다. 드라이버는 항상 프로그램이지만 장치 트리의 경우와는 달리 때로는 사용자 프로세스, 장치 트리 파일, udev 규칙 및 커널 모듈 일 수 있습니다. 프로세스와 모듈은 모두 라이브러리를 사용하여 구성합니다. 드라이버의 논리.
답변
Linux 장치 드라이버는 기본적으로 커널 공간 라이브러리 입니다. 호출은 주로 상위 레벨 드라이버 또는이를 사용하는 사용자 공간 프로세스에 의해 시작됩니다.
이것에서 몇 가지 예외가 있습니다.
- 커널 스레드는 드라이버에 의해서도 시작 / 중지 될 수 있으며 기본적으로 사용자 공간 부분이없는 프로세스입니다.
- 인터럽트 핸들러는 사용자 공간 프로세스가 아니라 하드웨어에 의해 시작됩니다.
GNU Hurd와 같은 다른 시스템에서 드라이버는 기본적으로 프로세스와 상호 작용할 수있는 데몬입니다. Linux에서 드라이버는 라이브러리입니다. 두 가지 개념 모두 장점과 단점이 있습니다.