模块参数解析优先级

在Linux内核模块中,参数的解析优先级通常遵循以下顺序(从高到低):


1. 命令行参数 (模块加载时指定)

  • 优先级最高
    通过 insmodmodprobe 加载模块时直接传递的参数会覆盖其他来源。
    1
    insmod mymodule.ko param1=value1 param2=value2

2. 设备树 (Device Tree) 或 ACPI 表

  • 次高优先级
    设备树(常见于嵌入式系统)或 ACPI 表(常见于 x86 系统)中定义的参数会被模块读取,但会被命令行参数覆盖。
    1
    2
    3
    4
    &mydevice {
    param1 = <0x100>;
    param2 = "custom-config";
    };

3. 模块内默认值

  • 最低优先级
    模块源代码中通过 module_param()module_param_named() 定义的默认值,仅在所有其他来源未提供参数时生效。
    1
    2
    static int param1 = 10;
    module_param(param1, int, 0644);

补充说明

  • 运行时参数修改(如 sysfs)
    通过 /sys/module/<module>/parameters/ 动态修改的参数仅影响运行时的行为,不参与初始化优先级的竞争。例如:

    1
    echo 20 > /sys/module/mymodule/parameters/param1
  • 模块依赖关系
    如果模块依赖其他模块(如通过 modprobe 自动加载依赖项),依赖模块的参数可能由 modprobe.d 配置文件(如 /etc/modprobe.d/*.conf)设置。


流程图解

1
2
3
4
5
6
7
命令行参数 (最高优先级)

设备树/ACPI 参数

模块内部默认值 (最低优先级)

运行时 sysfs 修改 (仅影响运行状态)

通过这一优先级规则,开发者可以灵活地通过不同层级的配置控制模块行为。