关于内存分配

lysliberty 2004-07-07 04:29:49
用malloc分配了一块内存,获得该内存的起始地址为addr1=0x40007008
然后调用sbrk(0)获得堆顶的地址为:addr2=0x8053580。
由于动态内存在堆里分配,所以addr1应该小于addr2。
但是显然程序运行的结果是addr1>addr2!
这是怎么回事呀?
...全文
155 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lysliberty 2004-07-10
  • 打赏
  • 举报
回复
ding
lysliberty 2004-07-10
  • 打赏
  • 举报
回复
ok, 下午看了一下源代码,终于知道为什么拉!
实际上,一个进程的内存空间分为


未映射区域



数据段

代码段

当分配小的内存段时,确实是在堆中分配
函数调用过程为:
malloc--->sys_brk()--->do_mmap()

但是,当分配大的内存段时(比一个页还大),就会直接调用do_mmap()在未映射区域中分配.可能是出于内存管理的需要吧.

多谢各位的关注!
yanedanny 2004-07-10
  • 打赏
  • 举报
回复
关注中。
lysliberty 2004-07-09
  • 打赏
  • 举报
回复
那楼上的是什么意思?
对每个进程来讲,堆栈只有一个呀!
lysliberty 2004-07-09
  • 打赏
  • 举报
回复
08048000-08049000 r-xp 00000000 03:07 32372 /home/liberty/test
08049000-0804a000 rw-p 00000000 03:07 32372 /home/liberty/test
0804a000-0804b000 rwxp 00000000 00:00 0
40000000-40015000 r-xp 00000000 03:05 600290 /lib/ld-2.3.2.so
40015000-40016000 rw-p 00014000 03:05 600290 /lib/ld-2.3.2.so
40016000-4007a000 rw-p 00000000 00:00 0
42000000-4212e000 r-xp 00000000 03:05 957218 /lib/tls/libc-2.3.2.so
4212e000-42131000 rw-p 0012e000 03:05 957218 /lib/tls/libc-2.3.2.so
42131000-42133000 rw-p 00000000 00:00 0
bfffe000-c0000000 rwxp fffff000 00:00 0
这是我上面这个程序的maps文件.

lu_zi 2004-07-09
  • 打赏
  • 举报
回复
我个人认为不能这么说,要看操作系统的具体实现吧,单对一个堆或者栈来说你说的是成立的
CoolQ 2004-07-09
  • 打赏
  • 举报
回复
那就不知道了,你从源代码那里找答案吧
lysliberty 2004-07-09
  • 打赏
  • 举报
回复
ok!
但是动态内存总该在堆里分配吧?
还有,如果将
A=(char *)malloc(400000);
改为:
A=(char *)malloc(4000);
就不会出现上述问题,也就是说只有在分配大块内存的时候,才会出现这种情况。
CoolQ 2004-07-09
  • 打赏
  • 举报
回复
40016000-4007a000 rw-p 00000000 00:00 0真是很奇怪的一个段,不知道为什么在
40000000-40015000 r-xp 00000000 03:05 600290 /lib/ld-2.3.2.so
40015000-40016000 rw-p 00014000 03:05 600290 /lib/ld-2.3.2.so

42000000-4212e000 r-xp 00000000 03:05 957218 /lib/tls/libc-2.3.2.so
4212e000-42131000 rw-p 0012e000 03:05 957218 /lib/tls/libc-2.3.2.so
之间?难道是静态编译的问题?
要不你还是看看glibc的malloc的源代码吧, 我印象中好像malloc也是调用的sbrk和brk来实现的呀
CoolQ 2004-07-08
  • 打赏
  • 举报
回复
addr1=0x40007008是怎么来的?
怎么感觉像是动态链接库的映射地址?
CoolQ 2004-07-08
  • 打赏
  • 举报
回复
你hook了?做不做到静态库没什么关系,连接的时候都连到你的代码里去了,你最好把代码弄出来看看。
wfu 2004-07-08
  • 打赏
  • 举报
回复
mark!
CoolQ 2004-07-08
  • 打赏
  • 举报
回复
那你把你的/proc/$you_pid/maps文件贴出来看看?
lysliberty 2004-07-08
  • 打赏
  • 举报
回复
原程序比较大, 下面这段代码同样可以说明问题:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main()
{
char *A;
A=(char *)malloc(400000);
printf("the address of A: %p\n",A);
printf("the address of sbrk: %p\n", (char *)sbrk(0));
free(A);
}


其最终的输出结果为:
the address of A: 0x40017008
the address of sbrk: 0x804b000




}
lysliberty 2004-07-08
  • 打赏
  • 举报
回复
sorry,表述不准确.

addr1应该是0x40017008,就是用malloc分配的.
注意: malloc不是标准库的那个,已经用hook改写过,并做到我自己的一个静态库里面了.
lysliberty 2004-07-07
  • 打赏
  • 举报
回复
各位大侠,帮帮忙呀!
lysliberty 2004-07-07
  • 打赏
  • 举报
回复
ding

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧