我想知道Linux(例如Ubuntu)如何“从头开始”安装时如何以及如何安装驱动程序。例如,我购买了一台没有任何系统的新计算机,然后安装了Ubuntu。在我的PC内,我有一个GPU,HDD等,还有一些外围设备,例如鼠标,键盘等。显然,全新安装没有系统控制和与硬件进行通信所需的驱动程序,因此Ubuntu如何知道“要安装/下载哪些驱动程序,它是如何做到的?
(基于Google缓存的Petter Reinholdtsen的http://people.skolelinux.org/pere/blog/Modalias_strings___a_practical_way_to_map__stuff__to_hardware.html的副本。)
在硬件中,只要您知道特定I / O总线或子系统的标准访问方法,就可以访问某些标准设备标识符,而无需进一步了解实际设备。在Linux中,这些标识符用于构建modalias字符串,然后用于为每个设备找到正确的驱动程序。
每个驱动程序模块的源代码都可以包含MODULE_DEVICE_TABLE
结构,depmod
命令可使用这些结构来创建模块别名通配符条目,这些条目将与该特定模块支持的硬件的模态字符串匹配。
当内核检测到尚未加载匹配驱动程序的硬件时,它将根据硬件标识符创建一个modalias字符串,并使用它来请求自动加载模块。modprobe
然后,该命令将使用/lib/modules/$(uname -r)/modules.alias[.bin]
创建的文件depmod
来查看是否存在匹配的模块。如果是这样,则将加载该模块,并在必要时开始探查硬件以获取更多详细信息。
例如,我有DVB电视卡:
$ 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]
这将导致如下所示的modalias字符串:
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子类型”。它使用如下的modalias字符串:
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设备,modalias字符串如下所示:
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 PNP标识符,以acpi:
冒号作为前缀并以冒号分隔:
acpi:IBM0071:PNP0511:
这可能是一个很长的modalias字符串:
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)
modalias字符串将如下所示:
serio:ty01pr00id00ex00
这些值是:
ty 01 (type)
pr 00 (prototype)
id 00 (id)
ex 00 (extra)
Linux内核可以识别许多其他总线类型。研究内核源文件file2alias.c的内容可能有助于理解每种modalias字符串的组成部分的含义。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句