如果有多个内核模块可以驱动相同的设备,有什么规则可供select?

pcnet32和vmxnet都可以驱动设备。

$ lspci -k ... 02:01.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rev 10) Subsystem: Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] Flags: bus master, medium devsel, latency 64, IRQ 19 I/O ports at 2000 [size=128] [virtual] Expansion ROM at dc400000 [disabled] [size=64K] Kernel driver in use: vmxnet Kernel modules: vmxnet, pcnet32 

两个内核模块都被加载,

 $ lsmod | grep net pcnet32 32644 0 vmxnet 17696 0 mii 5212 1 pcnet32 

如您所见,正在使用的内核驱动程序是vmxnet。 内核中有没有策略/algorithm如何从候选人中select?

简短的回答: select内核遇到的第一个模块

模块加载通常由/ etc / modules/etc/udev/rules.d中描述的udev规则来处理 。 今天,大多数Linux发行版使用udev进行设备处理。 在udev,modprobe和内核模块加载器之间有相当复杂的交互,但是我认为这个演示的作者解释得非常好。

这是在VMWare下运行的虚拟机吗?

pcnet32是vmware的一个旧的以太网设备驱动程序vmxnet是vmware的较新的以太网设备驱动程序

mii是以太网绑定驱动程序

根据这个线程,所有你需要做的就是在它的configuration中为guest虚拟机指定正确的NIC设备。

ethernet0.virtualDev =“vmxnet”