Chinaunix首页 | 论坛 | 博客
  • 博客访问: 384721
  • 博文数量: 73
  • 博客积分: 2620
  • 博客等级: 少校
  • 技术积分: 1212
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-09 10:47
文章分类
文章存档

2011年(18)

2010年(50)

2009年(5)

我的朋友

分类: LINUX

2010-06-25 18:30:53

转载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) |
给主人留下些什么吧!~~