字符命令存储过程
IO设备
每个I/O设备都通过一个控制器或适配器与I/O总线相连。适配器和控制器的功能都是在I/O设备和I/O总线之间传递信息。
我们在键盘输入信息,在我们输入完信息,按下enter键时,信息会经总线被存储到磁盘中。
总线
贯穿整个系统的是一组电子管道,称作总线,它携带信息字节并负责在各个部件间传递。通常总线被设计成传送定长的字节块,也就是字。字中的字节数(即字长)是一个最基本的系统参数。大多数机器字长要么是4字节(32位),要么是8字节(64字节)。
命令行解释器
操作系统只认识的二进制源码,而使用者只认识文本文档,而shell(命令行解释器)充当了这个翻译官。shell输出一个提示字符,等待输入一个命令行,然后执行这个命令。如果该命令的第一个单词不是内置的shell命令,那么shell就会假设这是一个可执行文件的名字,它会将hello目标文件中的代码和数据从磁盘复制到主存。
shell的命令行解释器功能:接受用户键入的命令,进行分析,创建子程序,由子程序实现命令所规定的功能,等子程序执行完之后,发出提示符。
编译
#include<stdio.h>
int main()
{
printf("hello,world\n");
return 0;
}
这是众所周知的hello,world,今天我认识到了打印hello,world也是一件十分复杂的过程:由程序员编写的文本文件hello.c开始,经历预处理、编译、汇编、链接,其中需要计算机系统输入设备、输出设备、CPU、内存控制器、总线、缓存、寄存器等硬件设备的支持与合作,还需要操作系统以及系统工具等软件资源的协调与管理。
下图显示四步分解过程编译结果,而通常情况下,我们直接gcc hello.c
就是把这四步一气呵成,生成了默认名为a.out的可执行程序。
预处理
- 展开头文件
- 宏替换
- 条件编译
- 去注释
编译
检查语法错误------>生成汇编代码
汇编
汇编码------>机器码(0、1组成的二进制序列,即源码)
链接
动态链接
当程序运行到属于某个动态库libtest.so的某个函数func的时候,程序含有函数的入口地址,而被链接的动态库会被拷贝到虚拟内存的共享区,被所有需要该库的程序共用。 一份动态库可以被用到该库的所有进程共用,外部函数的机器码由操作系统从磁盘上复制到内存(虚拟内存的共享区)中的过程叫做动态链接。
动态库:是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。
静态链接
静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。 静态链接的最大缺点是生成的可执行文件太大,需要更多的系统资源,在装入内存时也会消耗更多的时间。
执行环境
加载
处理器的核心是一个大小为一个字的存储设备(寄存器),称为程序计数器(PC)。在任何时候PC都要指向主存中的某条机器语言指令(即存储了该指令的地址)。从通电开始,处理器一直不断地执行程序计数器指向的指令。从主存中复制一个字节或一个字到寄存器,以覆盖原来的内容的过程叫做加载。
执行
程序从main函数开始执行,这个时候程序将会使用一个运行时堆栈来存储自己的局部变量和返回地址。程序运行起来会形成至少一个进程,进程控制块是操作系统调度的调度的基本单位。
程序结束:程序执行完毕正常终止,也有可能意外终止。