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 */
内核模块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 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 */
《未完---待续!!!》
- linux内核之-----内核模块文件格式
- Linux内核之模块
- linux内核模块开发之内核兼容
- Linux之内核模块编程
- Linux内核学习之二:内核模块开发
- Linux v2.6内核编程之内核模块预备知识
- linux 内核模块编程之内核符号导出(五)
- linux内核模块开发之Hello world
- Linux 内核模块之hello world
- 小白学Linux之内核模块编程
- 小白学Linux之内核模块编程
- Linux内核模块之——THIS_MODULE
- Linux 2.6内核驱动之hello模块
- 小白学Linux之内核模块编程
- Linux内核模块编程之Helloworld!
- Linux内核模块编程之helloworld
- Linux内核模块驱动之---led驱动
- 小白学Linux之内核模块编程 .
- UEeditor之util.js 学习总结
- debian下创建新用户命令
- java集合类总结
- C#字符串前段@符号
- Love or Money?---Chapter 7
- linux内核之-----内核模块文件格式
- .NET 连接 SAP for NCO 3.0 (二)
- 快速排序思想的利用
- JAVA多线程单例模式及死锁
- 周鸿祎谈产品:像怀胎一样怀产品,要厚着脸皮听批评
- 内核驱动之ioctl接口的实现
- vs2008 中查看类关系视图
- 为什么人们对单身的人那么苛刻?
- SQL中如何把A表的字段数据更新到B表的字段