微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 关于uclinux系统分析

关于uclinux系统分析

时间:08-28 来源:互联网 点击:

论),由于应用程序的ld文件给出的内存空间与应用程序实际被加载的内存位置可能不同,这样在应用程序加载的过程中需要一个重新地位的过程,即对reloc段进行修正,使得程序进行间接寻址时不至于出错。(这个问题在i386等高级处理器上方法有所不同,本文将在后面进一步分析)。

由上述讨论,至少需要两套编译连接工具。在讨论过uClinux的内存管理后本文将给出整个系统的工作流程以及系统在flash和ram中的空间分布。

可执行文件格式

先对一些名词作一些说明:

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本身并没有关注实时问题,它并不是为了Linux的实时性而提出的。另外有一种Linux--Rt-linux关注实时问题。Rt-linux执行管理器把普通 Linux 的内核当成一个任务运行,同时还管理了实时进程。而非实时进程则交给普通Linux内核处理。这种方法已经应用于很多的操作系统用于增强操作系统的实时性,包括一些商用版UNIX系统,Windows NT等等。这种方法优点之一是实现简单,且实时性能容易检验。优点之二是由于非实时进程运行于标准Linux系统,同其它Linux商用版本之间保持了很大的兼容性。优点之三是可以支持硬实时时钟的应用。uClinux可以使用Rt-linux的patch,从而增强uClinux的实时性,使得uClinux可以应用于工业控制、进程控制等一些实时要求较高的应用。

uClinux的内存管理

应该说uClinux同标准Linux的最大区别就在于内存管理,同时也由于uClinux的内存管理引发了一些标准Linux所不会出现的问题。本文将把uClinux内存管理同标准Linux的那内存管理部分进行比较分析。

1、标准Linux使用的虚拟存储器技术

标准Linux使用虚拟存储器技术,这种技术用于提供比计算机系统中实际使用的物理内存大得多的内存空间。使用者将感觉到好像程序可以使用非常大的内存空间,从而使得编程人员在写程序时不用考虑计算机中的物理内存的实际容量。

为了支持虚拟存储管理器的管理,Linux系统采用分页(paging)的方式来载入进程。所谓分页既是把实际的存储器分割为相同大小的段,例如每个段1024个字节,这样1024个字节大小的段便称为一个页面(page)。

虚拟存储器由存储器管理机制及一个大容量的快速硬盘存储器支持。它的实现基于局部性原理,当一个程序在运行之前,没有必要全部装入内存,而是仅将那些当前要运行的那些部分页面或段装入内存运行(copy-on-wr

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top