- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
linux进程管理之可执行文件的加载和运行
linux进程管理之可执行文件的加载和运行
可执行文件的加载和运行
Execve系统调用可以调用一个可执行文件完全代替当前的进程,它在libc中的封装有几个API:
int execl(const charp a t* h n a m e, const char a* rg 0, ... /* (char *) 0 */);
int execv(const charp a t* h n a m e, char *consta rgv [] );
int execle(const charp a t* h n a m e, const char a* rg 0, ...
/* (char *)0, char *cones nt v p [] */);
int execve(const charp a t* h n a m e, char *consta rgv [], char *consten vp [] );
int execlp(const charf i l e* n a m e, const char a* rg 0, ... /* (char *) 0 */);
int execvp(const charf i l e* n a m e, char *consta rgv [] );
我们深入内核代码来研究一下可执行文件的加载过程.execve()系统调用的入口是sys_execve().代码如下:
asmlinkage int sys_execve(struct pt_regs regs)
{
int error;
char * filename;
//将用户空间的第一个参数(也就是可执行文件的路径)复制到内核
filename = getname((char __user *) regs.ebx);
error = PTR_ERR(filename);
if (IS_ERR(filename))
goto out;
error = do_execve(filename,
(char __user * __user *) regs.ecx,
(char __user * __user *) regs.edx,
?s);
if (error == 0) {
task_lock(current);
current-ptrace = ~PT_DTRACE;
task_unlock(current);
/* Make sure we dont return using sysenter.. */
set_thread_flag(TIF_IRET);
}
//释放内存
putname(filename);
out:
return error;
}
系统调用的时候,把参数依次放在:ebx,ecx,edx,esi,edi,ebp寄存器.详情请参阅本站 Linux中断处理之系统调用.第一个参数为可执行文件路径,第二个参数为参数的个数,第三个参数为可执行文件对应的参数.
do_execve()是这个系统调用的核心,它的代码如下:
int do_execve(char * filename,
char __user *__user *argv,
char __user *__user *envp,
struct pt_regs * regs)
{
//linux_binprm:保存可执行文件的一些参数
struct linux_binprm *bprm;
struct file *file;
unsigned long env_p;
int retval;
retval = -ENOMEM;
bprm = kzalloc(sizeof(*bprm), GFP_KERNEL);
if (!bprm)
goto out_ret;
//在内核中打开这个可执行文件
file = open_exec(filename);
retval = PTR_ERR(file);
//如果打开失败
if (IS_ERR(file))
goto out_kfree;
sched_exec();
bprm-file = file;
bprm-filename = filename;
bprm-interp = filename;
//bprm初始化,主要是初始化bprm-mm
retval = bprm_mm_init(bprm);
if (retval)
goto out_file;
//计算参数个数
bprm-argc = count(argv, MAX_ARG_STRINGS);
if ((retval = bprm-argc)
goto out_mm;
//环境变量个数
bprm-envc = count(envp, MAX_ARG
您可能关注的文档
最近下载
- 规范汉字书写 标点符号用法举例 标点符号用法举例.pptx VIP
- 职业院校技能大赛--Z-30“工程测量”赛项理论考试题库.doc VIP
- 安全员C证考试题库(精练).docx VIP
- 2018年四川省职业院校技能大赛工程测量赛项中职组理论考试题库.docx VIP
- 2020年山东省职业院校技能大赛中职组工程测量赛项理论试题.doc VIP
- 第十六届山东省职业院校技能大赛中职工程测量赛(教师组)理论试题.docx VIP
- 中央八项规定精神专题党课讲座PPT模板.pptx VIP
- 第十六届山东省职业院校技能大赛中职工程测量赛项(学生组)理论试题.docx VIP
- 全频带阻塞干扰刘慈欣小说读书分享PPT.pptx VIP
- 作子女生命的教练.PPT
文档评论(0)