[英]Use of iret when returning from exec system call
I noticed that at the end of the start_thread
function, which is called after most of the work of exec
is done, there is a call to force_iret
: 我注意到在
exec
大部分工作完成后调用的start_thread
函数的末尾,有一个对force_iret
的调用:
static void
start_thread_common(struct pt_regs *regs, unsigned long new_ip,
unsigned long new_sp,
unsigned int _cs, unsigned int _ss, unsigned int _ds)
{
loadsegment(fs, 0);
loadsegment(es, _ds);
loadsegment(ds, _ds);
load_gs_index(0);
regs->ip = new_ip;
regs->sp = new_sp;
regs->cs = _cs;
regs->ss = _ss;
regs->flags = X86_EFLAGS_IF;
force_iret();
}
I presume that this is done to ensure that that sysexit
is not used to return to user space. 我认为这样做是为了确保不使用
sysexit
返回用户空间。 So why does iret
have to be used when returning from exec
? 那么,为什么从
exec
返回时必须使用iret
呢?
This function modifies registers that sysret
/ sysexit
would not restore. 该函数修改了
sysret
/ sysexit
无法恢复的寄存器。
Here's arch/x86/include/asm/thread_info.h
: 这是
arch/x86/include/asm/thread_info.h
:
/*
* Force syscall return via IRET by making it look as if there was
* some work pending. IRET is our most capable (but slowest) syscall
* return path, which is able to restore modified SS, CS and certain
* EFLAGS values that other (fast) syscall return instructions
* are not able to restore properly.
*/
#define force_iret() set_thread_flag(TIF_NOTIFY_RESUME)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.