Messages in this thread | | | Date | Mon, 19 Mar 2007 00:58:31 +0200 | Subject | i386: Why putting __USER_DS in kernel threads stack initialization? | From | "Ahmed S. Darwish" <> |
| |
Hi list,
Reading the kernel threads initialization code I see:
int kernel_thread(...) {
struct pt_regs regs; memset(®s, 0, sizeof(regs)); [...] ** regs.xds = __USER_DS; ** regs.xes = __USER_DS; [...] /* Ok, create the new process.. */ return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, \ 0, NULL, NULL);
Continuing with the code, the threads stack (beginning from %esp) is initialized with the passed *regs from do_fork:
int copy_thread(..., struct task_struct *p, struct pt_regs *regs) {
struct pt_regs * childregs; struct task_struct *tsk; childregs = task_pt_regs(p); ** *childregs = *regs; [...] ** p->thread.esp = (unsigned long) childregs;
So the question is what will a _kernel_ thread do with the Usermode Segment address ?
Thanks,
P.S. I've tried commenting out both lines which led to a non functional init, Also setting them to __USER_DS made init start but stopped issuing the error: `Panic: Segment violation at 0x8049798 - Sleeping for 30 seconds'
-- Ahmed S. Darwish http://darwish.07.googlepages.com
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |