码迷,mamicode.com
首页 > 系统相关 > 详细

Linux内核如何装载和启动一个可执行程序

时间:2016-04-09 16:50:57      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:

秦鼎涛 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

 

一、视频学习

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

 

二、使用gdb跟踪分析一个execve系统调用内核处理函数sys_execve
 增加execve系统调用指令:
技术分享
 
技术分享
 在Makefile找到启动内核命令:
技术分享
 启动内核后,找到增加的exec命令:
技术分享
执行exec——新加载的执行程序来输出的“hello world
技术分享
 冻结后gdb跟踪,设置断点:
技术分享
 
执行到了sys_execve:
技术分享
进入do_execve内部
技术分享
继续执行,到了load_elf_binary
技术分享
 
list后,可以看出静态链接时elf_interp为空
技术分享
 再执行,跟踪到start_thread
 
 技术分享
 
 
三、总结
  新的可执行程序是从new_ip开始执行,start_thread实际上是把返回到用户态的位置从Int 0x80的下一条指令,
变成了规定的新加载的可执行文件的入口位置,即修改内核堆栈的EIP的值作为新程序的起点。当执行到execve系统调
用时,陷入内核态,用execve加载的可执行文件覆盖当前进程的可执行程序,当execve系统调用返回时,返回新的可
执行程序的执行起点(main函数位置),所以execve系统调用返回后新的可执行程序能顺利执行。对于静态链接的可
执行程序和动态链接的可执行程序execve系统调用返回时,如果是静态链接,elf_entry指向可执行文件规定的头部
(main函数对应的位置0x8048***);如果需要依赖动态链接库,elf_entry指向动态链接器的起点。 

Linux内核如何装载和启动一个可执行程序

标签:

原文地址:http://www.cnblogs.com/qindingtao/p/5371660.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!