Chinaunix首页 | 论坛 | 博客
  • 博客访问: 738156
  • 博文数量: 251
  • 博客积分: 10367
  • 博客等级: 上将
  • 技术积分: 2750
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-10 14:43
文章分类

全部博文(251)

文章存档

2009年(2)

2008年(86)

2007年(163)

分类: LINUX

2007-09-18 23:25:03


Question:
 
[这个贴子最后由asymmatrix在 2005/03/11 07:39pm 第 1 次编辑]

copy_page_tables()函数179行处
if (this_page > LOW_MEM) {
*from_page_table = this_page;
this_page -= LOW_MEM;
this_page >>= 12;
mem_map[this_page]++;
}
如果是进程0创建进程1过程中,这个条件不成立,*from_page_table = this_page;是不会执行,因此进程0和进程1对共享页面的读写属性是不同的。进程1对所有页面都只有只读属性,而进程0对所有页面都有读写属性。
是不是因为进程0在创建进程1后永远不会执行写操作,所以这样设置是没有问题的?
为什么不把*from_page_table = this_page;放到 if 判断前面?对共享页面这样不是更好?
 
 
[这个贴子最后由redgrid在 2005/03/12 09:51pm 第 1 次编辑]

可修改一下源代码调试看看。
谢谢你的问题,让我发现书中的一个Big BUG! 书中对user_stack的用法方面说明有误。
我今天跟踪了一遍,并查看了任务0和任务1的用户栈。虽然任务1完全复制了任务0的页表,但由于设置成了只读,因此任务1在进行写操作时(例如栈操作)实际上会引起写保护异常而为其在主内存分配一页,并复制内核中user_stack的相应页面内容。因此虽然两者“共享”内核中的任务栈,但在进入任务1之后任务1的栈就与任务0的没什么关系了。以前一直认为任务1在使用user_stack,而任务0不得使用 :-(
 
 
注:以后这样以贴子形式出现的大部分是转自:
阅读(997) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~