linux 用户态栈 fork,再谈关于任务0中fork和pause的内嵌问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

再谈关于任务0中fork和pause的内嵌问题

chaser 2008-7-30 12:52

1。任务0中使用内嵌,仅仅是避免任务1的用户态堆栈中没有无用的多余信息。

2。即使在任务0中fork和pause都不使用内嵌,对任务1也没有任何影响。因为任务1的用户态堆栈与任务0的没有任何关系。

3。对main.c中开头的一段注释“我们需要下面这些内嵌语句--从内核空间创建进程将导致没有写时复制。。。”的理解:如果有写时复制,那么fork和pause都可以不用内嵌,因为写时复制可以在任务0或者任务1对堆栈有写操作时立刻分配新的内存页,从而保证任务0和任务1的堆栈独立并且干净(只包含自己任务的信息)。

4。同样是对上面一段注释,怎样理解“从内核空间创建进程”?我的疑问是:在执行fork前已经执行了move_to_user_mode();任务0进入用户态,这时仍然是“从内核空间”么?对于init()中的fork又怎样理解呢?内核空间和内核态又怎样理解呢?

不知前3点的理解是否正确,若不正确请版主指出问题所在,并请教第4个问题。

谢谢。

hinus 发表于 2008-7-30 16:07

又回去读了一下 copy_page_tables。有了点新的想法。我觉得 main.c 里的注释所指的 "kernel space" 所指的应该不是特权级 0 的堆栈或者数据什么的,而是指低于 1M 部分的内存。在第一次调用 fork() 时,由于源页面地址小于 1M,所以父进程,也就是 task0 的写权限并没有改变,这意味着写时复制机制对 task0 无效,换言之,task0 和 task1 在共享一块内存,只不过 task1 不能在上面写。这可以称做“不对称的写时复制”这时如果发生了楼上 kenya 所说的那种情况——task0 先于 task1 被调度,那么 task0 就会向“共享内存”里写东西,当 task1 写时复制时,就会把不相干的东西拷过去。保持独立性,这个原则应该一直被坚持。

而且,task0 的数据和代码永远不会超过 1M,这是不是就是 kenya 兄所说的“不改变进程0的页面映射结构”的更俗泛的解释?而 task1 就已经因为第一次 fork() 被移到了 1M 以外,也就是扩展内存中去了,所以 task1 中再执行 fork() 时,父进程和子进程无论谁先被调度,都会发生写时复制,这时,可以称为“对称的写时复制”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值