代码之家  ›  专栏  ›  技术社区  ›  Yacine Hebbal

向内核模块传递一个大数字参数

  •  2
  • Yacine Hebbal  · 技术社区  · 8 年前

    我想将虚拟地址参数(例如0xf23fa44)传递给一个小型内核模块。

    我获得: Numerical result out of range 无论我使用的参数类型如何(int,long),都会出现错误。无符号整数&无符号long给出编译错误。

    我如何解决这个问题?

    以下是我的源代码:

    #include <...headers...>
    
    static long address = 0;
    module_param(address, long, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
    
    static int hello_init(void){
        struct task_struct *task_struct = (struct task_struct*) address;
    
        printk(KERN_ALERT "----BEGIN-------\n");
        printk("pid: %x\n" task_struct->pid)    
        printk(KERN_ALERT "----END-------\n");
        return 0;
    }
    
    static void hello_exit(void){
    
        printk(KERN_ALERT "----EXIT---------\n");
    }
    module_init(hello_init);
    module_exit(hello_exit);
    
    2 回复  |  直到 8 年前
        1
  •  3
  •   Tsyvarev    8 年前

    从宏的描述 module_param :

    Standard types are:
         byte, short, ushort, int, uint, long, ulong
         charp: a character pointer
         bool: a bool, values 0/1, y/n, Y/N.
         invbool: the above, only sense-reversed (N = true).
    

    unsigned long 类型 争论 module_param ulong :

    static unsigned long address = 0;
    module_param(address, ulong, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
    
        2
  •  1
  •   Alex random_user    5 年前

    潜在解决方案;你可以用字符串代替

    static char *str_name = "1231241233213213123123423";
    module_param(str_name,charp,0000);
    

    并将字符串解析为适合该值的任何类型。