linux 0.11中 fork 时,内核栈以及用户态栈的变化

本文探讨了在Linux 0.11中,`fork`系统调用如何影响内核栈和用户态栈的值。在`fork`之后,用户态栈值大于内核栈值。在用户态运行时,如发生时钟中断,`do_timer`函数使用用户态栈,不切换到内核栈。在共享页面修改时,`do_wp_page`函数处理页面复制和写保护。在`fork`过程中,若未将页表项设置为只读可能导致错误,需要将`fork`设为内联函数以确保正确性。修改后系统仍无法正常运行,可能涉及其他因素。
摘要由CSDN通过智能技术生成
struct task_struct {
...
   /0-zero,  1 --cs, 2 --ds and ss
   struct desc_strct ldt[3];
...
}

task_struct中含有 ldt描述符,用于根据段描述符进行寻址。

linux 中,在fork之前, esp 的值在0x1ddb0 附近。经过fork系统调用,esp的值变成了0x18244。

可见,用户态的栈值 比 内核态的栈值 要大。 用户态的栈的值是程序正常运行时,从esp中提取得到的,而用户态的栈是人为的通过设定 init_task.tss.esp0的值得到的。 但是,不知编程者对 用户态的栈的值 是如果 设计的。

另外,系统在用户态运行时,如果发生时钟中断,进入do_timer中断函数,此时,并不会发生 CPU的权限切换,即do_timer也是运行在用户级别权限的。 所以,do_timer函数的栈用的仍是 用户态的栈,不会切换成tss.esp0中的数值。

 

如果一个进程对共享的页面进行修改时,程序进入do_wp_page函数,申请新的页面,并复制共享页的内容到新页,然后让页表指向新的页,减少me

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值