Busybox 기반 최소 시스템의 초기화에서 현재 하드웨어의 커널 모듈을 로드하는 방법

Busybox 기반 최소 시스템의 초기화에서 현재 하드웨어의 커널 모듈을 로드하는 방법

최소한으로바쁜 상자initLinux 시스템을 기반으로 현재 하드웨어의 모든 커널 모듈이 로드되도록 하려면 스크립트에서 어떤 명령을 호출해야 합니까 ?

답변1

하드웨어에 따라 일부 통화가 있을 수 있습니다.버스모듈을 로드합니다. 이 중 대부분은 이미 자동화되어 있습니다. 나는 그것을 통해 가정하고있다 파일 시스템 초기화,udev/mdev,할더,시스템 초기화, 등...

모듈을 수동으로 로드하는 한 가지 방법은 modprobe모든 종속성을 처리하는 모듈을 호출하는 것입니다.

예를 들어:

# modprobe snd_pcm

내 경우에는 사운드를 생성하는 데 필요한 모든 모듈을 로드합니다.

모든 종속성이 먼저 modprobe로드됩니다 snd_hda_core. 이것이 이유 snd_hda_core의 일부 입니다 snd_pcm.

$ lsmod | grep ^snd_hda_core 
snd_hda_core          110592  5 snd_hda_codec_generic,snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec,snd_hda_codec_realtek

그 후 모든 snd_pcm종속성은 modprobe.

$ lsmod | grep ^snd_pcm
snd_pcm               135168  10 snd_hda_codec_hdmi,snd_hda_intel,snd_usb_audio,snd_hda_codec,soundwire_intel,snd_compress,snd_soc_core,snd_hda_core,snd_pcm_dmaengine

기본적으로 일부 모듈을 로드하는 파일이 /etc/modules-load.d/포함 된 폴더가 있습니다 . *.conf이것은 필요한 모든 작업을 수행하므로 초기화 스크립트를 작성할 필요가 없습니다...

$ cat /etc/modules-load.d/local.conf 
vfio_pci
asus-wmi-sensors
tun

즉, 모든 모듈을 로드하려면 한 번의 호출이나 하나의 파일만 필요합니다.

modprobe 맨페이지...

modprobe에는 modprobe와 함께 제공되는 해당 depmod 유틸리티에서 생성된 최신 module.dep.bin 파일이 필요합니다(depmod(8) 참조). 이 파일은 각 모듈에 필요한 다른 모듈(있는 경우)을 나열하고 modprobe에서 이러한 종속성을 자동으로 추가하거나 제거하는 데 사용됩니다.

depmod 맨페이지...

Linux 커널 모듈은 다른 모듈에서 사용할 수 있는 서비스("기호"라고 함)를 제공할 수 있습니다(코드의 EXPORT_SYMBOL 변형 중 하나 사용). 두 번째 모듈이 이 기호를 사용하는 경우 해당 두 번째 모듈은 분명히 첫 번째 모듈에 종속됩니다. 이러한 종속성은 상당히 복잡해질 수 있습니다.

depmod는 /lib/modules/version 아래의 각 모듈을 읽고 내보낼 기호와 필요한 기호를 결정하여 모듈 종속성 목록을 만듭니다. 기본적으로 이 목록은 동일한 디렉터리에 있는 module.dep 및 module.dep.bin이라는 이진 해시 버전에 기록됩니다.

###################

다음에 추가

그것을 지적한 후에는 그 뒤에 숨겨진 마법을 설명해야 합니다. 노력해야 하는데 좀 애매하네요.

내 GPU 중 하나를 살펴보겠습니다.

다음 예는 다음과 같습니다.모델리아내 GPU와별명모듈 정의가 겹칩니다.

$ lspci
...
0b:00.0 VGA compatible controller: NVIDIA Corporation GP102 [GeForce GTX 1080 Ti] (rev a1)
...
$ cat /sys/bus/pci/devices/0000:0b:00.0/modalias
pci:v000010DEd00001B06sv00001462sd00003607bc03sc00i00
$ modinfo nvidia
...
alias:          pci:v000010DEd*sv*sd*bc03sc02i00*
alias:          pci:v000010DEd*sv*sd*bc03sc00i00*
depends:        i2c-core,drm
...

lspci 맨페이지...

커널 모듈이 장치를 처리할 수 있다고 보고합니다.

이 부분은 나에게 조금 낯설고 추측할 수밖에 없었다.

어쨌든 지금까지 모은 정보를 바탕으로 이 정보를 바탕으로 모듈을 구성하는 방법은 두 가지로 알고 있습니다.

첫 번째 방법(시작 시)...

echo "alias $(cat /sys/bus/pci/devices/0000:0b:00.0/modalias) nvidia" >> /etc/modprobe.d/default.conf 

두 번째 방법(런타임)...

echo "0000:0b:00.0" > /sys/bus/pci/drivers/nvidia/bind

이것엔비디아폴더는 임의의 모듈 이름 중 하나일 수 있습니다. 예를 들어 내가 지정할 수 있습니다.vfio-pci대신 폴더.

echo "0000:0b:00.0" > /sys/bus/pci/drivers/nvidia/unbind
echo "0000:0b:00.0" > /sys/bus/pci/drivers/vfio-pci/bind

이는 단지 예시일 뿐이며 GPU 모듈은 시작 시에만 로드될 수 있으므로 실제 환경에서는 작동하지 않습니다.

답변2

일부 드라이버가 커널에 내장되어 있고 다른 드라이버가 depmod생성된 모든 관련 메타데이터와 함께 커널 모듈로 나타나는 최소한의 initramfs를 가정하고 조금 더 깊이 파고든 결과는 다음과 같습니다.

커널에 내장된 드라이버는 /init호출하기 전에 로드됩니다.

/init모듈로 구축된 드라이버는 다음과 같이 로드해야 합니다.

  • 먼저 설치해야 합니다 /sys./proc
  • 그런 다음 기존 하드웨어를 검색하고 관련 커널 모듈을 로드해야 합니다.

하드웨어 스캐닝과 모듈 로딩은 일반적으로 간단한 프로그램을 통해 수행되어야 합니다.mdev -s옮기다.

안타깝게도마땅한 역할을 하지 않았다. 따라서 이 프로세스가 강제로 발생하도록 호출해야 합니다 find /sys/ -name modalias | xargs sort -u | xargs -n 1 modprobe.

그런 다음 현재 하드웨어(및 해당 종속성)에 대한 모든 드라이버가 로드되고 초기화됩니다.

관련 정보