微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 教你轻松控制uClinux 嵌入式开发过程

教你轻松控制uClinux 嵌入式开发过程

时间:04-19 来源:互联网 点击:

  uClinux是目前比较普及的嵌入式Linux版本之一,它的功能很多,并且随着低成本、可运行uClinux的32位CPU的激增,以及 uClinux首次成为Linux 2.6内核的一部分,uClinux将更加流行(如图1)。下面讨论一下开发者使用uClinux时如何控制开发过程,以及将会遇到的与普通Linux的不同之处。

  图1 uClinux运行在Palm上

  应用无内存管理

  uClinux与普通Linux系统的主要区别就是它没有内存管理。在普通Linux下,通过使用虚拟内存(VM)来实现内存管理。虚拟内存一般是通过内存管理单元(Memory Management Unit,简称MMU)来实现,而在uClinux的世界里,经常可以看到“NOMMU”这个词。

  在有虚拟内存的情况下,所有的进程都在相同的地址空间运行,由虚拟内存系统处理虚拟内存到物理内存的映射。因此,即使进程看到的虚拟内存是连续的,它所占的物理内存也可能是分散的,有的甚至被交换到了硬盘。因为物理内存能映射到进程地址空间的任何位置,所以这种环境下能够向正在运行的进程添加内存。

  在没有虚拟内存的情况下,每个进程必须被分配到固定的内存位置。由于一个进程的上、下(内存位置)都可能有别的进程在运行,所以它通常不能动态扩展内存。这就是说,在uClinux下运行的进程不能在运行过程中动态增加可用内存,这与传统Linux下的情况有所不同。

  对于uClinux开发者来说,分配内存是一个棘手的问题,并且由于没有任何形式的内存保护,任何应用程序或内核都可能破坏系统。更为糟糕的是,无意识的误操作不会引人注意,造成要跟踪随机的、进程间的破坏非常困难。但是这些缺陷对于uClinux来说几乎不算问题,这是因为使用 uClinux的系统一般没有硬盘驱动器和足够的内存,完全没有必要做复杂的管理和交换。

 做足内存映射

  对于内核开发者,uClinux与普通Linux区别很小。惟一真正会遇到的问题是uClinux内核开发者不能利用MMU提供的分页支持,比如,依赖虚拟内存的tmpfs文件系统在uClinux下就不起作用。类似的,普通Linux下的标准可执行文件格式 uClinux都不支持,因为它们都要利用虚拟内存的特性。uClinux需要一种新的格式——Flat,它是一种压缩的可执行文件格式,只保存可执行的代码和数据,以及将可执行程序装载到内存时所需要的重定位信息。

  理解uClinux内核中内存映射的实现方式也是很有必要的,因为有些方式在uClinux系统上行不通,理解内存映射的实现后可以避免使用这些方式。uClinux要求内存映射能够直接在文件系统中指到文件,从而保证它是顺序的和连续的,否则就必须事先为文件分配好内存,并把数据拷贝到分配给它的内存块上。

  因此,uClinux下有效内存映射的用法要素非常明确:首先,当前惟一能够保证文件连续存储的文件系统是ROM文件系统(Romfs),所以必须使用Romfs来避免传统内存分配;其次,只有只读的内存映射能够被共享,也就是说,为了避免传统内存分配,映射必须是只读的。由于这些原因,uClinux下的开发者不能利用“Copy-on- Write”特性。

  要将设备驱动程序移植到uClinux环境,需要做一些修改,这并不是因为内核上的区别,而是由于与硬件细节相关部分有所不同造成的。比如,普通Linux下,SMC网络驱动程序可以支持ISA SMC卡。该驱动程序是16位的,并且一般都分配到0x3ff以下的I/O地址空间。

  但是用来支持SMC卡的非ISA嵌入式版本,驱动程序要求运行在8位、16位或32位模式下都是可能的,并且在满32位的I/O地址中,中断号一般要高于ISA的最大值16。所以,与硬件细节相关的部分可能还是要做一些移植工作。

恰当的内存分配

  uClinux除了提供跟普通Linux一样的内存分配器之外,还提供另一个可选的。普通Linux中缺省的内存分配器是使用“2的幂”的分配方法,这样可以快速找到符合要求的内存区域。不幸的是,在uClinux下这种方法可能会带来令人痛苦的结果。

  为了理解这一问题带来的结果,尤其是大的内存分配,我们举例说明。试想一个应用程序要求33KB的内存空间进行装载。如果使用“2的幂”的分配方法,就必须分配64KB(2的6次方)内存空间,多余的31KB内存空间不能被利用上。在uClinux中,这种浪费是不能接受的。为了解决这个问题,专门为 uClinux内核设计了可选的内存分配器。不同的内核版本,这个可选的内存分配器不同,一般是page_alloc2和kmalloc2。

page_alloc2能解决缺省的分配方法造成的浪费问题。虽然它也是使用“2的幂”的分配方法,但它是按页(每页4096字节,即4KB)分配的,分配的内存大小如果已经满足了要求,则只是将当前的一页分配出去,其它的就不再分配。在前面的例子中

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

网站地图

Top