首页 | Linux 基础 | 资讯动态 | Linux 应用 | Linux 服务器 | Linux 开发 | Linux 安全 | 专题 | 联盟论坛
  当前位置:主页>Linux 开发>linux 内核>文章内容
Linux系统内核研究之可执行文件格式
来源:http://www.unix5.com 作者:riechelr_hl 发布时间:2007-07-06  

我们知道Linux环境下不是所有的二进制文件都有相同的格式,Linux系统使用二进制文件的处理程序来实现对不同二进制格式文件的分别处理。二进制处理程序通过内嵌在文件开头的“特征序列”(一个特殊的字节序列)来识别文件,有时也会通过文件名的一些特征,例如ELF文件以’E’’L’’F’字符开头,Java文件以0xcafebabe开始前四个字节。

Linux用sys_execve装入可执行二进制文件。

1.当前Linux版本(2.2)提供以下几种二进制文件处理程序:

• a.out:主要时为了和以前兼容,因为a.out很难实现动态链接,以被ELF所取。

• ELF:现在主流的Linux二进制文件。尽管如此,她一样要和其他格式一样需要使用二进制处理程序。

• EM86:主要作用是在Alpha的主机上运行Intel的Linux二进制文件,仿佛他们就是Alpha的本地二进制文件。

• Java:通过以.class文件的文件名为参数,处理程序返回执行字节码的解释程序。

• Misc:最明智的二进制处理程序的方法。她通过内嵌的特征数字或文件名后缀识别二进制格式。另外她可以运行期配置,而不是只能在编译期配置,这样,你就可以在增加新二进制格式文件的支持而不用重新编译内核。有说把用她取代Java和EM86二进制处理程序。

• 脚本:主要支持shell脚本、Perl脚本,宽松一点说,所有前面两个字符是#!的可执行文件都由她来处理。

在继续向下介绍之前,我们必须先来认识一个数据结构linux_binfmt;

 

struct linux_binfmt{
struct linux_binfmt * next;
long *use_count;
int (*load_binary)(struct linux_binprm *,struct pt_regs *regs);
int (*load_shlib)(int fd);
int (*core_dump)(long signr,struct pt_regs *regs);
};
  

在linux_binfmt中包含两个重要指向函数的指针,load_binary装入可执行代码,load_shlib装入共享库。Core_dump是个转储函数指针。

很显然,由next构成一个链表,表头则由formats指向:

 

static struct linux_binfmt *formats=(struct linux_binfmt *)NULL;

系统为每个不同的文件格式定义了一个相应的对象:

 

static struct linux_binfmt elf_format;
static struct linux_binfmt java_format;
static struct linux_binfmt em86_format;
……

linux_binfmt的链表(由formats指向)则就是由这些不同的文件格式的linux_binfmt构成的一个链表。而对不同格式二进制文件的处理程序则通过注册在相应的linux_binfmt中的函数来实行,实际这里已经使用了面向对象的思想,而这种情况在Linux的内核源码中经常可以看到。

例如对于ELF文件格式:

当使用“装入函数的指针”使,指针指向装入函数分别为:

 

load_elf_binary(struct linux_binprm *bprm,struct pt_regs *regs);
static int load_elf_library(int fd);

以上函数在中定义实现。

而相应的elf_format 被定义成:

 

static struct linux_bmfmt elf_format={
#ifndef MODULE
NULL,NULL,load_elf_binary,load_elf_library,elf_core_dump
#else
NULL,&mod_use_count,load_elf_binary,load_elf_library,
elf_core_dump()
#endif
};


共2页: 上一页 1 [2] 下一页
 
如果您对本文有任何疑问或者建议,请到论坛讨论区发表您的意见: >> 论坛入口
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
  热点文章
·使用 Linux 系统调用的内核命令
·Linux 2.6.11内核文件IO系统调用
·Linux操作系统的源代码目录树结
·Linux用户态与内核态的交互讲解
·Linux内核对I/O端口的管理实现(
·深入分析 Linux操作系统的内核链
·Linux内核可装载模块对设备驱动
·概述Linux系统的驱动框架及驱动
·详解Linux 2.6内核新文件系统变
·Linux系统可卸载内核模块完全指
·FreeBSD手册讲解(一)--配置FreeB
·编译Linux操作系统的内核讲解
  相关文章
· Linux操作系统内核指导——虚拟
·Linux操作系统的内核模块全面解
·关于Linux内核版本稳定性能测试
·Linux系统内核:修改TCP/IP调优参
·Linux内核空间保护与空间数据传
·借助异常表处理Linux内核态缺页
·编译Linux操作系统的内核讲解
·Linux内核和核心OS组件的测试与
·Linux系统内核网络参数意义以及
·Linux系统内核模块函数调用及命
·SYN Cookie原理以及在Linux系统
·浅谈解析Linux操作系统的内核空

本站信息源至:互联网络,均为学习,交流所用,如有版权问题,请联系我们.
站长QQ:397422079 E_mail:riechelr_hl@unix5.com
转载本站内容请注明原作者名.谢谢!