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函数,申请新的页面,并复制共享页的内容到新页,然后让页表指向新的页,减少mem_map中共享页面的引用计数。此时,另外一个进程的页表中指向的共享页面仍然是只读的,所以当该进程对页面进行写操作时,也会进入do_wp_page函数,该函数中 如果检测到 页面是写保护的,同时mem_map中的引用计数为1, 就会去掉 页面的 写保护。
<