第1章 计算机系统漫游(深入理解计算机系统)

1 #include <stdio.h>
2
3 int main()
4 {
5     printf("hello, world\n");
6 }

1.1 信息就是位+上下文

hello程序的声明周期是从一个源程序开始的,即程序员利用编辑器创建并保存的文本文件,文件名是hello.c。源程序实际上就是一个由值0和1组成的位(bit)序列,每8个位被组成成一组,称为字节。每个字节表示程序中的某个文本字符。

大部分的现在系统都使用ASCII标准来表示文本字符,这种方式就是用一个唯一的单字节大小的整数值来表示每个字符。hello.c以字节序列的方式存储在文件中,每个字节都有一个整数值,而该整数值对应于某个字符。例如,整数值35对应于字符‘#’,105对应与字符‘i’。像hello.c这样只由ASCII字符构成的文件称为文本文件,所有其他文件都称为二进制文件。

hello.c的表示方法说明一个:系统中所有的信息,包括磁盘文件、存储器中的程序。存储器中存放的用户数据以及网络上传送的数据,都是由一串位表示的。区分不同数据对象唯一的方法是我们读到这些数据对象时的上下文。

1.2 程序被其他程序翻译成不同的格式

hello程序的声明周期是从一个高级C语言程序开始的,为了在系统上运行,必须被其他程序转化为一系列的低级机器语言指令,然后按照一种称为可执行目标程序的格式打包好,并以二进制磁盘文件的形式存放起来。

在Unix系统上,从源文件到目标文件的转发时由编译器驱动程序完成的:

unix> gcc -o hello hello.c

GCC编译器驱动程序读取源文件hello.c,并把它翻译成一个可执行目标文件hello。这个翻译的过程分为四个阶段完成,如图1-3所示。执行这四个阶段的程序(预处理器、编译器、汇编器、链接器)一起构成了编译系统(compilation system)。

图1-3 编译系统

  • 预处理阶段。预处理器(cpp)根据以字符#开头的命令,修改原始的C程序。比如hello.c中第1行#include <stdio.h>命令告诉预处理器读取系统头文件stdio.h的内容,并把它直接插入到程序文本中,结果就得到了另一个C程序,通常是以.i作为文件扩展名。
  • 编译阶段。汇编器(ccl)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序。汇编语言程序中的每一条语句都以一种标准的文本格式确切地描述了一条低级机器语言指令。
  • 汇编阶段。汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标文件(relocatable object program)的格式,并将结果保存在目标文件hello.o中。hello.o文件是一个二进制文件,它的字节编码是机器语言指令而不是字符。如果在文本编辑器中打开将看到一堆乱码。
  • 链接阶段。hello程序调用了printf函数,它是每个C编译器都会提供的标准C库中的一个函数。printf函数存在于一个名为printf.o的单独的预编译好了的目标文件中。而这个文件必须以某种方式合并到我们的hello.o程序中。链接器(ld)就负责执行处理这种合并。结果就得到hello文件,它是一个可执行目标文件,被加载到内存中,由系统执行。

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

hello.c源程序已经被编译系统翻译成了可执行目标文件hello,并存放在磁盘上。要想在Unix系统上运行该可执行文件,需要将它输入到称为外壳(shell)的应用程序中:

unix> ./hello
hello, world
unix>

外壳是一个命令行解释器,它输出一个提示符,等待你输入一个命令行,然后执行这个命令。如果该命令行的第一个单词不是一个内置的外壳命令,那么外壳就会假设这是一个可执行文件的名字,它将加载并运行这个文件。

1.4.1 系统的硬件组成

如图1-4所示,这张图是Intel Pentium系统产品系列的模型。

1.总线

2.I/O设备

3.主存

4.处理器

1.7 操作系统管理硬件

当外壳加载和运行hello程序,以及hello程序输出自己的消息时,外壳和hello程序都没有直接访问键盘、显示器、磁盘或者主存。取而代之的是,它们依靠操作系统提供的服务。我们把操作系统看成是应用和硬件之间插入的一层软件,如图1-10所示。所有应用程序对硬件的操作尝试都必须通过操作系统。

操作系统有两个基本的功能:1)防止硬件被失控的应用程序滥用。2)向应用程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备。操作系统通过几个基本的抽象概念(进程、虚拟存储器和文件)来实现这两个功能。如图1-11所示,文件是对I/O设备的抽象表示,虚拟存储器是对储存和磁盘I/O设备的抽象表示,进程则是对处理器、主存和I/O设备的抽象表示。

虚拟机,提供对整个计算机(包括操作系统、处理器和程序)的抽象。

原文地址:https://www.cnblogs.com/cinvzi/p/9533097.html

时间: 2024-08-26 21:17:40

第1章 计算机系统漫游(深入理解计算机系统)的相关文章

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

计算机系统漫游 1.1 信息就是位+上下文 先看一个简单的Hello World C程序. 1 #include <stdio.h> 2 3 void main() 4 { 5 printf("Hello World!\n"); 6 } 这个程序的源文件是文本格式,以字节序列的方式存储在文件中,由一种叫ASCII码的方式编码.除了文本文件之外的其它文件都是二进制文件. 由HelloWorld程序的存储方式可以猜测,信息,包括磁盘文件.内存中运行的程序.内存中储存的用户数据以

深入理解计算机系统读书笔记之第一章:漫游

我是从豆瓣上看到好多人都在推荐这本书,于是就去借来读一读,昨天晚上用了好长时间来读这本书的第一章节,感觉这本书比较符合我(有些基础还不太明白,这本书详细的进行了讲解,很好). 下面写一下我的理解(顺便回顾一下知识) 第一节主要讲的是: A Tour of Computer Systems 以hello.c为例进行讲解,介绍这个程序如何从一个源程序变成可执行程序,再到执行,显示屏上出现“hello,world” ···········································

2018-2019-1 20189215 《深入理解计算机系统》第一章

第一章 计算机系统漫游 主要内容 全面精炼的概括了本书的内容,也就是"计算机系统概述",包括: 1.解释计算机系统中"信息"的概念:就是二进制位: 2.解释源程序(以C源程序为例)到可执行程序的过程:预处理 → 编译 → 汇编 → 链接 3.通过可执行程序被shell加载执行流程,讲解了计算机的硬件组成: 总线.I/O设备.主存.处理器. 4.高级缓存的作用以及计算机存储设备的体系结构--金字塔层次结构. 5.解释了操作系统.应用进程.计算机硬件三者之间的关系:操作

深入理解计算机系统读书笔记一 ---&gt; 计算机基础漫游

一.程序编译的不同阶段. 通常我们是以高级程序开发易于阅读的代码,我们通过语法规则推断代码的具体含义.但是计算机执行代码的时候就需要把代码解析成既定的可执行问题,计算机是如何处理的呢?这里以C语言hello.c文件为例来说明中间过程. #include <stdio.h> int main() { printf("hello world!\n"); } 先上张图. C语言源程序----预处理解析头文件和函数  --- 编译器解析成汇编语言 ---   翻译机器语言指令,打包

20135302魏静静——《深入理解计算机系统》第7章 学习笔记

<深入理解计算机系统>第7章   链接 本章主要内容: 链接——静态链接.动态链接(链接又包括两个主要任务:符号解析和重定位) 符号——全局符号和本地符号.符号表.符号解析 链接文件的创建及引用——gcc.ar rcs.sharedj及fPIC命令参数 重定位——重定位条目.重定位符号引用(PC相对引用和绝对引用) 目标文件——可重定位目标文件(其中又详细介绍了ELF可重定位文件的结构及格式).可执行目标文件.共享目标文件 链接(linking)是将各种代码和数据部分收集起来并组合成为一个单一

深入理解计算机系统(序章)------谈程序员为什么要懂底层计算机结构

万丈高楼平地起,计算机系统就像程序员金字塔的地基.理解了计算机系统的构造原理,在写程序的道路上才能越走越远.道理LZ很早就懂了,可是一直没下定决心好好钻研,或许是觉得日常工作中根本用不到这些,又或许是每次拿起书看到那些复杂的底层架构,看到存储器,寄存器,CPU,总线等等这些概念就头大.总之,由于各种各样的原因,对这块的知识一直没有认真花时间去钻研.那么你可能会问,那你写这篇博客的题目不就是准备学习这方面的知识吗?是的,LZ 准备下定决心钻研了,至于原因如下: ①.经常用一些不知其所以然的技术,会

《深入理解计算机系统》读书笔记第七章——链接

<深入理解计算机系统>第七章 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或拷贝)到存储器并执行. 链接的时机 编译时,也就是在源代码被翻译成机器代码时 加载时,也就是在程序被加载器加载到存储器并执行时. 运行时,由应用程序执行. 在现代系统中,链接是由链接器自动执行的. 7.1 编译器驱动程序 编译系统提供编译驱动程序——调用语言预处理器.编译器.汇编器和链接器. (1)运行C预处理器:源程序main.c->ASCII码中间文件main.i (2)

第七章读书笔记《深入理解计算机系统》

第七章 读书笔记<深入理解计算机系统> 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或拷贝)到存储器并执行. 链接可以执行于编译时,也就是在源代码被翻译成机器代码时:也可以执行于加载时,也就是在程序被加载器加载到存储器并执行时:甚至执行于运行时,由应用程序来执行. 在早期的计算机系统中,链接是手动执行的.在现代系统中,链接是由叫链接器的自动执行的. 7.1 编译器驱动程序 1.大部分编译系统提供编译驱动程序:代表用户在需要时调用语言预处理器.编译器.汇编器

深入理解计算机系统之旅(一)计算机系统漫游

1.计算机系统是什么? 我们直观的可以看到的计算机系统就是一台电脑,包括主机.显示器.键盘鼠标,然后显示器上会显示不同界面,用鼠标点击,键盘输入界面就会相应操作. 2.深入一点,他们是如何工作的? 计算机系统是由硬件和系统软件组成,它们共同工作来运行应用程序. 3.再深入一点,硬件是什么?系统软件是什么?应用程序是什么? 硬件是组成计算机系统的基础,大家耳熟能详的就是CPU.内存.硬盘.主板等. 系统软件是运行在硬件之上的一层控制软件,就是我们经常听到的Windows XP.WIN7.Linux

《深入理解计算机系统》第七章 链接

<深入理解计算机系统>第七章 链接 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(货被拷贝)到存储器并执行. 链接的时机 编译时,也就是在源代码被翻译成机器代码时 加载时,也就是在程序被加载器加载到存储器并执行时 运行时,由应用程序执行 链接器使分离编译称为可能. 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或拷贝)到存储器并执行. 链接可以执行于编译时,也就是在源代码被翻译成机器代码时:也可以执行于加载时,也就是在程序