Linux(예: Ubuntu)가 처음부터 설치할 때 설치 방법과 설치할 드라이버를 어떻게 "알고" 있는지 궁금합니다. 예를 들어, 시스템 없이 새 컴퓨터를 구입하고 Ubuntu를 설치했습니다. 내 PC에는 GPU, HDD 등이 내장되어 있고 마우스, 키보드 등 일부 주변 장치도 있습니다. 분명히 새로 설치하면 시스템이 하드웨어를 제어하고 통신하는 데 필요한 드라이버가 없습니다. 그렇다면 Ubuntu는 설치/다운로드할 드라이버를 어떻게 "알고" 이를 어떻게 수행합니까?
답변1
(Google 캐시 사본을 기반으로 함)http://people.skolelinux.org/pere/blog/Modalias_strings___a_practical_way_to_map__stuff__to_hardware.html저자: 피터 라인호드슨(Peter Reinhodson) )
하드웨어에서는 특정 I/O 버스 또는 하위 시스템에 대한 표준 액세스 방법을 알고 있는 한 실제 장치에 대한 추가 지식 없이도 특정 표준 장치 식별자에 액세스할 수 있습니다. Linux에서는 이러한 식별자를 사용하여 빌드합니다.모달 문자열, 이는 각 장치에 대한 올바른 드라이버를 찾는 데 사용됩니다.
각 드라이버 모듈의 소스 코드에는 MODULE_DEVICE_TABLE
명령이 depmod
특정 모듈에서 지원하는 하드웨어의 모달 문자열과 일치하는 모듈 별칭 와일드카드 항목을 생성하는 데 사용하는 구조가 포함될 수 있습니다.
커널이 하드웨어에 대해 일치하는 드라이버가 아직 로드되지 않았음을 감지하면 하드웨어 식별자를 기반으로 모달 문자열을 생성하고 이를 사용하여 모듈의 자동 로드를 요청합니다. modprobe
그런 다음 명령은 생성된 파일을 사용하여 일치 /lib/modules/$(uname -r)/modules.alias[.bin]
하는 depmod
모듈이 있는지 확인합니다. 그렇다면 모듈을 로드하고 필요한 경우 하드웨어를 조사하여 자세한 내용을 확인하십시오.
예를 들어, DVB TV 카드가 있습니다.
$ lspci -v -nn -s 07:00.0
07:00.0 Multimedia video controller [0400]: Conexant Systems, Inc. CX23885 PCI Video and Audio Decoder [14f1:8852] (rev 04)
Subsystem: Hauppauge computer works Inc. CX23885 PCI Video and Audio Decoder [0070:6a28]
그러면 다음과 같은 모달 문자열이 생성됩니다.
pci:v000014F1d00008852sv00000070sd00006A28bc04sc00i00
이 모듈의 소스 코드에는 cx23885
다음과 같은 별칭이 있습니다 .MODULE_DEVICE_TABLE
# modinfo cx23885
...
alias: pci:v000014F1d00008880sv*sd*bc*sc*i*
alias: pci:v000014F1d00008852sv*sd*bc*sc*i*
...
커널이 카드를 감지하면 효과적으로 modprobe pci:v000014F1d00008852sv00000070sd00006A28bc04sc00i00
명령을 실행합니다. 모듈의 두 번째 별칭이 cx23885
일치하므로 모듈이 로드됩니다.
PCI/PCI-X/PCIe 버스 장치
이것이 "PCI 하위 유형"입니다. 다음과 같은 모달 문자열을 사용합니다.
pci:v00008086d00002770sv00001028sd000001ADbc06sc00i00
다음과 같이 디코딩할 수 있습니다.
v 00008086 (vendor)
d 00002770 (device)
sv 00001028 (subvendor)
sd 000001AD (subdevice)
bc 06 (bus class)
sc 00 (bus subclass)
i 00 (interface)
를 사용하면 lspci -nn
클래스, 하위 클래스, 공급업체 및 장치 ID를 볼 수 있습니다. 해당 옵션을 추가하면 -v
subvendor:subdevice ID도 볼 수 있습니다.
USB 장치
USB 장치의 경우 모달 문자열은 다음과 같습니다.
usb:v1D6Bp0001d0206dc09dsc00dp00ic09isc00ip00
그러면 다음과 같이 압축이 풀립니다.
v 1D6B (device vendor)
p 0001 (device product)
d 0206 (bcddevice)
dc 09 (device class)
dsc 00 (device subclass)
dp 00 (device protocol)
ic 09 (interface class)
isc 00 (interface subclass)
ip 00 (interface protocol)
이 lsusb
명령을 사용하면 공급업체 및 제품 ID를 볼 수 있습니다. 해당 옵션을 사용하면 -v
다른 ID도 볼 수 있습니다.
ACPI 장치
acpi:
접두사가 붙고 콜론으로 구분된 ACPI PNP 식별자를 사용합니다 .
acpi:IBM0071:PNP0511:
DMI 장치
이는 매우 긴 모달 문자열일 수 있습니다.
dmi:bvnIBM:bvr1UETB6WW(1.66):bd06/15/2005:svnIBM:pn2371H4G:pvrThinkPadX40:rvnIBM:rn2371H4G:rvrNotAvailable:cvnIBM:ct10:cvrNotAvailable:
그러면 다음과 같이 압축이 풀립니다.
bvn IBM (BIOS vendor)
bvr 1UETB6WW(1.66) (BIOS version)
bd 06/15/2005 (BIOS date)
svn IBM (system vendor)
pn 2371H4G (product name)
pvr ThinkPadX40 (product version)
rvn IBM (board vendor)
rn 2371H4G (board name)
rvr NotAvailable (board version)
cvn IBM (chassis vendor)
ct 10 (chassis type)
cvr NotAvailable (chassis version)
SerIO 장치, 즉 주로 PS/2 마우스
모달 문자열은 다음과 같습니다:
serio:ty01pr00id00ex00
여기에 있는 값은 다음과 같습니다.
ty 01 (type)
pr 00 (prototype)
id 00 (id)
ex 00 (extra)
기타 버스/장치 유형
Linux 커널은 다른 많은 버스 유형도 인식합니다. 커널 소스 파일의 내용 연구File2alias.c각 유형의 모달 문자열 구성 요소의 의미를 해독하는 데 도움이 될 수 있습니다.
답변2
모든 주변 장치는 대부분 고유한 ID를 통해 자신을 식별합니다. 일부 ID는 일반 인터페이스(HDD/마우스 등)용입니다. 대부분의 드라이버는 Linux에 내장되어 있으며 일반 드라이버에는 제한된 기능 세트를 지원하는 ID에 대한 호환성 목록이 있습니다. 더 복잡해지지만 dmesg, lscpu, hwinfo, lshw, dmidecode, lspci 등은 ID를 나열합니다(보려는 경우).