转载4篇关于uclinux内存方面的文章
总结:
1. 全局方面
(1)uclinux仍将内存按4K大小进行划分,仍由数据结构PAGE表示,页面总数等于PAGE总数,且组成数组mem_map[]。
(2)在没有虚拟内存的情况下,每个进程必须被分配到固定的内存位置。由于一个进程的上、下(内存位置)都可能有别的进程在运行,所以它通常不能动态扩展内存。
(3)应用程序必须一次性载入。
2. 堆栈方面
(1)如图所示,栈和堆的位置和大小固定,同数据段和代码段无空隙的连接在一起,且无法像linux那样动态增加。
(2)需要在编译时指出栈空间大小,缺省值为4K,方法如上链接。
(3)堆的分配采用从内核空闲内存池中分配。
3. 内存分配接口方面
标准linux内存分配采用2的幂(power of two)方式
(1)用户接口仍为malloc,但不能实现sbrk()和brk功能。若用uClibc的话,建议app使用malloc-simple替代malloc,使用malloc最好少使用“大量小内存”的分配操作。
(2)系统调用mmap/munmap调用kmalloc从空闲内存池中分配,但每次调用会出现56字节的开销浪费。
(3)由于分配器kmalloc只能申请2K的字节,所以内核提供kmalloc2用于申请更多字节,或者使用page_alloc2进行按页2的幂分配方式,分配的内存大小如果已经满足要求,则只是将当前的一页分配出去,其它的就不再分配。便于节省内存。
(4)kmalloc2分配小于等于2页(8K字节)内存情况下,由空闲内存向低地址分配;在分配更大的内存时则由空闲内存向高地址分配。
4. 任务管理
(1)uClinux中无法实现fork()只能用vfork()。父进程在调用vfork()后必须在子进程调用exec()或者exit()前阻塞。
阅读(2666) | 评论(0) | 转发(0) |