저는 ARM 프로세서가 내장된 마더보드를 개발해 왔습니다. 부팅하려면 부트로더, Linux 커널, 루트 파일 시스템이 포함된 디스크 이미지를 추가해야 했습니다. 이 디스크 이미지는 타겟 보드(ZedBoard)에 대해 인터넷에서 찾을 수 있습니다.
커널을 컴파일하고 필요한 모든 드라이버를 활성화한 후 /lib/modules/kernel_number에서 많은 드라이버를 사용할 수 있음을 발견했습니다.
전체 작업이 어떻게 작동하는지 조금 혼란스러워요. 드라이버가 커널에 의해 로드됩니까? 그렇다면 왜 이미 rootfs의 일부입니까? 아니면 커널이 그 안에 컴파일된 내용으로 덮어쓰나요?
답변1
"드라이버"와 "모듈"을 구별해야 하지만 매우 간단합니다. 드라이버는 모듈일 수도 있고 아닐 수도 있습니다. 그렇지 않은 경우 부트로더가 로드한 커널에 빌드됩니다.
모듈인 경우 루트의 파일 시스템 계층 구조에 있습니다 /lib/modules/[kernel-release]
. 1 커널은 이러한 저장소를 포함할 수도 있는 작은 예비 루트 파일 시스템("initramfs")으로 부팅될 수 있습니다. 이는 일반 커널의 경우 일반적인 현상이므로 실제 파일 시스템에 액세스하기 위해 로드해야 하는 모듈식 드라이버를 결정할 수 있습니다. 그렇게 할 수 없으면 거기에 있는 어떤 모듈에도 액세스할 수 없기 때문입니다.
드라이버가 커널에 의해 로드됩니까?
예.
그렇다면 왜 이미 rootfs의 일부입니까?
로드하기 전에 어디에 보관해야 합니까? 커널 자체에는 rootfs가 포함되어 있지 않으며(WRT 일부 형태의 initramfs 제외) 이는 단지 게이트키퍼일 뿐입니다.
커널이 그 안에 컴파일된 내용으로 덮어쓰나요?
습관. 드라이버를 컴파일하면 커널은 /lib/modules
이를 확인하지 않습니다. 그러한 드라이버를 로드하라고 명시적으로 요청하면 어떤 일이 일어날지 잘 모르겠습니다. 아마도 그냥 아니오라고 대답할 것입니다.
1. Celada가 암시했듯이 $(uname -r)
이 버전 문자열은 반드시 버전 번호일 필요는 없습니다. 버전은 동일하고 버전 문자열은 다른 여러 코어를 가질 수 있으므로 별도의 모듈 저장소를 사용할 수 있습니다. 마찬가지로 동일한 릴리스 문자열을 사용하여 동일한 모듈 저장소를 갖는 여러 코어를 가질 수 있습니다.
답변2
Linux에서는 대부분의 드라이버를 커널에 정적으로 구축하거나 모듈로 구축할 수 있습니다. 이는 컴파일을 위해 커널을 구성할 때 선택할 수 있습니다. /lib/modules/$(uname -r)
로드 가능한 모듈로 빌드된 경우 에만 나타납니다.
일반적으로 범용 시스템, 특히 Linux 배포판의 일부로 제공되는 사전 컴파일된 커널의 경우 엄격한 최소 드라이버 세트가 정적으로 구축되며 가능한 경우 모듈로 구축됩니다. 이를 통해 각 사용자의 시스템은 사전에 모듈이 무엇인지 알지 못한 채 필요한 모듈만 로드할 수 있습니다.
임베디드 시스템에는 커널에 더 많은 드라이버가 내장되어 있는 경우가 많습니다. 커널은 매우 특정한 불변 하드웨어 세트가 있는 시스템용으로 구축되었으며 시스템 통합자는 그것이 무엇인지 미리 알고 있기 때문입니다. 그러나 많은 드라이버는 특히 존재할 수도 있고 존재하지 않을 수도 있는 "추가" 하드웨어(예: USB 장치)의 경우 모듈로 로드되는 경우가 많습니다.