免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 644 | 回复: 0
打印 上一主题 下一主题

linux 内存模型 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-19 19:08 |只看该作者 |倒序浏览

Linux的内存模型,一般为:
地址                  作用                      说明

>=0xc000 0000         内核虚拟存储器            用户代码不可见区域

=0x4000 0000         文件映射区
  
=0x0804 8000        .init、.text、.rodata(只读段)    从可执行文件中加载

int main(int argc, char* argv[])
{
    int  first = 0;
    int* p0 = malloc(1024);
    int* p1 = malloc(1024 * 1024);
    int* p2 = malloc(512 * 1024 * 1024 );
    int* p3 = malloc(1024 * 1024 * 1024 );
    printf("main=%p print=%p\n", main, printf);
    printf("first=%p\n", &first);
    printf("p0=%p p1=%p p2=%p p3=%p\n", p0, p1, p2, p3);
    getchar();
    return 0;
}

运行后,输出结果为:
main=0x8048404 print=0x8048324
first=0xbfcd1264
p0=0x9253008 p1=0xb7ec0008 p2=0x97ebf008 p3=0x57ebe008
l         main和print两个函数是代码段(.text)的,其地址符合表一的描述。
l         first是第一个临时变量,由于在first之前还有一些环境变量,它的值并非0xbfffffff,而是0xbfcd1264,这是正常的。
l         p0是在堆中分配的,其地址小于0x4000 0000,这也是正常的。
l         但p1和p2也是在堆中分配的,而其地址竟大于0x4000 0000,与表一描述不符。
原因在于:运行时堆的位置与内存管理算法相关,也就是与malloc的实现相关。关于内存管理算法的问题,我们在后继文章中有详细描述,这里只作简要说明。在glibc实现的内存管理算法中,Malloc小块内存是在小于0x4000 0000的内存中分配的,通过brk/sbrk不断向上扩展,而分配大块内存,malloc直接通过系统调用mmap实现,分配得到的地址在文件映射区,所以其地址大于0x4000 0000。
从maps文件中可以清楚的看到一点:
00514000-00515000 r-xp 00514000 00:00 0
00624000-0063e000 r-xp 00000000 03:01 718192     /lib/ld-2.3.5.so
0063e000-0063f000 r-xp 00019000 03:01 718192     /lib/ld-2.3.5.so
0063f000-00640000 rwxp 0001a000 03:01 718192     /lib/ld-2.3.5.so
00642000-00766000 r-xp 00000000 03:01 718193     /lib/libc-2.3.5.so
00766000-00768000 r-xp 00124000 03:01 718193     /lib/libc-2.3.5.so
00768000-0076a000 rwxp 00126000 03:01 718193     /lib/libc-2.3.5.so
0076a000-0076c000 rwxp 0076a000 00:00 0
08048000-08049000 r-xp 00000000 03:01 1307138    /root/test/mem/t.exe
08049000-0804a000 rw-p 00000000 03:01 1307138    /root/test/mem/t.exe
09f5d000-09f7e000 rw-p 09f5d000 00:00 0          [heap]
57e2f000-b7f35000 rw-p 57e2f000 00:00 0
b7f44000-b7f45000 rw-p b7f44000 00:00 0
bfb2f000-bfb45000 rw-p bfb2f000 00:00 0          [stack]

2.         第二是关于多线程的。
现在的应用程序,多线程的居多。表一所描述的模型无法适用于多线程环境。按表一所述,程序最多拥有上G的栈空间,事实上,在多线程情况下,能用的栈空间是非常有限的。为了说明这个问题,我们再看另外一个测试:
#include
#include

void* thread_proc(void* param)
{
    int  first = 0;
    int* p0 = malloc(1024);
    int* p1 = malloc(1024 * 1024);
    printf("(0x%x): first=%p\n",    pthread_self(), &first);
    printf("(0x%x): p0=%p p1=%p \n", pthread_self(), p0, p1);
    return 0;
}
#define N 5
int main(int argc, char* argv[])
{
    int first = 0;
    int i= 0;
    void* ret = NULL;
    pthread_t tid[N] = {0};
    printf("first=%p\n", &first);
    for(i = 0; i

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/33226/showart_500017.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP