zoukankan      html  css  js  c++  java
  • 内核与驱动的version magic匹配

    i40e: version magic '4.4.58-svn-46674 SMP mod_unload modversions aarch64' should be '4.4.131.kylin.server.YUN SMP mod_unload aarch64'

    一校招生在insmod ko的时候总是遇到此问题, 当时就给了答案就说 了 config 配置文件中 某某字段 不对--->内核 svn版本 不对

    问题很好解决!

    目前来看下这个version magic的内核实现

    根据打印log信息看,是由version magic不匹配造成,找到信息打印点

    static int check_modinfo(struct module *mod, struct load_info *info, int flags)
    {
        const char *modmagic = get_modinfo(info, "vermagic");
        int err;
    
        if (flags & MODULE_INIT_IGNORE_VERMAGIC)
            modmagic = NULL;
    
        /* This is allowed: modprobe --force will invalidate it. */
        if (!modmagic) {
            err = try_to_force_load(mod, "bad vermagic");
            if (err)
                return err;
        } else if (!same_magic(modmagic, vermagic, info->index.vers)) {
            pr_err("%s: version magic '%s' should be '%s'
    ",
                   mod->name, modmagic, vermagic);
            return -ENOEXEC;
        }
    -------------------------------------------
    }

    当前module ko的modmagic 和 内核的vermagic  对比;

    static const char vermagic[] = VERMAGIC_STRING;
    
    #define VERMAGIC_STRING                         
        UTS_RELEASE " "                            
        MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT             
        MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS    
        MODULE_ARCH_VERMAGIC                        
        MODULE_VERMAGIC_RETPOLINE
    
    
    
    
    #define MODULE_ARCH_VERMAGIC    "aarch64"
    #define MODULE_VERMAGIC_MODULE_UNLOAD "mod_unload "
    #define MODULE_VERMAGIC_PREEMPT "preempt "
    #define MODULE_VERMAGIC_MODVERSIONS "modversions "
    #define MODULE_VERMAGIC_SMP "SMP "

    VERMAGIC_STRING 中的UTS_RELEASE 指向啥呢?? 

    这个是在Makefile中定义!

    #define UTS_RELEASE "$(KERNELRELEASE)";)
    # Read KERNELRELEASE from include/config/kernel.release (if it exists)
    KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
    KERNELVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION)

     可见KERNELRELEASE由include/config/kernel.release文件读取获得,此文件是编译生产的,在原始的内核代码中没看到,但是make 后就能看到!

    Q2:在查看 same_magic 函数实现的时候发现有两个函数实现, 通过CONFIG_MODVERSIONS 宏来控制

     

    •   如果宏没有开启,将对vermagic作全字符串的完整匹配,任何不一致均会阻止该内核模块的加载;
    •   而倘若这个宏被开启,则只有vermagic第一个空格之后的部分会参与匹配

    PS:在对比的时候发现 4.4.131.kylin.server.YUN SMP mod_unload aarch64 这段字符中没有看到  #define MODULE_VERMAGIC_PREEMPT "preempt "

     也就是没有开启 CONFIG_PREEMPT

    回归正题, 那 kernel.release是怎样生成的呢?

    define filechk_kernel.release
    echo $(KERNELVERSION)$$(if [ "$(FROM_DPKG)" != y ]; then $(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree);fi)
    endef

    # Store (new) KERNELRELEASE string in include/config/kernel.release
    include/config/kernel.release: include/config/auto.conf FORCE
    $(call filechk,kernel.release)

    看Makefile 中 可以看到 依赖于setlocalversion 脚本

    也就是 只需要执行 setlocalversion 这个脚本就知道 version magic 的生成了!!

    http代理服务器(3-4-7层代理)-网络事件库公共组件、内核kernel驱动 摄像头驱动 tcpip网络协议栈、netfilter、bridge 好像看过!!!! 但行好事 莫问前程 --身高体重180的胖子
  • 相关阅读:
    JavaScript语法
    javascript的用法
    格式和布局
    Css样式表
    HTML基本语言(表单的基本元素)
    HTML超文本语言(一般标签)
    C#项目打开/保存文件夹/指定类型文件,获取路径
    在DataGridView控件中加入ComboBox下拉列表框的实现
    DataGridView 中添加CheckBox和常用处理方式 .
    数据库建模模板、菜单显示出问题解决方案
  • 原文地址:https://www.cnblogs.com/codestack/p/15038507.html
Copyright © 2011-2022 走看看