我的许多模块缺少/sys/模块/*/参数目录,我无法检查加载的模块参数。
# printf "%s\n" /sys/module/*/parameters | wc -l
125
# lsmod | wc -l
151
# comm -13 <(printf "%s\n" /sys/module/*/parameters | xargs dirname | xargs basename -a | sort) <(lsmod | awk '{print $1}' | sort) | fmt
Module aesni_intel at24 blake2b_generic bpf_preload btbcm btintel
btmtk btrfs btrtl crc16 crc32_pclmul crc32c_generic crc32c_intel
crct10dif_pclmul cryptd crypto_simd crypto_user dummy ecdh_generic fat
gf128mul ghash_clmulni_intel i2c_smbus iTCO_vendor_support iTCO_wdt
intel_cstate intel_pmc_bxt intel_rapl_common intel_rapl_msr intel_uncore
ip6_tables ip6t_REJECT ip6table_filter ip6table_mangle ip6table_nat
ip6table_raw ip_tables ipt_REJECT iptable_filter iptable_mangle
iptable_nat iptable_raw irqbypass joydev ledtrig_audio libcrc32c lpc_ich
mac_hid mei mei_hdcp mei_me mei_pxp mei_wdt nf_conntrack_broadcast
nf_conntrack_netlink nf_conntrack_pptp nf_defrag_ipv4 nf_defrag_ipv6
nf_log_syslog nf_nat nf_nat_amanda nf_nat_ftp nf_nat_h323 nf_nat_irc
nf_nat_pptp nf_nat_sip nf_nat_snmp_basic nf_nat_tftp nf_reject_ipv4
nf_reject_ipv6 nfnetlink nfnetlink_log nvidia nvme_common parport
polyval_clmulni polyval_generic ppdev raid6_pq rapl sha512_ssse3
snd_hda_codec_conexant snd_hda_codec_generic snd_hda_core snd_hwdep ts_kmp
tun uas vboxnetadp vboxnetflt vfat vmd x_tables xhci_pci xhci_pci_renesas
xor xt_CT xt_LOG xt_NFLOG xt_addrtype xt_comment xt_conntrack xt_hashlimit
xt_mark xt_multiport xt_tcpudp
最值得注意的是,我感兴趣的是:
# lsmod | grep nvidia
nvidia_drm 77824 20
nvidia_modeset 1515520 40 nvidia_drm
nvidia_uvm 2891776 0
video 69632 1 nvidia_modeset
nvidia 61472768 2179 nvidia_uvm,nvidia_modeset
# ls /sys/module/nvidia/parameters
ls: cannot access '/sys/module/nvidia/parameters': No such file or directory
但是,虚拟人没有参数,这是一个假人:
# modprobe dummy numdummies=12
# lsmod | grep dummy
dummy 16384 0
root@leonidas /root
# ls /sys/module/dummy/parameters
ls: cannot access '/sys/module/dummy/parameters': No such file or directory
# ip a | grep dummy | wc -l
12
我找到了https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1774731,也找到了dummy/parameters目录。
如何启用该目录,以便获得内核模块参数?
发布于 2023-02-04 10:40:59
为了使模块的参数在/sys/module/*/parameters
中可见,模块需要为每个参数提供一个module_param_cb()
回调函数。这些函数必须“知道在哪里查找”各个参数的当前设置,因此sysfs
文件系统驱动程序可以根据需要使用它们来计算参数及其状态。
如果模块使用module_param(name, type, perm)
或module_param_named(name, value, type, perm)
宏声明其参数,则将自动生成回调函数,除非perm
被指定为0。
dummy
模块声明其模块参数如下:
module_param(numdummies, int, 0);
MODULE_PARM_DESC(numdummies, "Number of dummy pseudo devices");
显式地将perm
指定为0,这使得参数在sysfs中不可见。
主nvidia
模块声明自己的NV_MODULE_PARAMETER(x)
和NV_MODULE_STRING_PARAMETER(x)
宏(在NVidia驱动程序包中的common/inc/nv-linux.h
中),这些宏使用module_param()
,perm
参数设置为0:
#define NV_MODULE_PARAMETER(x) module_param(x, int, 0)
#define NV_MODULE_STRING_PARAMETER(x) module_param(x, charp, 0)
驱动程序包中的其他模块,如nvidia_modeset
、nvidia_drm
和nvidia_uvm
,确实以更正常的方式使用module_param()
,并且这些模块在/sys/module/*/parameters
中确实有它们的参数。
显然,nvidia
模块内部将其参数处理为“注册表项”(参见驱动程序包中的nvidia/nv-reg.h
)。也许这是一种为NVidia驱动程序参数提供跨平台接口的尝试,这至少在某种意义上与Windows和Linux相似吧?
还请注意,nvidia
模块提供了自己的/proc/driver/nvidia/params
伪文件,它提供了一个虚拟文件中的所有参数。
因此,简单地说:我建议您看一下/proc/driver/nvidia/params
,看看它是否适合您的需要。如果没有,而且如果您愿意构建NVidia驱动程序的自定义版本,您可以尝试更改NV_MODULE_PARAMETER()
和NV_MODULE_STRING_PARAMETER()
宏的定义,使其具有0以外的perm
值,例如:
#define NV_MODULE_PARAMETER(x) module_param(x, int, 0400)
#define NV_MODULE_STRING_PARAMETER(x) module_param(x, charp, 0400)
若要使所有以这种方式声明的参数使用/sys/module/*/parameters
接口可读,仅由根用户声明。
如果它有效,您可以向NVidia发送一个增强请求。
https://unix.stackexchange.com/questions/734288
复制相似问题