深入理解计算机系统-计算机系统漫游-第一章

首先,本文部分采取蹩脚的中英文形式来表述。

我们从这个简单的hello.c文件来看看它的生命周期。

//This is our hello.c 
#include <stdio.h>
int main()
{
    printf("Hello world,fuck u man!\n");
    return 0;
}

源程序实际上就是一个由0/1组成的位序列,8 bit一组为一个Byte。大部分计算机都采用ASCII standard来表示文本字符,给字符和二进制数码一个链接的桥梁。比如在我们的#include这一部分,#对应是35(10进制),i对应是105(10进制),etc。

像hello.c this kinda file composed of ASCII "char"被称为文本文件,所有其他文件都被称为二进制文件。

说了这么多,我们想说得是,系统中的所有信息,including disk files、programs in the memory or data processing via the net都是由一串比特表示。

彩蛋:C 语言 是贝尔实验室的Dennis Ritchie老爷子创建的,后面慢慢完善标准,大部分Unix OS内核等工具或库都是由C语言编写,电子科大有个专业也叫嵌入式系统,估计也是深入学习C\C++的。对C语言的评价,萌新不敢开腔(四川话里,开腔就是说话),C语言是系统编程的首选,它的指针写起来还是让我很难受。同时,C还缺乏对一些抽象(我们之后再说)的显式支持,比如类、对象和异常。C++andJava这种程序就解决了这种问题。

我们现在来看看这个c程序,to run this .c -file in the system,every c sentence must be converted into low-class machine-oriented language instructions。然后这些指令再按照一种可执行目标程序的格式打好包,并以二进制磁盘文件的形式存放起来。

GCC编译器中:

首先是hello.c源程序(文本)经过预处理器变成修改了的源程序(文本)hello.c,然后再经过编译器(ccl)变成汇编程序(文本)hello.s(高级语言转化成输出语言),再经过汇编器(as)变成可重定位的目标二进制程序hello.o(将汇编语言程序翻译成机器语言指令序列,打包成.o二进制文件),然后再引入printf.o通过链接器ld变成hello这个可执行目标二进制程序。这几个“器”一起构成了编译系统。通过这几个器的过程也被称为某某阶段。

我们再看看系统的硬件组成:

对于计算机系统,主要的硬件是总线,I/O,主存,处理器,我不写了,大学计算机基础而已。

然后再运行hello程序的时候:

(南京大学教授的ppt)

理解这样一个过程最好别用windows的系统,我们可以用ubuntu的终端来理解,I/O设备输入,经过I/O桥读入到寄存器当中,再把信息读入到内存当中。当我们敲下回车键的时候,shell就知道我们已经结束了命令的输入。然后shell执行指令加载可执行的hello文件,这些指令将hello目标文件中的代码和数据从文件所依附的磁盘复制到主存。一旦代码和数据被加载到了主存,处理器就执行机器语言指令,这样hello world这句话就到了寄存器中,再从寄存器到了I/O设备(显示器)。然后你的控制台就会显示:

Hello world,fuck u man!

提一下,我们把寄存器当成I/O设备和计算机系统交互的中介来看待,input进去先得见到寄存器,output出来也得见到它

先到这吧,我们改天继续看看高速缓存。

猜你喜欢

转载自blog.csdn.net/qq_42229034/article/details/82349084