드라이버를 커널로 컴파일해야 하는 이유는 무엇입니까? 더 많은 드라이버가 동적 커널 모듈로 배포되지 않는 이유는 무엇입니까?

드라이버를 커널로 컴파일해야 하는 이유는 무엇입니까? 더 많은 드라이버가 동적 커널 모듈로 배포되지 않는 이유는 무엇입니까?

저는 아직 Linux 커널을 처음 접했기 때문에 이 기본적인 질문에 대해 양해해 주시기 바랍니다. 제가 읽고 볼 수 있는 자료를 알려주시면 매우 감사하겠습니다.

Windows의 경우 하드웨어 드라이버 작업 흐름은 핵심 운영 체제를 먼저 설치한 다음 드라이버를 별도로 설치하는 것으로 보입니다.

Linux의 경우 모든 드라이버가 커널에 직접 컴파일되는 것 같습니다. 이는 설치된 Linux 배포판이 지원되는 모든 하드웨어를 지원한다는 의미입니까? 일부 하드웨어만 사용하더라도 마찬가지입니까?

이것은 독점 NVIDIA 드라이버(커널에 포함되지 않음)와 같은 것을 설치하려면 실제로 NVIDIA 드라이버로 커널을 다시 컴파일해야 한다는 것을 의미합니까? Ubuntu 및 Fedora와 같은 배포판은 드라이버가 내장된 사전 컴파일된 커널을 제공합니까?

최근에 Xbox 무선 어댑터에 대한 지원을 추가하는 Linux 설치에 드라이버를 설치했습니다. "DKMS"를 사용하여 드라이버를 커널로 컴파일하지 않고 시스템에 추가합니다.

DKMS는 Linux에 마이크로커널 기능을 추가하는 방법입니까? 모든 드라이버가 동적 모듈로 배포되지 않는 이유는 무엇입니까? 커널 모듈은 설치 시 이미 동적이지 않습니까 /ib/modules?

자체 서명된 Linux 설치 환경에서 동적 커널 모듈이 보안 부팅에 어떤 영향을 미치나요?

답변1

나는 당신이 서로 관련되어 있지만 서로 다른 두 가지 개념, 즉 커널이 드라이버를 사용하는 방법(정적 컴파일, 동적 로딩), 그리고 어떻게 개발되었는지(나무 안, 나무 바깥).

트리 내에서 개발된 드라이버는 커널로 컴파일되거나 동적으로 로드될 수 있습니다. 대부분은 동적으로 로드됩니다. 트리에서 개발된 드라이버는 대부분의 배포판의 커널 소스에 나타나지 않기 때문에 거의 항상 동적으로 로드되므로 전혀 컴파일할 수 없습니다. 드라이버를 별도로 설치해야 한다면 커널 외부에서 개발된 것입니다.

드라이버는 커널의 많은 내부 API에 의존하며 제가 이해한 바로는Linux는 이러한 API의 이전 버전과의 호환성에 관심이 없습니다.. 사람들은 이전 버전과의 호환성을 위해 오래된 코드와 어수선한 최신 코드를 유지하는 것보다 깨끗한 코드를 선호합니다. 따라서 그들은 드라이버를 트리에 두는 것을 선호합니다. 누군가가 API를 리팩토링하는 경우 해당 API의 모든 사용자를 위해 이를 수정해야 하며 모든 사용자가 동일한 소스 코드에 있기 때문에 그렇게 할 수 있습니다.

물론, 이는 트리 외부 드라이버로는 수행할 수 없습니다. 따라서 다른 버전에서는 의존하는 API가 중단될 수 있으므로 특정 커널 버전용으로 컴파일해야 합니다. NVIDIA(및 아마도 다른 회사)의 경우 드라이버는 기본적으로 독점 바이너리를 감싸는 심입니다. (shim은 여러 커널 버전을 지원합니다.) 이는 배포판의 경우 패키지된 각 커널 버전에 대한 드라이버 패키지가 있어야 함을 의미합니다.

DKMS는 메커니즘입니다이러한 트리 외부 커널을 지원하기 위해 DKMS는 각 커널 버전에 대해 하나의 드라이버 버전을 패키징하는 대신 설치된 각 커널 버전에 대해 드라이버를 컴파일합니다.

관련 정보