第 1 章 计算机系统漫游
计算机系统是由硬件和系统软件组成的,它们共同工作来运行应用程序。
虽然系统的具体实现方式随着时间不断变化,但是系统内在的概念却没有改变。所有计算机系统都有相似的硬件和软件组件,它们又执行着相似的功能。
我们可以学习到:
- 如何避免由计算机表示数字的方式引起的奇怪的数字错误。
- 怎样通过一些小窍门来优化自己的 C 代码,以充分利用现代处理器和存储器系统的设计。
- 了解编译器是如何实现过程调用的。
- 如何利用这些知识来避免缓冲区溢出错误带来的安全漏洞。
- 如何识别和避免链接时那些令人讨厌的错误。
- 学会如何编写自己的 Unix shell、自己的动态存储分配包和自己的 Web 服务器。
- 认识并发带来的希望和陷阱。
以下是一个简答但贯穿全书的 hello 程序:
c
// code/intro/hello.c
#include <stdio.h>
int main()
{
printf("hello, world\n");
return 0;
}1.1 信息就是位+上下文
源程序实际上就是一个由值 0 和 1 组成的位(又称比特)序列,8 个位被组织成一组,称为字节。每个字节表示程序中的某些文本字符。
大部分的现代计算机系统都使用 ASCII 标准来表示文本字符,这种方式实际上就是使用一个唯一的单字节大小的整数值来表示每个字符。
hello.c 程序是以字节序列的方式储存在文件中的。每个字节都有一个整数值,对应于某些字符。
注意,每个文本行都是以一个看不见的换行符\n来结束的,它对应的整数值为10。
像 hello.c 这样只由 ASCII 字符构成的文件称为文本文件,所有其他文件都称为二进制文件。
系统中所有的信息——包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据,都是由一串比特表示的。区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。比如,在不同的上下文中,一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令。(这就是“信息就是位+上下文”的具体含义)