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
コマンドを実行します。モジュールの2番目のエイリアスが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各タイプのモーダル文字列コンポーネントの意味を解読するのに役立ちます。