On Thu, 14 Jun 2001, you wrote:
> To execute a program, the load_elf_binary() loads it and descdes the value of
> elf_entry, start_code, start_data....etc..
> Then , the start_thread(regs, elf_entry, bprm->p) will trigger it.
> But it just sets up the value of regs->cp0_status, regs->cp0_epc,
> regs->regs and current->thread.current_ds.
> Why can the start_thread() trigger a program?
It does trigger a program, just not in the way you're thinking.
At that point, you're in kernel space, with kernel privileges, so you can't
just jump to the entry point of the elf binary; you have to drop privs first.
What you're probably missing is that, when the kernel returns to userspace, it
does so (in mips) via an eret, which returns to the epc. The registers are
restored from the regs struct that is being modified by start_thread, so it is
effectively modifying the registers for userspace, which is what it should be
In short, you're not going to see the new process, in your case, /sbin/hello,
start executing until the syscall returns. Check out
arch/mips/kernel/entry.S:ret_from_sys_call to see where this happens. You'll
also want to check out include/asm-mips/stackframe.h
Does this make sense?