深入理解hello,world

从文本文档hello.c说起

#include<stdio.h>

int main()
{
    printf("hello,world\n");
    return 0;
}

这里写图片描述
这是众所周知的hello,world,今天我认识到了打印hello,world也是一件十分复杂的过程:由程序员编写的文本文件hello.c开始,经历预处理、编译、汇编、链接,其中需要计算机系统输入设备、输出设备、CPU、内存控制器、总线、缓存、寄存器等硬件设备的支持与合作,还需要操作系统以及系统工具等软件资源的协调与管理。

预处理阶段所做的事情:

  1. 展开头文件
  2. 宏替换
  3. 条件编译
  4. 去注释

编译阶段

检查语法错误——>生成汇编代码

汇编阶段

汇编码——>机器码(0、1组成的二进制序列,即源码)

在VS调试过程中右击可以转到反汇编看看汇编码:
这里写图片描述

动态链接和静态链接

动态库:是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。
动态链接过程:当程序运行到属于某个动态库libtest.so的某个函数func的时候,程序含有函数的入口地址,而被链接的动态库会被拷贝到虚拟内存的共享区,被所有需要该库的程序共用。
动态链接https://baike.so.com/doc/7741865-8015960.html
一份动态库可以被用到该库的所有进程共用,外部函数的机器码由操作系统从磁盘上复制到内存(虚拟内存的共享区)中的过程叫做动态链接。
这里写图片描述
静态链接https://baike.so.com/doc/7884671-8158766.html
静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。
静态链接的最大缺点是生成的可执行文件太大,需要更多的系统资源,在装入内存时也会消耗更多的时间。

待更新

下图显示四步分解过程编译结果,而通常情况下,我们直接gcc hello.c就是把这四步一气呵成,生成了默认名为a.out的可执行程序。
这里写图片描述

处理器读并解释存储在内存中的指令

命令行解释器:
在Linux系统中,一切皆文件,操作系统只认识的二进制源码,而使用者只认识文本文档,而shell(命令行解释器)充当了这个翻译官。

shell输出一个提示字符,等待输入一个命令行,然后执行这个命令。如果该命令的第一个单词不是内置的shell命令(例如ls、cd、pwd、mkdir、rm等等),那么shell就会假设这是一个可执行文件的名字,它将加载并运行这个文件(例如上述的hello)。

shell的命令行解释器功能:接受用户键入的命令,进行分析,创建子程序,由子程序实现命令所规定的功能,等子程序执行完之后,发出提示符。

系统的硬件组成

总线
贯穿整个系统的是一组电子管道,称作总线,它携带信息字节并负责在各个部件间传递。通常总线被设计成传送定长的字节块,也就是字。字中的字节数(即字长)是一个最基本的系统参数。大多数机器字长要么是4字节(32位),要么是8字节(64字节)。

I/O设备

待更新

猜你喜欢

转载自blog.csdn.net/Vickers_xiaowei/article/details/82593755
今日推荐