首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>系统管理>内核技术>正文

Linux内核研究系列之可执行文件格式

http://www.oklinux.cn  2006-02-22  来源: oklinux收集整理  大长今      会员收藏  游客收藏  【 】 
我们知道linux环境下不是所有的二进制文件都有相同的格式,linux系统使用二进制文件的处理程序来实现对不同二进制格式文件的分别处理。二进制处理程序通过内嵌在文件开头的“特征序列”(一个特殊的字节序列)来识别文件,有时也会通过文件名的一些特征,例如ELF文件以'E''L''F'字符开头,java文件以0xcafebabe开始前四个字节。
Linux用sys_execve装入可执行二进制文件。
当前linux版本(2.2)提供以下几种二进制文件处理程序:
l a.out:主要时为了和以前兼容,因为a.out很难实现动态链接,以被ELF所取。
相关内容见
l ELF:现在主流的linux二进制文件。尽管如此,她一样要和其他格式一样需要
使用二进制处理程序。相关内容在
l EM86:主要作用是在Alpha的主机上运行Intel的linux二进制文件,仿佛他们就是Alpha的本地二进制文件。相关内容
l Java:通过以.class文件的文件名为参数,处理程序返回执行字节码的解释程序。相关内容见
l Misc:最明智的二进制处理程序的方法。她通过内嵌的特征数字或文件名后缀识别二进制格式。另外她可以运行期配置,而不是只能在编译期配置,这样,你就可以在增加新二进制格式文件的支持而不用重新编译内核。有说将用她取代Java和EM86二进制处理程序。详细参见
l 脚本:主要支持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
};

以此为参考我们自然也就可以想到其他文件格式的定义形式。
『注』Java的load函数为load_java,em86的load函数为load_em86,script 的load函数为load_script,他们没有提供library的load函数。

下面我们来看看关于这几个数据结构的主要操作:
l register_binfmt:主要作用使将一中二进制文件加到formats链表中。
extern int register_binfmt(struct linux_binfmt *);
l unregister_binfmt:执行与register_binfmt的反操作。
extern int unregister_binfmt(struct linux_binfmt *);
l init:对于每个不同的二进制文件格式系统都提供了一组init操作,如下:
extern int init_elf_binfmt(void);
extern int init_aout_binfmt(void);
extern int init_script_binfmt(void);
extern int init_java_binfmt(void);
extern int init_em86_binfmt(void);
extern int init_misc_binfmt(void);
以上函数在 中声明;
init函数的作用很简单,只是调用register_binfmt函数将自己的文件格式加入formats链表。
l load函数:执行二进制文件调入工作,其实质工作一般都由一个相应do_load函数来完成如:do_load_elf_binary,do_load_elf_library,do_load_java……..
l extern int prepare_binprm(struct linux_binprm *);
extern int search_binary_handler(struct linux_binprm*,struct pt_regs *);
这两个函数主要就涉及到另一个数据结构linux_binprm,她吗那就下次再说吧,到这里大家应该对linux下几种二进制文件处理程序有个大体的印象了,具体细节去看看源代码吧。
好了,这次就到这里了,该休息了

上一篇:Linux下插件开发应用案例   下一篇:Linux 编程之MD5算法研究


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·Linux下插件开发应用案例
·为Linux 应用程序编写 DLL
·Linux 编程之MD5算法研究
·LINUX动态链接库高级应用
·Linux 编程之JAVA上加密算法的实现用例
·在Linux中建立一个XML的开发环境
·Bochs 调试技术
·Linux发行版制作指南
·基于Linux系统的语音卡开发平台
·Linux常用C函数—接口处理篇
·Pthread 与 Linux
·Linux下的软件开发
·Linux 编程之GPU计算
·Linux内核编程全集1
·升级内核的一些重要体会
·Linux常用C函数—字符测试篇
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·Linux系统下内核定时器的用法
·学习园地:Linux系统内核中判断大小的
·系统编译:如何给Make命令来传递参数
·Linux 2.6内核中sysfs文件系统简单概述
·Fedora 8 Linux系统的内核配置注意事项
·升级Linux内核的一般步骤方法
·Linux发行版知识普及:三个版本的CPUID
·编译安装Virtualbox驱动模块
· Linux系统的内核解读入门
·新手学堂 Linux系统的内核解读入门
·Linux系统内核中网络参数的意义及其应
·走向Linux系统高手之路 内核编译过程解
  阅读排行
· 深入理解LINUX内核中文版下载地址
·基于S3C44B0微处理器的uClinux内核引导
·Kernel command using Linux system ca
·Linux 2.6内核如何武装Fedora Core 2
·Process priority and control on AIX
·Linux操作系统的内核编译内幕详解
·推荐:Linux用户态与内核态的交互
·通过振动向Linux ThinkPad传输信息
·Linux操作系统源代码详细分析(二)
·Linux系统内核接收以太帧的处理程序
·Linux and symmetric multiprocessing
·主流嵌入式Linux系统下GUI解决方案
·揭秘Linux内核调试器之内幕
·用命令行加挂Linux的文件系统简介
·Linux内核和核心OS组件的测试与分析
网摘收藏: