1. VC下的问题:
在编译程序中出现“fatal error C1010: unexpected end of file while looking for precompiled header directive”:
解决方法:
    a.是一个新添加的类的.cpp文件开头没包含stdafx.h,在该文件最前面加上即可。
    b.有时可以使用右键点击项目工程中的该cpp文件,选择setting,在c/c++栏,选择PreCompiled headers,然后设置第一选项,选择不使用预编译头,解决这个问题。
2. 如何调用已编译但未连接模块的函数:
  
注意事项:
     a. 对于.o 目标文件来说,程序头一般是不存在的(因为还没完成外部符号解析及与其他目标文件的链接,无法确定进程的内存布局)。因此对于.o 目标文件来说,信息都保存在段(section)中。
     b. 模块使用的文件必须是可重定位的。因此,模块使用的是 elf 文件格式。Elf 文件的全称是 Executable and Linkable Format。
     c. insmod基本流程:
     处理命令行参数,设定程序选项->设置模块查找目录->解析配置文档->确定模块的路径,打开模块文件->获取内核导出符号->加载模块文件->确认模块版本与内核相符->绑定引用的内核导出符号->引用外部符号、静态符号分配资源->解析模块运行时参数->检查模块运行时参数设置————————————————————->添加kallsyms段———————————-
  | 模块运行时参数使用文件                                                     |
  ———————>确认文件名、程序设置有效–>解析文件中的模块运行时参数
 
—>计算模块大小,在内核生成模块———>完成符号重定位–>完成kallsyms段–>初始化内核模块
              |模块运行时参数使用文件          |
              ———————>确认内核支持该功能
 
     d. 源码位于/pub/linux/utils/kernel/modutils/ :
        The modutils package includes the various programs needed for automatic loading and unloading of modules under 2.2 and later kernels as well as other module management programs.  Examples of loaded and unloaded modules are device drivers and filesystems, as well as some other things.
        另一个极易混淆的工具包:/pub/linux/utils/kernel/module-init-tools:
        This package includes the module tools for the 2.5 series of the kernel.If you are using a kernel from the 2.4 series, you will need the old tools from the modutils package.
       
       
     d. 各关键流程所完成的功能及部分核心代码:
     输入 insmod –x …命令时,将调用 insmod_main:
        /* Process the command line. */
        while ((o = getopt_long(argc, argv, "fhkLmnpqrsSvVxXyYe:o:O:P:R:",&long_opts[0], NULL)) != EOF)
        switch (o) {
        …
        case ‘P’: /* use prefix on crc */
        set_ncv_prefix(optarg);
        break;
        }
        set_ncv_prefix(optarg),该函数也在 insmod.c 中。其用途是让用户设置版本识别前缀。
        为了使内核与所使用模块兼容,不至发生错误,linux 里使用前、后缀(?)标识不同版本的内核与模块,在加载时内核就可以通过前后缀识别是否是正确版本的模块。
          
        INSMOD_MAIN接下来的代码:
        if (config_read(0, NULL, "", NULL) < 0) {
             error("Failed handle configuration");
        }
        modutils 工具具有令人恐怖的配置性能,简直与一个小型语言相仿。不过在 insmod 里,配置文件很多配置项都不起作用,唯一用到就是 prune,它在查找模块路径名时被用作过滤项。函数config_read正是解读 modutils 配置文档的关键。该函数在./modultis-2.4.0/util/config_read.c中。
      
        越往下读源码越发现,其实insmod大部分的工作是在做符号连接,离USB core渐行渐远,insmod进展到<Modultils工具源码分析之insmod篇>38宣布告一段落.
 
3. 模拟程序源代码:
 
        再分析下test_init.c源代码,其实核心代码就下面几行:
        int test_init( )
       {
             printf("Test Init voked successfully!\n");
             return 0;
       }
       module_init(test_init);
 
       因此真正要作的工作是在.h文件中对module_init作宏定义,下面是在module.h中的定义:
       #ifndef module_init
       #define module_init(x)  int init_module(void) { return x(); }
       #endif
       #ifndef module_exit
       #define module_exit(x)  void cleanup_module(void) { x(); }
       #endif
      
       然后在main函数中调用module_init();即可
       当然编译时要把test_init.c作完全编译,即编译的同时也进行连接.
       这样其实就部分模拟了insmod.之前把这个程序想得过于复杂了.
       由于本程序不需要注册块结构,因此剩去了insmod的大部分工作.

 

Advertisements