1、可执行文件的格式
  在 Linux 平台下主要有以下三种可执行文件格式:
  1、a.out(assembler and link editor output 汇编器和链接编辑器的输出)
  2、COFF(Common Object File Format 通用对象文件格式)
  3、ELF(Executable and Linking Format 可执行和链接格式)。
  在本课程中,主要介绍的是ELF文件。ELF 文件又分为三种类型:共享目标文件(库文件,后缀为.so)、可执行文件、可重定位文件(目标文件,后缀为.o)。
  2、可执行文件的创建过程
  从 C/C++ 源文件生成一个可被系统加载和启动的可执行文件,需要经过预处理、编译和链接这几个过程。
  预处理:把include 的文件包含进来,进行宏替换等。
  编译:编译器将预处理文件编译成汇编代码;汇编器将汇编代码编译成目标代码
  链接:将目标代码链接为可执行文件。根据链接方式的不同,可分为静态链接与动态链接。动态链接又可分为可执行程序装载时动态链接与运行时动态链接。
  3、可执行文件(ELF文件)的装载与启动过程
  一个可执行文件是由 shell 程序启动的。在 shell 环境下,用户输入可执行程序名及其参数后,shell 程序会调用 execve 将命令行参数和环境参数传递给可执行程序的main函数。通过以下层层调用,最终完成可执行程序的启动过程:
do_execve-->do_execve_common-->exec_binprm-->search_binary_handler-->load_elf_binary-->start_thread
 
在实验楼虚拟机下,键入以下指令更新 MenuOS
cd LinuxKernel
rm menu -rf
git config --global user.name "Scott Chacon"
git config --global user.mail "schacon@gmail.com"
git clone https://github.com/mengning/menu.git
cd menu
mv test_exec.c test.c
make rootfs
  待 MenuOS 系统完毕,在 MenuOS 中运行 help 指令与 exec 指令
 
按“Ctrl +C", 让 gdb 处于 gdb 命令行模式,设置断点
在 MenuOS 命令行执行 exec 指令,gdb 自动捕捉到 1#断点。
 
 
 
 
总结:
 首先创建新进程,然后新进程调用execve()系统调用执行指定的ELF文件,之后再调用内核的入口函数sys_execve(),sys_execve()服务例程修改当前进程的执行上下文;以上系统调用终止后,新进程开始执行放在可执行文件中的代码,也就是执行在当前目录下显示文件的功能。当ELF被load_elf_binary()装载完成后,函数返回至do_execve(),再返回至sys_execve()。ELF可执行文件的入口点取决于程序的链接方式,对于静态链接的可执行文件,,elf_entry就是指向可执行文件里边规定的那个头部,即main函数对应的位置,若这个可执行文件是需要依赖其它动态链接库的话,则elf_entry就是指向动态链接器的起点。
 
 
 
 
李海空原创作品转载注明出《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
 

Linux内核分析作业7:Linux内核如何装载和启动一个可执行程序的更多相关文章

  1. 作业七:Linux内核如何装载和启动一个可执行程序

    作业七:Linux内核如何装载和启动一个可执行程序 一.编译链接的过程和ELF可执行文件格式 可执行文件的创建——预处理.编译和链接 在object文件中有三种主要的类型. 一个可重定位(reloca ...

  2. linux内核分析 第七周 Linux内核如何装载和启动一个可执行程序

    一.编译链接的过程和ELF可执行文件格式 vi hello.c gcc -E -o hello.cpp hello.c -m32 //预处理.c文件,预处理包括把include的文件包含进来以及宏替换 ...

  3. Linux内核分析第七周学习笔记——Linux内核如何装载和启动一个可执行程序

    Linux内核分析第七周学习笔记--Linux内核如何装载和启动一个可执行程序 zl + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study. ...

  4. 实验七:Linux内核如何装载和启动一个可执行程序

    原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 题目自拟,内容围绕对Linu ...

  5. 20135323符运锦----第七周:Linux内核如何装载和启动一个可执行程序

    可执行程序的装载 一.预处理.编译.链接和目标文件的格式 1.可执行程序是怎么得来的 ①编译器预处理 gcc -E -o XX.cpp XX.c (-m32)// 注:把include的文件包含进来, ...

  6. Linux内核如何装载和启动一个可执行程序(转)

    原文:http://www.cnblogs.com/petede/p/5351696.html 实验七:Linux内核如何装载和启动一个可执行程序 姓名:李冬辉 学号:20133201 注: 原创作品 ...

  7. Linux内核设计第七周学习总结 Linux内核如何装载和启动一个可执行程序

    陈巧然原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-100002900 实验目的 使用gdb跟踪s ...

  8. 20135202闫佳歆--week 7 Linux内核如何装载和启动一个可执行程序--实验及总结

    week 7 实验:Linux内核如何装载和启动一个可执行程序 1.环境搭建: rm menu -rf git clone https://github.com/megnning/menu.git c ...

  9. 通过分析exevc系统调用处理过程来理解Linux内核如何装载和启动一个可执行程序

    前言说明 本篇为网易云课堂Linux内核分析课程的第七周作业,本次作业我们将具体来分析exec*函数对应的系统调用处理过程,来分析Linux内核如何来执行一个可执行程序,由于有一个在网易云课堂共同学习 ...

随机推荐

  1. javase-排序

    public class sort { public static void main(String[] args) { String[] arr = {"aa","bb ...

  2. 浅谈redis和memcached的区别

    缓存技术方面说到redis大家必然会联想到memcached,了解它们的人应该都知道以下几点吧 redis与 memcached相比,redis支持key-value数据类型,同事支持list.set ...

  3. Windows下用tree命令生成目录树

    有时候我们想为某个目录制作一个文档结构图,在Windows上,我们知道是使用tree命令. 但是,默认情况下tree只显示子目录名,而不显示子目录里的文件名,需要加上/F参数才能显示完整的文件名.   ...

  4. ExtJS 中类的继承

    ExtJS 允许对现有的类进行扩展,其扩展可以通过继承来实现.接下来我们就对刚刚使用ExtJS定义的Person类进行继承,定义一个Developer类,它继承自Person,同时还拥有Coding方 ...

  5. 解决C# WinForm Graphics绘制闪烁问题

    不直接使用form的CreateGraphics创建Graphics进行绘制,可以先在Form上面放一个需要大小的PictureBox,再创建一个同大小的Bitmap,将这个Bitmap设置为Pict ...

  6. Kafka vs RocketMQ——多Topic对性能稳定性的影响-转自阿里中间件

    引言 上期我们对比了RocketMQ和Kafka在多Topic场景下,收发消息的对比测试,RocketMQ表现稳定,而Kafka的TPS在64个Topic时可以保持13万,到了128个Topic就跌至 ...

  7. 光标失去焦点事件 onblur

    onblur="judgeLandCode()" function judgeLandCode(){ $.ajax({ type:'post', dataType:'json', ...

  8. JAVABeanUtils

    在写如何使用java BeanUlits 之前需要清楚几件事情 1. 我们每次所定义的类,其实是实体,同时也被称作为JavaBean; 2.  为什么我们要使用BeanUlits这个框架     &g ...

  9. LeetCode 344. Reverse String

    Problem: Write a function that takes a string as input and returns the string reversed. Example: Giv ...

  10. .net 开发---windows服务

    因为想把quartz.net自动run的程式挂到windows服务中去,遇到问题记录 1.创建windows服务后,利用C:\Windows\Microsoft.NET\Framework\v4.0. ...