免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
打印 上一主题 下一主题

临时变量,static,malloc分别申请在哪里? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2005-04-13 21:31 |只看该作者

临时变量,static,malloc分别申请在哪里?

是啊,不过我最近打算走出绿盟感受一下外面的世界

论坛徽章:
0
12 [报告]
发表于 2005-04-14 01:35 |只看该作者

临时变量,static,malloc分别申请在哪里?

原帖由 "albcamus" 发表:


商榷一下。我觉得这样:

1,在所有函数之外的变量,在静态区,即data段;
2,所有static,在data中;
3,函数中的自动变量,在栈,即stack中;
4,malloc来的,在堆,即heap中。

怎样定义“动态”二字?这是..........


补充一下, 与大家讨论.

如ayazero所说, OS中描述的Process Image段和CPU芯片用的段寻址并不是同一概念. 这里的段是一块连续地址, 并有特定的属性. 比如在LINUX上,
>;cat /proc/pid/maps

address                     perms offset  dev   inode      pathname
08048000-08056000 r-xp 00000000 03:0c 64593      /usr/sbin/gpm
08056000-08058000 rwxp 0000d000 03:0c64593      /usr/sbin/gpm
08058000-0805b000 rw-p 00000000 00:00 0

这里显示了程序gpm的三段内存. 第一段是TEXT, 第二段是DATA, 第三段是HEAP. 还有STACK段没有显示.

可以看出, TEXT段可读/执行, 但不能写; DATA段可读/写/执行; HEAP可读/写, 但不能执行. STACK应可读/写, 不知能否执行. 谁可以证实一下.

TEXT和DATA段有磁盘文件支持. 文件inode是64593, 文件路径是/usr/sbin/gpm.(也可以, find /usr -inum 64593). HEAP段还没有磁盘文件支持, 但是当有heap page被page out后, 应该有swap磁盘文件支持. 谁可以证实一下?

全局变量与static变量都在DATA段. 它们的生命与进程一样长短. 而且地址相对MODEUL是不变的. 当然其绝顶地址因MODULE每次装载地址不同而不同. static变量对COMPILER来说有特定的SCOPE.不管是函数,文件,还是类SCOPE, 程序只能在SCOPE之内读写static变量. 这是由COMPILER强制的. 但是因为static变量在DATA段,只要我知道它的地址,我可以直接读写该地址,从而在SCOPE之外读写static变量. 这也是DEBUGGER能在调试进程的任何时候读写static变量和全局变量.

malloc得到的变量自然在HEAP段. 临时变量在STACK段. 它们基本上是维一能伸缩的段. HEAP向上增, STACK向下增. 有意思的是多个HEAP. 比如mmap创建的段.不同的是, 这些段大都不能伸缩(WIN_TEL是例外). 且与主HEAP不连续, 否则主HEAP没法延伸.

论坛徽章:
0
13 [报告]
发表于 2005-04-14 09:11 |只看该作者

临时变量,static,malloc分别申请在哪里?

再补充一点,就是进程间的地址空间不重叠,A进程和B进程的地址空间各自独立。除非IPC的shm和mmap,或者他们都用同一个共享库。

共享库是映射到heap与stack之间的那地方的,代码本身可被多个进程共享,然而共享库的全局数据,被各个进程加载到自己的stack中。因此,绝对不可能出现进程需要保护自己的数据以防止被别的进程修改这种情形。

论坛徽章:
0
14 [报告]
发表于 2005-04-14 09:15 |只看该作者

临时变量,static,malloc分别申请在哪里?

原帖由 "albcamus" 发表:


商榷一下。我觉得这样:

1,在所有函数之外的变量,在静态区,即data段;
2,所有static,在data中;
3,函数中的自动变量,在栈,即stack中;
4,malloc来的,在堆,即heap中。

怎样定义“动态”二字?这是..........


我觉得对于所有函数之外的变量应该做一下区分,比如数组,初始化的和未初始化的,所在的空间是不同的

论坛徽章:
0
15 [报告]
发表于 2005-04-14 09:31 |只看该作者

临时变量,static,malloc分别申请在哪里?

stack是特殊的数据段,理论上应该是不可执行的,但这里有个玄机:

以intel x86为例,用户态数据段和代码段的虚拟地址都是0~3GB,是完全重叠的,所以是可执行的,也是缓冲区和环境变量中shellcode可以被执行的原因

论坛徽章:
0
16 [报告]
发表于 2005-04-14 09:37 |只看该作者

临时变量,static,malloc分别申请在哪里?

>;>;我觉得对于所有函数之外的变量应该做一下区分,比如数组,初始化的和未初始化的,所在的空间是不同的

数组应该没区别吧?data和bss确实应该区分一下,不过主要是磁盘文件中的区分,而虚存空间中的就不是很明显了。

论坛徽章:
0
17 [报告]
发表于 2005-04-14 20:29 |只看该作者

临时变量,static,malloc分别申请在哪里?

对于static和global变量放在data段里应该没有什么疑问,local变量放在stack里也没有什么疑问,但是对于heap(堆)的malloc数据一直不怎么明白。heap到底处于进程中的哪部分空间?

曾经有个static变量,我误以为是malloc的,用了free,程序没有出错,但是当你再调用malloc时程序出现了段错误。从这个经验来看定义static变量区域的数据段是不能动态连到heap区的,因此它们之间有明显的不同之处导致内存管理在这里进行了地址检查

哪位兄弟可以帮我解释一下

论坛徽章:
0
18 [报告]
发表于 2005-04-14 21:38 |只看该作者

临时变量,static,malloc分别申请在哪里?

使用C 语言或汇编语言编写的内容最终可以分为三个区域
CODE section 存储程序代码和ROM数据
DATA section 存储带初始值的读写数据
BSS section 存储没有初始值的数据
例如:
int a; <- 存放在BSS 段
int b=1; <- 存放在DATA段
const int c=2; <- 存放在CODE 段
main() <- 程序代码存放在CODE 段
{
a = b =c;
}
因为DATA 段一般存放在ROM 中,所以在程序启动时需要将其扩展到RAM中进行操
作。

书上找的, 不知道对不

论坛徽章:
0
19 [报告]
发表于 2005-04-14 22:04 |只看该作者

临时变量,static,malloc分别申请在哪里?

关注中

论坛徽章:
0
20 [报告]
发表于 2005-04-15 01:37 |只看该作者

临时变量,static,malloc分别申请在哪里?

原帖由 "albcamus" 发表:
再补充一点,就是进程间的地址空间不重叠,A进程和B进程的地址空间各自独立。除非IPC的shm和mmap,或者他们都用同一个共享库。

共享库是映射到heap与stack之间的那地方的,代码本身可被多个进程共享,然而共享库?.........


加一点个人观点, 完全同意A进程和B进程的地址空间各自独立.
正是因为这样, 不同进程shm/mmap产生的也往往是不同的地址, 当然这个系统库函数有一参数是指定map地址,但不保证函数调用成功, 比如指定的地址可能已经被占用了.
关于共享库, 不同OS会把它们放在不同的地方. 比如LINUX x86_64,
                                    ...
0x80000000000 - up   Dynamic segments
                                    Stack segment
                                    ...
                                    ...
                                    Data segments
                                    ...
0x400000 -up              Text segments
0x0 - up                       Unmapped
在比如AIX64,
0x0000                                      System call tables, kernel
0x0000000010000000              sys reserve
0x0000000030000000              shmat/mmap
0x0000000100000000              Application text/data/bss/heap
0x7000000000000000             Default app shmat/mmap
0x9000000000000000             Shared lib text and per-process shared lib data
...

共享库的全局数据不会在STACK上, 它们自己有DATA段. 看/proc/pid/maps里libc的DATA段就很清楚了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP