计算机系统->Hello World的一生 | 程序如何运行
2021年11月27日准备发在基地微信公众号上的推文。
综合了多篇大佬的博客,以及自己已经知道的知识,对一些疑惑进行了现阶段我认为还算满意的解答。
不过又产生了很多疑问:
- 内存和磁盘的关系
- CPU是如何运行机器指令的(虽然大概想过去会是数字逻辑上的电路的组合)
- ......
========================================================================================================================================
我写的上一篇推文是:Vscode里的多文件编译,本来这一篇计划是多语言混编,可是还没玩太明白,就来补充讲一讲程序的运行过程,对上一篇也是一种补充。
当我们要让一个程序运行起来,如下面这段代码:
1 #include <stdio.h>
2 int main()
3 {
4 printf("Hello World\n");
5 return 0;
6 }
需要以下过程:
1. 预处理
gcc -E hello.c -o hello.i
这一过程主要是处理源代码文件中:
以”#”开始的预编译指令
如”#include”、”#define”等
将include的文件插入进来,将所有define的宏定义展开。
删除注释
添加行号和文件名标识。
以便编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号
2. 编译
gcc -S hello.i -o hello.s
编译程序(Compiler)把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生产相应的汇编代码文件。
当然,预处理和编译可以合二为一,直接一步到位:
1 gcc -S hello.c -o hello.s
这里提一下这个gcc,这只是后台编译程序(compiler)的控制台,会根据不同参数去调用不同的预处理、编译程序,来处理不同的语言。
3. 汇编
1 gcc -c hello.c -o hello.o
.o文件就是“目标文件”(Object File),将汇编语句转换为机器语言,机器语言是CPU可以执行的命令。
4. 链接
在上面的过程中,原本的一个文件会生成若干个目标模块,这些模块是割裂的。
由链接程序(Linker)将这些目标模块(程序段),以及它们所需要的库函数链接在一起,形成一个完整的装入模块(Load Module);这是完整的执行命令的可执行文件exe(此时已经是二进制文件)。
链接分为静态链接和动态链接。不展开了。
DLL文件就是Dynamic Link Library文件.
5. 装入
可执行文件只有装载到内存以后才能被CPU执行。
装入过程就是由装入程序(Loader)将装入模块装入物理内存。物理内存就是真实存在的内存条。
物理内存是由若干个存储单元组成的,每个存储单元有一个编号,这种编号可唯一标识一个存储单元,称为内存地址(或物理地址)。
可以简单理解成类数组的一个结构。
这个过程进行了地址重定位,主要是将逻辑地址转换成物理内存的绝对地址(相当于拿考号找座位)。这个过程只有在程序将要被运行的时候才会发生。
6. 执行
执行不是一个严格的概念,只是我用来描述装入到输出“Hello World”这个过程的一个名词。
当计算机要运行该程序时,二进制文件中相关的指令会发送给CPU,经过CPU的操作,显示到了显示器上。
7. GCC
补充GCC的工具链

8 复习
- 程序从按下“编译”到装入内存需要哪些过程?
- GCC工具链有哪些?
计算机系统->Hello World的一生 | 程序如何运行的更多相关文章
- C#[Win32&WinCE&WM]应用程序只能运行一个实例:MutexHelper
前言 在开发应用程序时,通常只让程序运行一个实例.所以,就要判断程序是否已经运行. 下面是我自己在项目中使用到,封装好的帮助类.有 普通的 C# 应用程序 和 Windows CE 和 Windows ...
- C# Winform防止一个程序重复运行
1: //在写一些服务型的软件的时候,你可能不希望一个操作系统里有两个副本在运行,这样也许会扰乱你的操作.这时,你就需要限制程序的副本.下面的这个方法,很简单的就可以实现上述功能. using Sys ...
- 关于SQL Server 安装程序在运行 Windows Installer 文件时遇到错误
前几日安装sql server2008r2 的时候碰到这个问题: 出现以下错误: SQL Server 安装程序在运行 Windows Installer 文件时遇到错误. Windows Insta ...
- <<< php程序在运行后报“internal server error”错误
上传的php程序在运行后报“internal server error”错误,检查以下两方面: 1.请您检查php程序的属性是否设置为755,如果php程序的属性不是755,那么运行的时候会报“int ...
- 如何利用 JConsole观察分析Java程序的运行,进行排错调优
原文链接:http://jiajun.iteye.com/blog/810150 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能 ...
- /var/run/yum.pid 已被锁定,PID 为 XXXX 的另一个程序正在运行。
安装st-load时, 终端提示 “/var/run/yum.pid 已被锁定,PID 为 13908 的另一个程序正在运行.” 解决方法:直接在终端运行 rm -f /var/run/yum.pid ...
- Windows程序内部运行机制 转自http://www.cnblogs.com/zhili/p/WinMain.html
一.引言 要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制,然而在.NET平台下,创建一个Windows桌面程序,只需要简单地选择Windows窗体应用程序 ...
- Web程序的运行原理及流程(一)
自己做Web程序的开发也有两年多了 从最开始跟风学框架 到第一用上框架的欣喜若狂 我相信每个程序员都是这样过来的 在大学学习一门语言 学会后往往很想做一个实际的项目出来 我当时第一次做WEB项目看 ...
- Linux nohup 程序后台运行
&方式: Unix/Linux下一般想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序自动运行.比如我们要运行mysql在后台: /usr/local/my ...
随机推荐
- Python&Selenium 数据驱动测试【unittest+ddt+xml】
一.摘要 本博文将介绍Python和Selenium做自动化测试时,基于unittest框架,借助ddt模块,使用xml文件作为测试输入. 二.xml文件 保存路径:D:\\Programs\\Pyt ...
- JavaScript兼容性汇总
一般兼容性问都体现到DOM和事件上 只聊ie6+版本浏览器,希望小伙伴们别纠结更低版本浏览器哈^_^ DOM 获取元素 document.getElementsByclassName 不兼容ie6 ...
- Golang通脉之方法
方法和接收者 Go语言中的方法(Method)是一种作用于特定类型变量的函数.这种特定类型变量叫做接收者(Receiver).接收者的概念就类似于其他语言中的this或者 self. Go 语言中同时 ...
- 【UE4 C++】编程子系统 Subsystem
概述 定义 Subsystems 是一套可以定义.自动实例化和释放的类的框架.可以将其理解为 GamePlay 级别的 Component 不支持网络赋值 4.22开始引入,4.24完善.(可以移植源 ...
- 关于takin-data,你想知道的都在这里(二)trace日志篇
相信大家在使用takin的过程中都见到过压测过程中实时展示的请求流量明细和请求详情了吧,像这样: 还有这样: 这样的请求流量明细和调用链详情是怎么实现的呢,今天就带大家探究下. 在前面的启动命令篇(h ...
- 实用小技巧:Notepad++直接连接Linux
实用小技巧:Notepad++直接连接Linux 前言 号称编辑器之神的Vim对于只会用几个基础操作的本人而言,在编辑一些大型文本有那么些力不从心: 平时都是通过Xftp拖到本地,修改完后再覆盖回去: ...
- Codeforces Round #735 (Div. 2)
这次的cf依旧掉分..... A题和B题在不懈死磕下瞎搞出来了,不过还是被C题卡住了... C. Mikasa 简述题意就是给定n和m,让n^0,n^1,n^2...,n^m,求着m+1个数中没有出现 ...
- Luogu P1525 [NOIp2010提高组]关押罪犯 | 并查集
题目链接 这一道题,我用了并查集来做.在此题中,并查集的作用就是:将同一个监狱里的罪犯合并到一起. 思路:将每对罪犯之间的怨气值从大到小排序,再依次把他们分到不同的两个监狱里,当发现这一对罪犯已经在同 ...
- 【JavaScript】JS的坚实基础
前言 考虑到在后面的开发中,需要大量的使用js语言去进行开发,所以准备重新规整一下javascript的知识点,专门开了一个js的专栏,用来复习一下js语言.万事开头难,要是后面写的有问题的,欢迎 ...
- JMeter学习笔记--关联
1.什么是关联? 本次请求需要的数据,需要上一步的请求返回给提供的过程. 2.JMeter关联中常用的两种方式 正则表达式提取器 正则表达式提取器用于对页面任何文本的提取,提取的内容是根据正则表达式在 ...