Chinaunix

标题: 《The Desing and Implementation of the FreeBSD OS》的这句话怎么理解 [打印本页]

作者: zalem    时间: 2005-11-29 18:03
标题: 《The Desing and Implementation of the FreeBSD OS》的这句话怎么理解
在”3.5 内存管理服务“这一节,讲程序启动时初始化的部分...
       。。。
       堆栈也构建在被初始化为零的内存领域上。虽然堆栈并不需要被初始化为零,但这种早期UNIX的习惯仍被保存了下来。4.2BSD为了缩短起动时间并没有将堆栈清零而是保留了老内容。但是,考虑到这样可能恶用老程序的堆栈溢出,或可能由老程序带来的不可预见的bug,4.3BSD中再次将堆栈用零初始化。
      。。。


这段描述和这本书的4.4BSD版本中一样的,当时看老版本的时候以为是描述过时了,没在意,但是这个新版本里面还是这么说的...


  1. #include <stdio.h>

  2. int f()
  3. {
  4.         int a;
  5.         printf("f():a= [%d]\n",a);
  6.         return 0;
  7. }

  8. int main()
  9. {
  10.         int a;
  11.         printf("main():a= [%d]\n",a);
  12.         f();
  13.         return 0;
  14. }
复制代码


这段代码在FreeBSD和Linux上两个a都不会等于0,原来觉得理所当然,现在搞不懂了...
作者: zalem    时间: 2005-11-29 18:19
问题解决了...在FreeBSD1.0.2上运行了一次,确实被初始化为0了...看来还是描述老了
作者: Alligator27    时间: 2005-11-29 22:17
LZ的程序测试的是stack上的变量, 文档中说的堆栈是heap还是stack? 还是两个?
作者: zalem    时间: 2005-11-29 22:31
是说的stack,不涉及heap,这段说法已经老了,看了也要忘掉...
作者: Alligator27    时间: 2005-11-29 22:36
stack上, 是有点奇怪. FreeBSD1.0.2是用VMM吗?
作者: zalem    时间: 2005-11-29 22:42
是的,在VMware上装的。
作者: win_hate    时间: 2005-11-29 22:47
>>是的,在VMware上装的。

晕,他问的不是这个。
作者: Alligator27    时间: 2005-11-29 22:53
是这样. 有空再看看BSD吧. 公司不用它, 所以没概念.
谢谢.
作者: zalem    时间: 2005-11-29 22:53
是说Visual Memory  Management?V32就开始有么吧?
误解为typo了...
作者: Alligator27    时间: 2005-11-29 22:58


我是想问 FreeBSD1.0.2 是否用 Virtual Memory Management.

如果是, stack清零就有点怪.
作者: flw2    时间: 2005-11-30 09:41
原帖由 Alligator27 于 2005-11-29 22:58 发表


我是想问 FreeBSD1.0.2 是否用 Virtual Memory Management.

如果是, stack清零就有点怪.



为什么怪呢,能给小弟解释一下么?

那为什么堆又要清0呢?
malloc的时候堆清0好象也没有什么用啊,因为不能保证得到的存储就是原始的存储。 如果要0,还得自己去做。
作者: 雨丝风片    时间: 2005-11-30 16:42
原帖由 zalem 于 2005-11-29 18:19 发表
问题解决了...在FreeBSD1.0.2上运行了一次,确实被初始化为0了...看来还是描述老了


不要轻易下结论,,说说我的看法:

是否清0是对page来说的,你的例子并不能证明FreeBSD没有对堆栈所在页进行清0,
因为你的栈变量离main函数入口太“近”了。你可以在main函数中定义一个大数组,
然后把数组内容打印出来,你就可以看到,不是0的部分其实是相当小的。

之所以在main函数入口之后的堆栈中存在部分的非0内容,那是因为启动代码在调用
main函数之前还做了很多事情,比如一系列的函数调用,这些事情就会在堆栈上留下
印记,而main函数的入口已经是一系列的堆栈增减操作之后的位置了。只要这个入口
没有达到曾经达到的最远位置,在你可见的堆栈空间中就有可能会存在一段非0的内容。

[ 本帖最后由 雨丝风片 于 2005-11-30 16:43 编辑 ]
作者: Alligator27    时间: 2005-11-30 22:41
To flw2
之所以觉得怪, 是因为VMM不会只对stack清零.

我的理解是这样. (限于VMM).
Kernel 提供给用户进程的物理内存总是清零的. 但是程序看到的大都不是这样, 是因为heap上malloc返回的往往是该程序前面释放的内存, 而不一定是VMM刚提供的物理内存. stack上雨丝风片的看法已经很好解释Zalem看到的现象.

我很想试一试 4.2BSD, 按docment说, 她应当不清零. 可惜没机器.
作者: bennie    时间: 2005-11-30 22:47
提示: 作者被禁止或删除 内容自动屏蔽
作者: zalem    时间: 2005-11-30 23:17
原帖由 雨丝风片 于 2005-11-30 16:42 发表


不要轻易下结论,,说说我的看法:

是否清0是对page来说的,你的例子并不能证明FreeBSD没有对堆栈所在页进行清0,
因为你的栈变量离main函数入口太“近”了。你可以在main函数中定义一个大数组,
然后 ...



呵呵,以后不再轻易下结论了,等什么时候在src里面找到了好好看看...


×××××××

现在在google找的时候发现这篇文章,准备先看看,应该不错...

http://ezine.daemonnews.org/200001/freebsd_vm.html
作者: 雨丝风片    时间: 2005-11-30 23:41
原帖由 zalem 于 2005-11-30 23:17 发表

呵呵,以后不再轻易下结论了,等什么时候在src里面找到了好好看看...

×××××××

现在在google找的时候发现这篇文章,准备先看看,应该不错...

http://ezine.daemonnews.org/200001/fr ...



google有时候也会让人舍近求远。。。\"\"
如果对BSD感兴趣的话可以先挑拣一下这里的文章,其中就包括你找到的那篇,\"\"

[url]http://www.freebsd.org/docs/books.html

作者: zalem    时间: 2005-12-01 00:02
...这么多...路好长...啥也不说了,闷头学了...




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2