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) |