您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

mClinux体系特点深入阐发

发布日期:2011-04-18


摘 要:
本文阐发了mClinux与标准Linux的紧张差别,并对mClinux步调筹划的要点举行了叙述。

关键词: mClinux;假造内存;内存掩护;文件体系

媒介
    比年来,嵌入式技能生长敏捷,mClinux以其良好的性能、免费开放的代码等长处,得到浩繁嵌入式开辟者的青睐。在标准Linux平台上,开辟者很容易得到昔人的结果作为参考,编写更得当本身的步调。
    然而,敷衍很多已经在标准Linux环境中变乱得很好的步调,并不克不及直接在mClinux环境上运行。一方面,是由于嵌入式的mClinux所利用的处理惩罚处罚器寂静凡PC差别,指令集、CPU布局上的差别导致mClinux上运行的步调须要专门为该典范处理惩罚处罚器交错编译孕育孕育产生;另一方面,mClinux是为没有内存办理单位(MMU)的嵌入式处理惩罚处罚器筹划,并做了较大幅度的精简。以是,在标准Linux上可以利用的一些函数和体系调用在mClinux上有大概就行不通了。
    因此,本文将深入探究mClinux特点,阐发mClinux上的应用步调筹划和标准Linux步调筹划存在的区别,并对mClinux步调筹划要点举行叙述。

mClinux与标准Linux
    mClinux是针对控制范畴的嵌入式Linux利用体系,它从Linux 2.0/2.4内核派生而来,相沿了主流Linux的绝大部分特性,得当不具备MMU的微处理惩罚处罚器或微控制器。有无MMU是mClinux与标准Linux的底子差别。
    标准Linux是针对有MMU的处理惩罚处罚器筹划的。在这种处理惩罚处罚器上,假造地点被送到MMU,把假造地点映射为物理地点。通过付与每个任务差别的假造-物理地点转换映射,支持差别任务之间的掩护。
    对mClinux来说,其筹划针对没有MMU的处理惩罚处罚器,不克不及利用处理惩罚处罚器的假造内存办理技能。mClinux仍旧采取存储器的分页办理,体系在启动时将实际存储器分页,在加载应用步调时分页加载。但是由于没有MMU办理,以是实际上mClinux采取实存储器办理战略。mClinux体系敷衍内存的访问是直接的,全部步调中访问的地点都是实际的物理地点。利用体系对内存空间没有掩护,各个进程实际上共享一个运行空间。一个进程在实行前,体系必须为进程分派富裕的连续地点空间,然后全部加载主存储器的连续空间中。
    同时,mClinux有着分外小的内核和用户软件空间。敷衍筹划内核或体系空间的应用步调的开辟者,要分外过细mClinux既没有内存掩护,也没有假造内存模型。别的,有些内核体系调用也有差别。
内存掩护
    没有内存掩护的利用会导致如许的结果:纵然由无特权的进程来调用一个无效指针,也会触发一个地点错误,并埋伏地引起步调瓦解,以致导致体系的挂起。显然,在如许的体系上运行的代码必须过细编程,并深入测试来确保壮实性和沉寂。
    敷衍平常的Linux来说,须要运行差别的用户步调,要是没有内存掩护将大大低沉体系的沉寂性和可靠性;然而敷衍嵌入式mClinux体系而言,由于所运行的步调通常是在出厂前已经固化的,不存在危害体系沉寂的步调侵入的隐患,因此只要应用步调颠末较完备的测试,出现标题标概率就可以控制在有限范畴内。
假造内存
    没有假造内存紧张会导致下面几个结果:
    起首,由内核所加载的进程必须可以大概独立运行,与其在内存中的位置无关。实现这一目标的第一种步调是,一旦步调被加载到RAM中,那么步调的基准地点就“牢固”下来;另一种步调是,天生只利用相对寻址的代码(PIC)。mClinux对这两种模式都支持。
    其次,要办理扁平内存模型中的内存分派和开释标题。非常动态的内存分派会导致内存碎片,并大概耗尽体系的资源。敷衍利用了动态内存分派的那些应用步调来说,增矫健实性的一种步调是,用预分派缓冲区池(Preallocated buffer pool)来代替malloc()调用。由于mClinux中倒霉用假造内存,出入内存的页面互换也没有实现,因而不克不及包管页面会被加载到RAM中的同样位置。在平常谋略机上,利用体系容许应用步调利用比物理内存(RAM)更大的内存空间,这通常是通过在硬盘上设立互换分区来实现的。但是,在嵌入式体系中,通常都用Flash存储器来代替硬盘,很难高效地实现内存页面互换的存取,因此,对运行的应用步调都限定其可分派空间不大于体系的RAM空间。
    着末,mClinux目标板处理惩罚处罚器缺乏内存办理的硬件单位,使得Linux的体系接口须要作些变革,最大的差别是没有fork()和brk()体系调用。 调用fork()将复制出进程来创建一个子进程。在Linux下,fork()利用copy-on-write页面实现。由于没有MMU,mClinux不克不及完备、可靠地复制一个进程,也没有对copy-on-write的存取。为了补充这一缺陷,mClinux实现了vfork(),当父进程调用vfork()来创建子进程时,两个进程共享它们的全部内存空间,包括堆栈。子进程要么代替父进程实行(此时父进程已经sleep)直到子进程调用exit()退出,要么调用exec()实行一个新的进程,这个时间将孕育孕育产生可实行文件的加载。纵然这个进程只是父进程的拷贝,这个进程也不克不及克制。当子进程实行exit()或exec()后,子进程利用wakeup把父进程唤醒,父进程连续往下实行。
    但是,多任务并没有受影响。较早的广泛利用fork()的网络背景步调(daemon)须要修改;由于子进程运行在和父进程同样的地点空间内,在一些环境下,也须要修改两个进程的活动。
    很多当代的步调依赖子进程来实行底子任务,使得纵然在进程负载很重时,体系仍可以保持一种“可交互”的状态,这些步调大概须要实质上的修改来在mClinux下完成同样的任务。要是一个关键的应用步调非常依赖如许的布局,那就不得差别错误它重新编写了。
    假设有一个大抵的网络背景步调(daemon),大量利用了fork()。这个daemon总监听一个着名端口(或套接字)等待网络客户端来连接。当客户端连接时,这个daemon给它一个新的连接信息(新的socket编号),并调用fork()。子进程接下来就会和客户端在新的socket上举行连接,而父进程被开释,可以连续监听新的连接。
    mClinux 既没有主动生长的堆栈,也没有brk()函数,如许,用户空间的步调必须利用mmap() 下令来分派内存。为了方便,在mClinux的C语言库中所实现的malloc()实质上便是一个mmap()。在编译时,可以指定步调的堆栈大小。
    mClinux的内核加载要领
    mClinux的内核有两种可选的运行要领:可以在Flash上直接运行,也可以加载到RAM中运行。
    Flash运行要领:把内核的可实行映像文件烧录到Flash上,体系启动时从Flash的某个地点开始逐句实行。这种要领实际上是很多嵌入式体系采取的要领。
    内核加载RAM要领:把内核的压缩文件存放在Flash上,体系启动时读取压缩文件在内存里解压,然后开始实行,这种要领相对巨大一些,但是运行速率大概更快。同时这也是标准Linux体系采取的启动要领。
    mClinux的文件体系
    mClinux体系采取ROMFS文件体系,这种文件体系相敷衍一样通常的ext2文件体系须要更少的空间。空间的节流来自于两个方面:起首内核支持ROMFS文件体系比支持ext2文件体系须要更少的代码;其次ROMFS文件体系相对大抵,创建文件体系超等块(superblock)须要更少的存储空间。ROMFS文件体系不支持动态擦写生存,敷衍体系须要动态生存的数据采取假造RAM盘的要领举行处理惩罚处罚(RAM盘将采取ext2文件体系)。
    应用步调要是须要以文件要领互换数据,可以将它存储在/tmp目次下。这一目次实质上便是假造的RAM盘。不过在失电时,这些数据就会丢失。
要是渴望在失电时,信息仍旧可以保持,那么就要把它写到Flash中。这时,就可以利用JFFS这一文件体系,在mClinux的颁发中,文“/linux/drivers/block/flash.c”中提供的JFFS代码可以参考。
    别的,还须要修改/linux/.config和include/linux/autoconf.h中的有关内容,增长对Flash和JFFS的编译。

mClinux步调筹划要点

软件开辟东西
    可以免费得到的GCC无疑是mClinux上最佳的开辟东西。
    mClinux体系的软件开辟须要在标准Linux平台上用交错编译东西来完成。除了前面所提到的一些涉及内存和体系调用的步调之外,在x86版本的gcc编译器下编译通过的软件通常不须要做大的窜改就可以用交错编译东西编译到mClinux上运行。
    交错编译器可以从下面URL得到:http://www.mClinux.org/pub/mClinux/m68k-elf-tools/ m68k-elf-tools-20020410.tar.gz。交错编译器直接解在根目次(/)下就行了。
    tar xzf m68k-elf-tools-20020218.tar.gz
它会主动在/usr/local/下创建起整套m68k的ELF交错编译器,要编译本身的大抵C步调就可以用/usr/local/bin/m68k-elf-gcc,比喻,源代码为test.c,那么可以如许编译:/usr/local/bin/m68k-elf-gcc -Wall -elf2flt -m5307 test.c -lc -o test.out
参数“-Wall”指定孕育孕育产生全部的告诫;-elf2flt指定主动调用elf转换flat格局的东西;-m5307指定了处理惩罚处罚器的指令集;-lc指定了链接信息(ld);-o指定输出文件的名字。
编译告成后得到的test.out就可以在mClinux环境上运行。通过GDB可以调试目标板,Coldfire处理惩罚处罚器可以通过Motorola的BDM作为调试接口,可以在不滋扰步调正常运行的环境下调试目标板上的内核。要是处理惩罚处罚器不支持,那么在内核中须要插桩(stub),GDB和stub通过串行口大概以太网通讯。

可实行文件格局

先表明几种可实行文件格局。
coff(common object file format):一种通用的东西文件格局;
elf(excutive linked file):一种为Linux体系所采取的通用文件格局,支持动态连接和重定位;
flat:扁平格局。elf格局有很大的文件头,flat格局对文件头和一些段信息做了简化,可实行步调小。
mClinux体系如今支持flat和elf两种可实行文件格局。
mClinux的应用步调库
mClinux小型化的另一个做法是重写了应用步调库,相敷衍越来越大且越来越全的glibc库,mClibc对libc做了精简。
mClinux对用户步调采取静态链接的情势,这种做法会使应用步调变大,但是基于内存办理的标题,也便是基于没有MMU的特性,只能如许做,同时这种做法也更靠近于通常嵌入式体系的做法。
mClibc提供大多数的类UNIX的C步调调用。要是应用步调须要用到mClibc中没有提供的函数,这些函数可以加到mClibc中、大概作为一个独立的库、大概加到应用步调上面来举行链接。

结语
    本文针对mClinux的特点,深入阐发了其内存办理、多线程实现、内核加载、文件体系等技能,同时也对mClinux应用步调筹划要点作了叙述。

参考文献
    1邹思轶·嵌入式Linux筹划与应用·清华大学出版社·2002.1
    2 www.mClinux.org