学习笔记--运行一个hello.c程序时,整个计算机系统如何运作?

1. 生成hello.c文件

程序员利用文本编辑器(如sublime, notepad等)写c语言代码,并保存为hello.c文件。

//hello.c
#include 

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

此时,hello.c文件属于用户数据,被存放在磁盘上。此程序实际上就是一个由1和0组成的位序列,每8 bit被组织为一组即1byte。hello.c程序以字节序列的形式存储在文件中,每个字节对应一个整数值,同时每个整数值对应于某个字符。

(PS<_>)上面那段话的含义是:源程序(如#include )中的每个字符(#/i/n/c/l/u/d/e...)都对应于一个整数(ASCII码一一对应),此整数可以用1byte/8bit的二进制数表示,以此二进制形式存储在磁盘上。但是hello.c文件实际上是一个只由ASCII字符构成的文本文件,即直接可读的文件。

系统中所有的信息--包括磁盘文件、存储器中的程序、存储器中存放的用户数据及网络上传送的数据,都是由一串bit表示的。

2. 编译、链接

为了在系统上运行hello.c程序,每条c语句都必须被转化为一系列机器语言指令,然后将这种机器语言指令按照 可执行目标程序 的格式打包,并以二进制磁盘文件的形式存放起来。从源文件hello.c到可执行目标文件是由编译器驱动程序完成的。如常用的gcc编译器驱动程序。

编译指令:

gcc -o hello hello.c

计算机的编译系统如下:

图1. 计算机编译系统

3. 运行hello程序

在shell中输入程序运行指令并回车,即可运行hello程序并在shell中输出运行结果。

程序运行指令:

./hello

下图表示了从键盘上读取hello命令,将输出字符串从内存写到显示器的整个过程。当程序员在键盘上输入字符串"./hello"后,shell将字符逐一读入寄存器,再将它放到存储器中,如图2中红色线条。当在键盘上输入回车之后,shell知道程序员已经结束了命令输入,shell开始加载可执行的hello文件,将可执行目标文件hello中的代码和数据从磁盘复制到主存储器。一旦目标文件中的代码和数据被加载到主存储器,处理器(CPU)就开始执行hello程序中的main()函数中的机器语言指令。这些指令将输出字符串"hello, world\n"从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上。此过程如图3中的紫色线条。

图2. 从键盘上读取hello命令
图3. 将输出字符串从内存写到显示器

本篇文章是学习《深入理解计算机系统》之后的学习笔记,后续随着对知识的深入理解随时更新。

你可能感兴趣的:(学习笔记--运行一个hello.c程序时,整个计算机系统如何运作?)