Wowo는 "리눅스 커널의 전체 아키텍처"라는 기사에서 Linux 커널이 전 세계의 다양한 기능을 가진 거의 모든 하드웨어 장치를 지원한다는 점을 언급했는데, 이는 Linux의 장점이기도 합니다. 그러나 이로 인해 Linux 커널 코드의 절반이 장치 드라이버가 됩니다. 하드웨어 장치가 빠르게 업그레이드됨에 따라 장치 드라이버 코드의 양도 빠르게 증가하고 있습니다. 내 생각에는 이 현상은 "단순함이 아름답다"는 개념을 파괴하고 Linux 커널을 매우 비대하고 지저분하며 유지 관리하기 어렵게 만듭니다. 그러나 Wowo는 Linux가 매크로 커널이고 장치 다양성에 직면하고 해당 드라이버를 구현해야 하기 때문에 이것이 Linux의 잘못이 아니라는 것도 이해합니다.
장치 다양성으로 인한 Linux 드라이버 개발의 복잡성을 줄이고 장치 핫플러그 및 전원 관리와 같은 기능을 구현하기 위해 Linux 커널에서는 장치 모델(드라이버 모델이라고도 함) 개념을 도입했습니다. 장치 모델은 하드웨어 장치를 분류 및 요약한 다음 일련의 표준 데이터 구조 및 인터페이스를 추상화합니다. 이러한 방식으로 드라이버 개발은 간단해지며 커널에서 지정한 데이터 구조를 채우고 구현하기만 하면 됩니다.
이 글에서는 디바이스 모델의 기본 개념부터 시작하여, 해당 커널 코드의 분석을 통해 리눅스 디바이스 모델의 구현과 사용을 점차적으로 설명하겠습니다.
다음 그림은 임베디드 시스템에 대한 일반적인 하드웨어 토폴로지의 예입니다.
하드웨어 토폴로지는 Linux 장치 모델의 네 가지 중요한 개념 중 세 가지인 버스, 클래스 및 장치를 설명합니다(네 번째는 장치 드라이버이며 나중에 설명합니다).
버스: Linux는 버스가 CPU와 하나 이상의 장치 간의 정보 교환을 위한 채널이라고 믿습니다(include/linux/device.h의 structbus_type 주석 참조). 장치 모델의 추상화를 용이하게 하기 위해 모든 장치는 버스(CPU 내부 버스, 가상 버스 또는 "플랫폼 버스"인지 여부)에 연결되어야 합니다.
클래스: Linux 장치 모델에서 클래스 개념은 객체 지향 프로그래밍의 클래스와 매우 유사합니다. 주로 유사한 기능이나 속성을 가진 장치를 수집하므로 여러 응용 프로그램에서 사용할 수 있는 장치 집합을 추상화할 수 있습니다. . 장치 간에 공유되는 데이터 구조 및 인터페이스 기능. 따라서 동일한 클래스에 속하는 장치의 드라이버는 더 이상 이러한 공용 리소스를 반복적으로 정의할 필요가 없으며 클래스에서 직접 상속할 수 있습니다.
장치: 시스템의 모든 하드웨어 장치를 추상화하여 이름, 속성, 하위 버스, 하위 클래스 및 기타 정보를 설명합니다.
장치 드라이버: Linux 장치 모델은 드라이버를 사용하여 장치 초기화 및 전원 관리와 관련된 인터페이스 구현을 포함하는 하드웨어 장치의 드라이버를 추상화합니다. Linux 커널의 드라이버 개발은 기본적으로 이 추상화(지정된 인터페이스 기능 구현)를 중심으로 진행됩니다.
참고: 플랫폼 버스란 무엇인가요?
컴퓨터에는 해당 장치 컨트롤러를 통해 CPU에 직접 연결되는 장치 유형이 있으며, CPU는 정기적인 주소 지정 작업을 통해 해당 장치에 액세스(또는 해당 컨트롤러에 액세스)할 수 있습니다. 이 연결 방법은 전통적인 의미의 버스 연결이 아닙니다. 그러나 장치 모델은 범용이어야 하므로 Linux는 이러한 장치를 연결할 가상의 플랫폼 버스를 만듭니다.
Linux 장치 모델의 핵심 아이디어는 (xxx 수단을 통해 xxx 목적을 달성하는 것)입니다.
1. 두 가지 데이터 구조인 Device(struct device)와 Device Driver(struct device_driver)를 사용하여 각각 "용도"와 "사용 방법"이라는 두 가지 관점에서 하드웨어 장치를 설명합니다. 이는 장치 드라이버 작성 형식을 통합하고 드라이버 개발을 에세이 질문에서 빈칸 채우기로 변경하여 장치 드라이버 개발을 단순화합니다.
2. 또한 장치 및 장치 드라이버의 두 가지 데이터 구조를 사용하여 하드웨어 장치의 플러그 앤 플레이(핫 스와핑)를 실현합니다.
Linux 커널에서 장치와 장치 드라이버의 이름이 동일한 경우 커널은 장치 드라이버 구조에서 초기화 기능(프로브)을 실행하여 장치를 초기화하고 사용할 수 있게 만듭니다.
대부분의 핫스왑 가능 장치의 경우 해당 장치 드라이버는 항상 커널에 존재합니다. 장치가 연결되지 않은 경우 해당 장치 구조가 존재하지 않으므로 해당 드라이버가 초기화 작업을 수행하지 않습니다. 장치가 삽입되면 커널은 드라이버 실행을 트리거하는 장치 구조(드라이버와 동일한 이름)를 생성합니다. 이것이 플러그 앤 플레이 개념입니다.
3. "버스->장치" 유형 트리 구조를 통해 장치 간 종속성을 해결합니다(2.1장의 범례 참조). 이 종속성은 전원 켜기 및 끄기, 전원 관리 등과 같은 프로세스에서 특히 중요합니다.
장치가 버스에 탑재되어 있다고 가정해 보겠습니다. 장치를 시작하려면 해당 장치가 탑재된 버스를 먼저 시작해야 합니다. 분명히 시스템에 많은 장치가 있고 종속성이 매우 복잡하다면 커널이나 드라이버 개발자 모두 이 관계를 유지할 수 없습니다.
장치 모델의 트리 구조는 이 종속성을 자동으로 처리할 수 있습니다. 장치를 시작하기 전에 커널은 장치가 다른 장치나 버스에 종속되어 있는지 확인합니다. 종속된 경우 종속 개체가 시작되었는지 여부를 확인하고 장치 시작 조건이 충족될 때까지 해당 개체를 먼저 시작합니다. 만났다. 드라이버 개발자가 해야 할 일은 장치 드라이버를 작성할 때 장치의 종속성을 커널에 알리는 것입니다.
4. 클래스 구조를 사용하여 장치 모델에 객체 지향 개념을 도입하면 공통 기능을 최대한 추상화하고 드라이버 개발 프로세스에서 노동의 중복을 줄이고 작업 부하를 줄일 수 있습니다.
위 내용은 Linux 디바이스 모델에 대한 자세한 설명(1)_기본 개념의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!