基于μCLinux嵌入式内存管理内核的分析

2009-08-19 09:01李欣颖曹晓燕
中国新技术新产品 2009年15期

周 岩 李欣颖 曹晓燕

摘要:随着数字信息技术和网络技术的高速发展,嵌入式产业迅速崛起,嵌入式系统蕴含着巨大的市场商机。本文对当前嵌入式uClinux操作系统的内存管理进行了分析和研究,为以后改进uClinux的内核做了铺垫,使其能够在实时领域有较好的应用。

关键词:Clinux;嵌入式实时操作系统:内存管理

1嵌入式操作系统概述

随着基于 Intel微处理器芯片的兼容PC机性价比的不断提高,在实时应用领域,实时系统的应用需求发生了很大

的变化,现代的实时应用往往要求大容量的数据处理能力、复杂的图形用户接口、网络支持等。这就对实时操作系统提出了更高的要求。

Linux操作系统是基于PC机的免费的类UNIX开放式操作系统,并采用了源代码开放的发布策略。由于全世界各地的Linux用户和开发者的不断努力,Linux已成长为高稳定性的、性能优异的操作系统,基于Linux开发一个开放的、标准的、高效廉价的实时操作系统是完全可行的。

2 uClinux嵌入式实时操作系统概述

Linux是一种很受欢迎的操作系统,它与UNIX系统兼容,开放源代码。它原本被设计为桌面系统,现在广泛应用于服务器领域。而更大的影响在于它正逐渐的应用于嵌入式设备。uClinux正是在这种氛围下产生的。在uClinux这个英文单词中u表示Micro,小的意思,C表示Control,控制的意思,所以uClinux就是Micro-Control-Linux,字面上的理解就是“针对微控制领域而设计的Linux系统”。

嵌入式操作系统是嵌入式系统的灵魂,而且在同一个硬件平台上可以嵌入不同的嵌入式操作系统,嵌入式uClinux操作系统主要由三个基本部分组成:引导程序、uClinux内核(由内存管理、进程管理和中断处理等构成)和文件系统。uClinux可以通过定制使内核小型化,还可以加上GUI(图形用户界面)和定制应用程序,并将其放在ROM、 RAM、 FLASH或Disk On Chip中启动。由于嵌入式uClinux操作系统的内核定制高度灵活性,开发者可以按需进行配置,来满足实际应用要求,又由于uClinux是源代码公开,因此开发人员完全可以了解内核原理,并自己开发部分应用软件。只有很好地掌握uClinux的原理,才能更好地、更合理地完成移植工作。

uClinux是专为没有MMU的微处理器设计的嵌入式Linux操作系统,它的内核功能结构与Linux基本相同,不同的主要是对内存管理和进程管理进行了改写,以满足无MMU处理器的要求。另外,由于大多数内核源代码都被重写,uClinux的内核要比原Linux 2.0内核小的多,但保留了Linux操作系统的主要优点:稳定性、优异的网络能力以及优秀的文件系统支持。

3 uClinux内存管理所采用的技术

对于uClinux来说,其设计针对没有MMU的处理器,即uClinux不能使用处理器的虚拟内存管理技术。但是为了便于管理,uClinux仍然采用存储器的分页管理,系统在启动时对实际存储器进行分页,在加载应用程序时分页加载。但是由于没有MMU管理,所以实际上uClinux采用实存储器管理策略。

uClinux将整个物理内存划分成大小4KB的页面,由数据结构page管理,每个页面有一个page结构,所有page结构组成一个数组mem_map[]。这些物理页面可以为代码、数据、堆栈、文件等提供空间,也可以当作缓冲区。

uClinux仍然使用标准Linux内核中的变形Buddy机制来管理空闲的物理页面,bitmap表、free_area数组及其相关的函数或宏_get free_pages(),free_pages()也还在被使用。但由于没有虚拟内存管理,虚拟内存段结构vm_area_struct以及由它构成的链表和AVL树都不再使用,将页面换出到外存中的机制因而也不能使用,所以标准Linux中的kswapd页面换出守护进程和交换空间的页面管理数据结构在uClinux中都被删除。

uClinux中的内存分配,还是通过传统的函数kmallocQ和kfreeQ实现的。这些内存块来自于free_ area数组,由blocksize表、size表、pagewe descriptor结构和block header结构共同管理。而标准Linux中的vmalloc( )和vfree( ),由于是从虚拟空间3GB以上的虚拟空间分配内存,所以在uClinux下对它们的实现只是简单地调用kmalloc()和kfree(),实际上分配的也是从空闲物理页面链表中获得的页面。

4 uClinux内存管理的局限性

由于缺少了MMU的硬件支持,uClinux运行真正的多任务系统时,任务之间没有内存保护机制,一些有关进程派生的系统调用就无法实现。正是因为没有内存保护机制(或者说,没有任何安全性可言),它们不适用于多用户系统,uClinux的多任务管理功能受到一定限制:

uClinux中无法实现fork(),而只能使用vfork()。但这并不意味着uClinux不具有多任务功能,只是父进程在调用vfork()之后必须在子进程调用exec()或者exit()之前阻塞。

标准Linux中内存分段为应用程序提供了接近无限的堆空间和栈空间,而uClinux为可执行程序在紧随它的数据段结束处分配堆栈空间,这样如果堆栈增长太大,它将可能覆盖其它的程序或数据。

uClinux中没有自动扩展的栈,也没有brk()调用,用户必须通过使用mmap()来分配内存空间,可以在程序的编译过程中指定它所使用的栈的大小。不具有内存保护,任何程序都有可能导致内核崩溃。

参考文献

[1] Free Software Foundation,Inc.1999. GM! Lesser General Public License.http://www. gnu. org/copyleft/lesser. html.2002. 9.

[2] Gcc-2. 95. 3 arm-elf for uClinux.gcc-2. 95. 3. pdf. 2002. 11.

[3] 李善平,刘文峰,李程远,等.Linux 内核2. 4 版源代码分析大全[M].北京:机械工业出版社,2002.

[4] 赵炯.Linux内核完全注释.机械工业出版社,2005.

[5] 吴一民.RT-Linux的实时机制分析.计算机应用,2002, 22 (12):110-112.

[6] 魏忠,蔡勇.嵌入式开发详解.北京:电子工业出版社,2003.

作者简介:周岩(1982-),硕士研究生,助教,工作单位:长春工业大学软件职业技术学院,主要研究方向:软件工程、嵌入式系统开发。

李欣颖(1981-),硕士研究生,助教,工作单位:长春工业大学软件职业技术学院,主要研究方向:软件工程、网络编程.

曹晓燕(1977-),硕士研究生,助教,工作单位:长春工业大学软件职业技术学院,主要研究方向:数据库.