SA1***6*69    张*铭

实验环境:ubuntu 12.04 LTS

当在Linux下编写一个源程序,经过编译链接之后生成可执行程序,在终端shell命令行下输入./(可执行程序的名字)来执行的过程,实际上是shell创建一个子进程,在子进程中加载可执行程序进行执行的过程,具体的子进程加载可执行程序之前的准备工作过程以及fork、exec的工作原理分别在

Linux操作系统学习_用户进程之由新进程创建到可执行程序的加载

Linux操作系统学习_用户进程之fork()与exec函数族篇

1、task_struct进程控制块

为了管理进程,内核必须对每个进程所做的事情进行清楚的描述,这正是进程描述符的作用。进程描述符都是task_struct类型结构,它的字段包含了与一个进程相关的所有信息。当一个进程被创建时,系统就为该进程建立一个task_struct任务结构体。当进程运行结束时,系统撤消该进程的任务结构体。进程的任务结构体是进程存在的唯一标志。Linux在内存空间中开辟了一个专门的区域存放所有进程的任务结构体。

2、ELF文件格式与进程地址空间的联系

ELF文件的结构如下图:

关于ELF Header,即ELF文件头其作用这里不再赘述,上面Linux操作系统学习_用户进程之由新进程创建到可执行程序的加载一文中已有阐述。.text单元中主要存储的是ELF文件的程序正文部分。.data单元存储的是已经初始化了的数据。.bss单元中存储的主要是未初始化的数据。

进程地址空间中的存储区情况:

可以看到堆是向上增长的,而栈是向下增长的。

所以,在加载可执行文件时,ELF文件中的ELF文件头和程序正文区域.text会映射到存储区域的相应的程序文件区中,而ELF文件的数据区,包括已初始化的数据和未初始化的数据会分别映射到存储区域的.data区域和.bss区域。而链接时的库文件则主要映射到存储区域中的存储器映射区域。

3、动态链接库在ELF文件格式中与进程地址空间中的表现形式

调用定义好的函数,然后再用连接器与函数库连接。这样产生的可执行文件就会很大。因为连接器把程序需要用的所有函数的代码都复制到了可执行文件中去了。这种连接方式就是所谓的静态连接,与之相对的就是动态连接。连接器在可执行文件中标记出程序调用外部函数的位置,并不把代码复制进去,只是标出函数在动态连接库中的位置。用这样的方式生成的特殊可执行文件就是动态连接。在运行这种动态程序时,系统在运行时把该程序调用的外部函数地址映射到程序地址,系统有一个程序叫做动态连接器,用以完成动态链接过程。动态连接器是由ELF可执行文件中的.interp段来指定的,该段的内容就是一个简单的字符串。ELF可执行程序依赖的动态链接库保存在ELF的.dynamic段中。  

可以看到libc文件即为程序forkexample2的动态链接库,而ld文件即为相应的动态链接器。

可以使用readelf命令来查看ELF文件相应的信息,-h选项查看前面提到的ELF文件头的信息:

Magic:字段是一个标识符,只要Magic字段是7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00的文件都是elf文件。Class:字段是表示elf的版本,这是一个32位的elf。Machine:字段是指出目标文件的平台信息,这里是 Intel 80386平台。其他的字段可以从其字面上看出它的意义,这里就不一一解释了。

可以使用-d选项查看ELF文件的.dynamic段中动态链接库的信息:

转载于:https://www.cnblogs.com/vampirem/archive/2013/05/30/3108973.html

进程的创建与可执行程序的加载相关推荐

  1. 实验二:进程的创建与可执行程序的加载

    学号:SA*****259 姓名:吕良  关键字:fork() exec() task_struct 进程地址空间 ELF文件格式 动态链接库 实验总结(应该说是回答实验问题,因为300-500字真的 ...

  2. Linux操作系统分析-lab2-进程的创建与可执行程序的加载

    学号:sa****340  姓名:**钰 一.进程的创建过程分析 1.创建进程 Linux提供了几个函数fork,vfork和clone系统调用创建新进程,其中,clone创建轻量级进程,必须指定要共 ...

  3. 从整体上理解进程创建、可执行文件的加载和进程执行进程切换,重点理解分析fork、execve和进程切换...

    学号后三位<168> 原创作品转载请注明出处https://github.com/mengning/linuxkernel/ 1.分析fork函数对应的内核处理过程sys_clone,理解 ...

  4. 如何在React Native中创建精美的动画加载器

    by Vikrant Negi 通过Vikrant Negi 如何在React Native中创建精美的动画加载器 (How to create a beautifully animated load ...

  5. 理解进程创建、可执行文件的加载和进程执行进程切换,重点理解分析fork、execve和进程切换

    学号:384 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ 实验目标 1.分析fork函数对应的内核处理过程do_fork,理解创建一个 ...

  6. Linux进程调用execve,实验:从整理上理解进程创建、可执行文件的加载和进程执行进程切换,重点理解分析fork、execve和...

    学号375 转载请注明出处 https://github.com/mengning/linuxkernel/ 阅读理解task_struct数据结构 task_struct实际上就是进程PCB以下是p ...

  7. React(九)create-react-app创建项目 + 按需加载Ant Design

    (1)create-react-app如何创建项目我前面第一章介绍过了,这里就不过多写了, (2)我们主要来说说按需加载的问题 1. 引入antd npm install antd --save 2. ...

  8. pytorch创建自己的Dataset加载数据集

    文章目录 创建一个类并继承torch.utils.data.dataset.Datase类 创建__getitem__方法 加载数据集 创建一个类并继承torch.utils.data.dataset ...

  9. 重新创建“ Design Samsung”网格加载效果

    View demo 查看演示 Download Source 下载源 If you already come across the Samsung Corporate Design Center, y ...

最新文章

  1. 如何做相册_腾讯相册管家再创相册管理软件新纪元
  2. [iOS] tableView中实现底部button出现时tableView的bottom自动向上偏移
  3. docker-compose安装问题
  4. 想成长为一名实战型架构师?7大实战技能经验分享
  5. php中arraymultisort,php 数组函数array_multisort()用法
  6. html是什么型语言,HTML笔记
  7. Python 解析构建数据大杂烩 -- csv、xml、json、excel
  8. 最新“母马”病毒反杀主流杀毒软件
  9. String和ByteBuffer互转
  10. iOS自定义SearchBar样式
  11. 汽车零部件行业追溯系统的应用
  12. hotmail手机端_hotmail邮箱手机版
  13. Java打印带边框的乘法口诀表_Java 面试 - 打印九九乘法口诀表
  14. 小帅一点资讯小程序源码
  15. 两个栈共享一块存储空间新解
  16. Discuz!论坛实现帖子回复可见内容功能
  17. 大一作业HTML个人网页作业(宠物狗)
  18. 医疗管理系统-体检预约
  19. iCloud邮件客户端配置
  20. CSS——浮动(float)

热门文章

  1. docker java mysql_Docker 搭建 MySQL 服务
  2. yolo v4 python_YOLOv4: Darknet 如何于 Ubuntu 编译,及使用 Python 接口
  3. three.js加载3d模型_基于WebGL的3D技术在网页中的运用 ThingJS 前端开发
  4. python选项卡中文详细说明_pycharm窗口选项卡管理
  5. python做股票分析_利用Python进行股票投资组合分析(调试)
  6. Wireshark常用过滤使用方法
  7. 光端机使用过程中碰到的九大问题
  8. 光纤交换机主要分为哪几类?
  9. 【渝粤题库】陕西师范大学210019 学前教育科研方法 作业(专升本)
  10. SI4432射频芯片方案物联网无线通信模块数传的典型应用