내가 아는 한, 커널은 하드웨어를 감지하고, sysfs에 정보를 추가하고, /dev에 장치를 생성한 다음 udev 이벤트를 생성합니다. 제 질문은 장치 드라이버가 이 모든 작업을 수행합니까, 아니면 커널 자체가 이 모든 작업을 수행합니까?입니다. 드라이버가 이 작업을 수행하면 devtmps에 파일을 생성하기 위해 장치의 주 번호와 부 번호를 알게 됩니다.
나는 또한 udev가 장치를 처리하는 드라이버를 로드하기 위해 modprobe를 호출한다는 것을 (아마도 부정확하게) 이해하고 있습니다.
이 작업을 수행하기 위해 MODALIAS uevent 환경 변수의 내용을 사용하고 별칭이 해당 문자열과 일치하는 모든 모듈(올바른 드라이버)을 로드한다고 들었습니다. 간단히 말해서 Linux의 하드웨어 감지 단계는 무엇이며 각 단계를 수행하는 사람은 커널 자체, 커널 내의 드라이버 또는 사용자 공간의 udev입니다. 감사해요.
답변1
커널은 장치 번호를 결정하기 때문에 장치 번호를 알고 있습니다. 각 드라이버는 자신이 관리하는 장치 번호를 등록합니다. 이러한 번호는 소스 코드에 하드코딩되어 있거나 경우에 따라 동적으로 할당됩니다. 이것시스템 파일 시스템파일 시스템을 사용하면 udev와 같은 응용 프로그램이 커널에서 지원하는 장치를 검색할 수 있습니다. 바라보다udev는 자신이 생성한 장치의 장치 번호를 어떻게 얻나요?자세한 내용은.
드라이버의 초기화 코드는 하드웨어를 검색하고 검색 중에 검색된 하드웨어를 기반으로 장치를 등록합니다. 특정 유형의 하드웨어는 프로빙을 지원하지 않습니다.ISA 버스(PC 유형 컴퓨터에서는 거의 사용되지 않는 버스) 연결된 하드웨어를 나열할 방법이 없으므로 드라이버는 통신을 시도하고 다른 주변 장치가 동일한 주소에 연결되지 않기를 바랄 뿐입니다. 일부 플랫폼에서는 부트로더에 다음이 포함됩니다.장치 트리사용 가능한 주변 장치와 해당 매핑 위치를 설명하고 Linux 커널은 이 정보를 기반으로 드라이버를 활성화합니다. 주변 장치용 드라이버를 로드하는 방법에는 세 가지가 있습니다.
- 드라이버는 커널 이미지의 일부로 포함될 수 있습니다.
- 드라이버는 모듈로 컴파일되고 명시적으로 로드될 수 있습니다(예:
/etc/modules
initramfs 또는 initramfs에 포함). - 버스 유형에 의해 보고된 정보를 기반으로 특정 드라이버를 자동으로 로드하는 메커니즘이 있습니다. 버스 유형에는 PCI(최신 PC의 기본 버스) 및 USB와 같은 공통 식별 번호와 함께 연결된 주변 장치가 나열되어 있습니다. 커널이 실행되고
modprobe
주변 장치의 ID를 인코딩하는 기호 이름이 전달됩니다. 이는 드라이버 모듈의 "실제" 이름에 대한 별칭입니다. 바라보다드라이버 모듈은 자동으로 로드 및 언로드됩니까?