深入理解计算机系统_程序的加载过程和运行过程

news2025/1/16 1:37:24

这篇博客记录编译得到可执行目标文件后,加载和运行的过程。
编译得到可执行目标文件后,就可以将“可执行目标文件”加载“运行地址”所指的内存位置,然后运行了。下面记录Linux虚拟内存运行的运行过程。

2.1 程序的加载过程

当在windows下双击.exe可执行目标文件,或者在linux下面./a.out时候执行时候,首先进行程序的加载,步骤如下:
首先:从父进程复制出一个子进程。图形界面、命令行程序就是父进程。当双击图标,执行程序时会从父进程复制出子进程,复制的目的其实就是从父进程的 “虚拟内存”复制出一个子进程的“虚拟内存”,准确讲应该是复制出“虚拟内存”的task进程数据结构,用于建立子进程的虚拟内存。有了子进程的虚拟内存,就可以将新的程序加载到虚拟内存中了。
在这里插入图片描述
如上图所示,上图的复制过程,调用fork()函数实现(见UNIX环境高级编程笔记)。进程的虚拟内存空间被分为了两部分,一部分是内核空间,另一个部分是应用空间。每个进程的虚拟内存和物理内存是一一对应的,每个进程虚拟对内对应不同的物理内存,这也是为什么每个进程的虚拟地址都是0x08048000,而不会与物理地址重复。
然后,程序运行起来就编程进程了。程序加载时候,linux提供的加载器将程序的代码段和数据段加载到进程的应用空间中,加载到0x08048000地址处。所有的进程都共享内核空间。

2.1 程序的运行过程

程序被加载到虚拟内存后,程序就可以运行了,运行后就是动态的进程了。进程运行过程如下:
(a)cpu的pc指向_start(将start第一条指令——start所在位置的虚拟地址存放到pc)
(b)从_start开始执行启动代码。
(c)启动代码调用_init等函数进行初始化。其中很重要的就是弄出堆和栈这两个东西
(d)启动代码调用main函数,main函数再调用各个子函数,我们自己写的代码就开始运行了。
(e)main函数调用return关键字,返回到启动代码。main函数将返回值return给启动代码后,启动代码会调用exit函数,接着将返回值返回给OS。该返回值主要是为了获取子进程的“进程状态”,从而回收子进程的资源。

如果子进程调用exec加载新程序后,子进程空间和新加载程序的虚拟内存是怎样的?

比如,执行下面代码后,子进程的空间是怎样的?

int main(int argc,char **argv)
{

	pid_t ret = 0;
	
	int fd = 0;
	ret = fork();

	if (ret > 0) // parent pid
	{
		
	}
	else if(ret == 0) // child pid
	{
		extern char **environ;
		execve("./new",argv,environ);
	}

	//while(1);
	return 0;
}

加载新程序之前,子进程中的所有内容(包括堆和栈),都是从父进程复制(继承)而来,子进程的.text、.data、…、堆栈与父进程的一模一样。当exec加载新程序后,新程序的.text、.rodata、.data等会覆盖子进程原有的.text、.rodata、.data、.bss,然后开始执行新程序。执行新程序时还是从.text中的“启动代码”开始执行的,当执行启动代码中设置堆栈的代码时,会重新设置新程序自己的堆栈指针,此时所代表的就是新程序自己的堆栈,只不过堆栈空间还是子进程的堆栈空间,并且该空间不会被清零(memset 或 bzero清零)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/162423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java AWT 图形界面编程】LayoutManager 布局管理器 ③ ( BorderLayout 布局 )

文章目录一、BorderLayout 布局二、BorderLayout 构造函数 API三、BorderLayout 代码示例1、BorderLayout 基本用法代码示例2、BorderLayout 区域占用代码示例3、BorderLayout 同一区域显示多个组件代码示例一、BorderLayout 布局 BorderLayout 布局 将 Container 容器 分割成 …

深度学习PyTorch 之 DNN-二分类

本节开始说一下DNN分类的pytorch实现,先说一下二分类 流程还是跟前面一样 #mermaid-svg-7Bxg4CYlbKjYOMMf {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-7Bxg4CYlbKjYOMMf .error-icon{fill:#552222;}…

从校园到职场,听听他们的成长之路

背景介绍 这次分享主题是「从校园到职场 -- 我的成长之路」,视频内容可以查看 B 站链接:从校园到实习再到秋招。 上次的面试分享之后,阿卡拉提到关于刚毕业的学生也会有很多找工作的困扰,而且这个阶段能获取到的信息相对比较有限&…

Java API文档的使用详解

文章目录1. 概念2. 使用Java编程基础教程系列学会使用 API 文档是一个开发者基本的素养,而许多初学者并不会在意 API 文档的使用,甚至从来没有接触过,所以写下这篇文章探讨 API 文档的使用,希望能够帮助到你,先赞后看&…

正点原子嵌入式linux第二期

目录 第5讲 IMX6U芯片介绍 第6讲 6.1汇编LED驱动实验-原理分析 6.2 汇编LED驱动实验-汇编基本语法 ​编辑6.3 驱动编写 6.4 编写驱动 6.5烧写bin文件到SD卡并运行 第七讲 IMX启动方式(没怎么听懂) 7.1启动设备的选择 7.2 IVT表和BootData详解 7.3D…

从面试官的角度带你从源码分析关于vue(v2.7.10)的面试题

我们在面试的时候经常会被问到vue框架的原理类问题,我今天整理了一些常见问题和答案,希望有不正确之处还请指正。 1.new Vue时发生了什么 首先实例化一个对象,该对象执行init方法初始化生命周期等等,随后执行$mount方法开始生成v…

时间序列模型SCINet(代码解析)

前言 SCINet模型,精度仅次于NLinear的时间序列模型,在ETTh2数据集上单变量预测结果甚至比NLinear模型还要好。在这里还是建议大家去读一读论文,论文写的很规范,很值得学习,论文地址SCINet模型Github项目地址&#xff…

SpringBoot文件上传功能实现、异常处理

目录 一、文件上传 1、页面表单 2、文件上传代码 3、自动配置原理 二、异常处理 错误处理 1、默认规则 2、定制错误处理逻辑 3、异常处理自动配置原理 4、异常处理步骤流程 一、文件上传 1、页面表单 <form method"post" action"/upload" e…

详细实例说明+典型案例实现 对递归法进行全面分析 | C++

第二章 递归法 目录 ●第二章 递归法 ●前言 ●一、递归法是什么&#xff1f; 1.简要介绍 2.生活实例 ●二、递归法的典型案例——阶乘函数&斐波那契数列 1.阶乘函数 2.斐波那契数列 ●总结 前言 简单的来说&#xff0c;算法就是用计算机程序代码来实现数学…

static关键字的作用

目录 C语言中static关键字的作用 1.static关键字修饰局部变量 2.static关键字修饰全局变量 3.static关键字修饰函数 在C中static关键的作用 1.静态成员变量 2.静态成员函数 C语言中static关键字的作用 1.static关键字修饰局部变量 概念&#xff1a; static修饰局部变量就…

这才是2023年csdn最系统的网络安全学习路线(建议收藏)

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

2. 认识O(logN)的排序

1. 递归 递归arr[L…R]范围上求最大值 流程分析如下: java代码: package paixu.class01;public class Code08_GetMax {public static void main(String[] args) {int[] arr {3,2,5,6,7,4};System.out.println(getMax(arr));}public static int getMax(int[] arr) {return p…

浅谈非类型模板参数、模板的特化

非类型模板参数 1.模板参数分类类型形参与非类型形参。 2.类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。类型参数也可以给缺省值 3.非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函…

FARO RevEng Software 22.3.9 Crack

FARO RevEng Software 22.3.9 用于反向工程的三维点云捕捉和网格生成 先进的 FARO RevEng 软件平台能为用户带来全面的数字设计体验。该反向工程软件有助于利用三维点云创建和编辑高质量的网格和 CAD 表面&#xff0c;以实现反向工程工作流程。然后&#xff0c;工业设计师可以利…

Zookeeper 集群安装

Zookeeper 集群 主机 IP SoftWare Port OS Myidnode1 192.168.230.128 apache-zookeeper-3.7.1 2181 Centos 7 1 node2 192.168.230.129 apache-zookeeper-3.7.1 2181 Centos 7 2 node3 192.168.230.130 apache-zookeeper-3.7.1 2181 Centos 7 31. 下载 Apache Downloads 下…

2022简单一年

牙齿软件决定开发的时间是2021年底&#xff0c; 老板说2022年任务是要开发牙齿咬合力的软件&#xff0c; 功能主要借鉴美国的一款软件,老板给了我一份软件的说明书&#xff0c; 包含了软件的所有功能。 看到软件第一感觉是&#xff0c; 做的确实是牛逼&#xff0c; 并且各…

【十 二】Netty 文件传输

概念介绍 文件是最常见的数据源之一&#xff0c;程序经常需要在文件中读取数据&#xff0c;也要将数据保存在文件中&#xff0c;进行持久化。 文件是计算机中一种基本的数据存储形式。即使计算机关机&#xff0c;文件的数据还是存在的&#xff0c;但是内存的数据就会丢失。 相…

联合证券|五定增项目同日被否 保荐机构该不该“背锅”?

一天之内5家上市公司定增一起被拒&#xff0c;这一音讯瞬间引发商场重视。 1月11日&#xff0c;浙江世宝、铭普光磁、胜华新材、日辰股份、振华科技等5家上市公司一起公告称&#xff0c;定增不被证监会受理&#xff0c;理由均是证监会以为请求资料不符合法定方式。 投行业界人…

18.Isaac教程--坐标系

坐标系 本节介绍相机、网格/矩阵/图像和机器人坐标系。 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录坐标系网格像素中心网格/矩阵/图像坐标系相机坐标系机器人坐标系网格像素中心 存储网格 GGG 上的值&#xff0c;使得网格单元将值…

Crack:CAD Exchanger GUI/CAD Exchanger Lab 不是SDK

CAD Exchanger GUI/CAD Exchanger Lab 用于查看、转换和分析 CAD、BIM 和 3D 数据 在 Windows、Mac 和 Linux 上加载和转换模型&#xff0c;而无需处理昂贵的 CAD 系统。 使用 CATIA、SOLIDWORKS、Creo、STEP、JT、IFC 和更多格式。 非常适合您的 3D 数据工作流程 连接不同的软…