uClinux将整个物理内存划分成为4 KB的页面。由数据结构page管理,有多少页面就有多少page结构,它们又作为元素组成数组men_map[]。物理页面可作为进程代码、数据和堆栈的一部分,还可存储装入的文件,也可作缓冲区。
uClinux用标准Linux内核变型BuddySystem机制管理空闲物理页面。
3.2 内存丢失原因
由于uClinux提供了跟普通Linux一样的内存分配器,普通Linux中缺省的内存分配器是使用“2的幂”的分配方法,这样可以快速找到符合要求的内存区域。在系统开发过程初期,采用的就是“2的幂”的分配方法。如果一个应用程序要求(X)KB内存空间进行装载,则实际使用占用的内存空间大小为Y=2m(Y≥X)。试想一个65 KB应用程序,如果按照“2的幂”的分配方法,就必须分配128 KB(2的7次方)的内存空间,这样就有63 KB的内存空间不能被利用上。这对于小内存的嵌入式系统来说是相当大的浪费。
多支点触发系统运行时,嵌入式操作系统uClinux使用“2的幂”的内存分配方法,大多数情况下都能正常工作。但在不断反复测试中,偶尔会出现上述页面出错问题。错误的原因是不能获得足够的内存加载程序。通过调试终端,用free命令查看系统内存分配情况如表1所列。

由表1可以看出,空闲的内存空间还有1560 KB,而应用程序所需的内存空间为400多KB,但是内核认为并没有足够的内存空间用来加载程序。例如一个系统内存大小为1 MB,有400KB的空闲内存,为了装载一个应用程序需要分配100 KB的空间。大家可能觉得这个需要肯定能得到满足,然而,由于uClinux必须给应用程序分配连续内存空间的特性,所以必须有100KB连续的内存空间才能满足这个需要。而当系统内存分配如图3所示时,最大的连续内存块的大小只有80 KB,这样是没有办法分配给这个应用程序的。这就是系统中页面访问出错的问题所在,虽然有足够的空闲内存空间,但是没有应用程序所需的连续内存空间。

这就是内存丢失问题。虽然系统会显示大量的可用内存,但是应用程序却不能得到。