linux内核之-----内核模块文件格式

来源:互联网 发布:手机谱曲的软件 编辑:程序博客网 时间:2024/06/05 16:36
linux内核之-----内核模块文件格式
        linux内核驱动有两种加载方式,一种是编译进内核文件即uImage或者zImage文件中,另一种是编译成内核模块形式,即XXX.ko。下面我们来分析一下内核模块的文件格式。
        内核模块XXX.ko,他在文件的数据组织形式上是ELF(Executable and Linkable Format)格式,也就是一种普通的可重定位目标文件,可用file命令来查看,输出如下:

        ELF文件格式在linux系统中非常常见,如linux内核驱动模块,可执行程序,以及linux下的XXX.so库文件(包括动态库文件和静态库文件)。ELF文件格式中的目标文件类型如下:
      (1). 可重定位文件(Relocatable File),即包含适合于与其他目标文件链接来创建可执行文件或者共享目标文件的代码和数据。如上图的hdmitx.ko文件就是可重定位文件。
      (2). 可执行文件(Executable File),包含适合于执行一个程序,此文件规定了exec()如何创建一个程序的进程映像。如下图所示的linux cp命令就是可执行文件。
       (3). 共享目标文件(Shared Object  File),包含可在两种上下文中链接的代码和数据。首先链接编辑器可以将它和其它可重定位文件和共享目标文件一起处理,生成另外一个目标文件。其次,动态连接器(Dynamic Linker)可能将它与其他某个可执行文件及其他共享目标文件一起组合,创建进程映像。如下图所示的libbsd.so.0.3.0库文件。

      下图为ELF格式的结构图(以下解说都以32位操作系统为例):

          从图中我们得知ELF文件总体上可分为四个部分,头部的ELF header,中间的Program header table和Section,尾部的Section header table。
ELF header部分
         大小为13*4,即52个字节,位于文件头部。
         e_ident这个字段标示了该文件为一个目标文件,提供了一个机器无关的数据,解释文件的内容。在下面的ELF的鉴别(ELF Identification)部分有更详细的信息。
         e_type:该字段确定目标文件的类型。
                                /* These constants define the different elf file types */
                                #define ET_NONE   0
                                #define ET_REL    1
                                #define ET_EXEC   2
                                #define ET_DYN    3
                                #define ET_CORE   4
                                #define ET_LOPROC 0xff00
                                #define ET_HIPROC 0xffff
          e_machine:该成员变量指出了运行该程序需要的体系结构。具体定义在elf-em.h头文件中,或许其他elf.h头文件中也有定义,下面列出几种:
                                /* These constants define the various ELF target machines */
                                #define EM_NONE        0
                                #define EM_M32        1
                                #define EM_SPARC    2
                                #define EM_386        3
                                #define EM_68K        4
                                #define EM_88K        5
                                #define EM_486        6    /* Perhaps disused */
                                #define EM_860        7
                                #define EM_MIPS        8    /* MIPS R3000 (officially, big-endian only) */
                               /* Next two are historical and binaries and modules of these types will be rejected by Linux.  */
                               #define EM_MIPS_RS3_LE    10    /* MIPS R3000 little-endian */
                               #define EM_MIPS_RS4_BE    10    /* MIPS R4000 big-endian */

                              #define EM_PARISC    15    /* HPPA */
                              #define EM_SPARC32PLUS    18    /* Sun's "v8plus" */
                              #define EM_PPC        20    /* PowerPC */
                              #define EM_PPC64    21     /* PowerPC64 */
                              #define EM_SPU        23    /* Cell BE SPU */
                              #define EM_SH        42    /* SuperH */
                              #define EM_SPARCV9    43    /* SPARC v9 64-bit */
                              #define EM_IA_64    50    /* HP/Intel IA-64 */
                              #define EM_X86_64    62    /* AMD x86-64 */
                              #define EM_S390        22    /* IBM S/390 */
                              #define EM_CRIS        76    /* Axis Communications 32-bit embedded processor */
                              #define EM_V850        87    /* NEC v850 */
                              #define EM_M32R        88    /* Renesas M32R */
                              #define EM_H8_300    46    /* Renesas H8/300,300H,H8S */
                              #define EM_MN10300    89    /* Panasonic/MEI MN10300, AM33 */
                              #define EM_BLACKFIN     106     /* ADI Blackfin Processor */
                              #define EM_FRV        0x5441    /* Fujitsu FR-V */
                              #define EM_AVR32    0x18ad    /* Atmel AVR32 */

《未完---待续!!!》
                              

原创粉丝点击