加入收藏
|
设为首页
|
会员中心
|
RSS
首页
开源资讯
Linux技术
硬件产品
编程开发
下载中心
网上商城
人才中心
开源论坛
BLOG
登陆
|
注册
|
修改资料
|
短信息
|
设置空间
|
管理信息
|
收藏夹
|
我的状态
|
消费记录
|
充值卡充值
|
我的购物车
|
我的订单
|
退出
|
|
绿色计算
|
新手入门
|
系统管理
|
网络管理
|
桌面应用
|
编程开发
|
网络安全
|
高性能集群
|
Linux嵌入式
|
|
技术文章
|
SUN 系列
|
IBM 系列
|
HP 系列
|
曙光 系列
|
浪潮 系列
|
方正 系列
|
戴尔 系列
|
|
数据库
|
PHP
|
JSP
|
HTML
|
CSS
|
javascript
|
JAVA
|
|
系统软件
|
网络工具
|
安全相关
|
媒体工具
|
OURLPI群专区
|
|
5Th Rack
|
CentOS
|
应用软件
|
|
|
您当前的位置:
首页
>
Linux技术
>
Linux嵌入式
uClinux小型化的做法-可执行文件格式
时间:2008-08-11 09:45:41 来源:
互联网
作者:
先对一些名词作一些说明:
coff(common object file format):一种通用的对象文件格式
elf(excutive linked file):一种为Linux系统所采用的通用文件格式,支持动态连接
flat:elf格式有很大的文件头,flat文件对文件头和一些段信息做了简化
uClinux系统使用flat可执行文件格式,gcc的编译器不能直接形成这种文件格式,但是可以形成coff或elf格式的可执行文件,这两种文件需要coff2flt或elf2flt工具进行格式转化,形成flat文件。
当用户执行一个应用时,内核的执行文件加载器将对flat文件进行进一步处理,主要是对reloc段进行修正(可执行文件加载器的详见fs/binfmt_flat.c)。以下对reloc段进一步讨论。
需要reloc段的根本原因是,程序在连接时连接器所假定的程序运行空间与实际程序加载到的内存空间不同。假如有这样一条指令:
jsr app_start;
这一条指令采用直接寻址,跳转到app_start地址处执行,连接程序将在编译完成是计算出app_start的实际地址(设若实际地址为0x10000),这个实际地址是根据ld文件计算出来(因为连接器假定该程序将被加载到由ld文件指明的内存空间)。但实际上由于内存分配的关系,操作系统在加载时无法保证程序将按ld文件加载。这时如果程序仍然跳转到绝对地址0x10000处执行,通常情况这是不正确的。一个解决办法是增加一个存储空间,用于存储app_start的实际地址,设若使用变量addr表示这个存储空间。则以上这句程序将改为:
movl addr, a0;
jsr (a0);
增加的变量addr将在数据段中占用一个4字节的空间,连接器将app_start的绝对地址存储到该变量。在可执行文件加载时,可执行文件加载器根据程序将要加载的内存空间计算出app_start在内存中的实际位置,写入addr变量。系统在实际处理是不需要知道这个变量的确切存储位置(也不可能知道),系统只要对整个reloc段进行处理就可以了(reloc段有标识,系统可以读出来)。处理很简单只需要对reloc段中存储的值统一加上一个偏置(如果加载的空间比预想的要靠前,实际上是减去一个偏移量)。偏置由实际的物理地址起始值同ld文件指定的地址起始值相减计算出。
这种reloc的方式部分是由uClinux的内存分配问题引起的,这一点将在uClinux内存管理分析时说明。
来顶一下
返回首页
发表评论
共有
条评论
用户名:
密码:
验证码:
匿名发表
推荐资讯
相关文章
uClinux在嵌入式系统中的移植研究
基于uClinux的嵌入式无线IPSec VPN网关
嵌入式操作系统uClinux和eCos的比较
uClinux启动过程详细分析(二)
uClinux 启动过程详细分析(一)
uClinux启动过程详细分析(三)
基于uClinux嵌入式系统的汽车黑匣子的设计与开发
基于uclinux 的CAN 总线嵌入式驱动编程
基于ARM uCLinux的网络控制系统设计与实现
uClinux操作系统的实时化分析与研究
栏目更新
栏目热门
站内搜索:
新闻
下载
图库
FLASH
电影
商品
文章
分类信息
高级搜索
网站首页
|
关于我们
|
服务条款
|
广告服务
|
联系我们
|
网站大全
|
免责声明
|
返回顶部
Copyright © 2007-2008 LinuxExpress, All rights reserved.
Powered by 开源快讯
京ICP备06029167号