CSAPP - Ch 1 - 计算机系统漫游
0 序言及摘要
(1) 序言:
CS:APP —— Computer Systems: A Programmer's Perspective, 中译本名为: 《深入理解计算机系统》.
从书名可以得知:
大部分系统书籍都是从 构建者的角度 来写, 讲述如何实现硬件或系统软件, 包括操作系统、编译器和网络接口;
而 CS:APP 是从 程序员的角度 出发, 讲述应用程序员如何能够利用系统知识来编写出更好的程序, 涉及到系统的硬件架构、操作系统、编译器、网络等基础方面.
(2) 摘要:
计算机系统是由一个硬件和系统软件组成的, 它们共同协作以运行应用程序. 计算机内部的信息被表示为一组组的位, 他们依据上下文有不同的解释方式. 程序被其他程序翻译成不同的形式, 开始时是ASCII文本, 然后被编译器和链接器翻译成二进制可执行文件.
处理器读取并解释存放在主存里的二进制指令. 因为计算机花费了大量的时间在内存、I/O设备和CPU寄存器之间复制数据, 所以将系统中的存储设备划分成层次结构 —— CPU寄存器在顶部, 接着是多层的硬件高速缓存存储器、DRAM主存和磁盘存储器.
更高层的存储设备比低层的存储设备读写更快、单位比特造价也更高.
较高层次的存储设备可以作为较低层次设备的高速缓存.
操作系统内核是应用程序和硬件之间的媒介, 它提供三个基本的抽象:
a. 文件是对I/O设备的抽象;
b. 虚拟内存是对贮存和磁盘的抽象;
c. 进程是处理器、主存和I/O设备的抽象.
网络提供了计算机系统之间通信的手段 —— 可以把网络当作是一种I/O设备.
1 信息就是位+上下文
以下面的C程序hello.c为例:
#include <stdio.h>
int main() {
printf("hello, world\n");
return 0;
}
源程序实际上就是一个由0、1组成的位(bit, 比特)序列, 8个位被组成一组, 就是一个字节(Byte). 每个字节表示程序中的某些文本字符.
大部分现代计算机系统都适用ASCII标准来表示文本字符 —— 实际上就是用一个唯一的单字节大小的整数值来表示每个字符, 比如
#由35表示, i由105表示.
hello.c程序是以 字节序列 的方式储存在文件中的, 每个字节都有一个整数值, 对应某些特定的字符.
注意: 每一行都是以一个看不见的换行符
\n结束的, 对应的ASCII码是10.
hello.c的表示方法说明一个基本思想:
系统中的所有信息——包括磁盘文件、内存中的程序、内存中存放的用户数据, 以及网络上传输的数据, 都是由一串比特表示的.
区分不同数据对象的唯一方法就是我们读到这些数据对象时的上下文.
读书笔记: 上下文: 可以类比文章的前后文, 一个单独的int, 我们并不能明确地知道它的实际作用, 只有给出相邻的比特, 我们才能确定它的具体含义. 比如hello.c中, 由int的上下文可以知道, 这里的int是指明当前函数的返回值类型为int(整型).
2 程序被其他程序翻译成不同的格式
像上面的hello.c是我们开发人员可以看懂的高级语言编写的源代码文件, 要在系统上运行, 就必须通过其他程序将其转化为一系列的低级 机器语言 指令, 然后再将这些指令大包围 可执行目标程序(目标文件), 并以二进制磁盘文件的形式存放起来.
在Unix系统上, 从源文件到目标文件的转化是由 编译器驱动程序 完成的:
gcc hello.c -o hello
这里通过GCC编译器驱动程序读取源程序文件hello.c, 并把它变异成一个可执行目标文件hello, 具体步骤为:

(1) 预处理阶段: 预处理器(cpp)根据以字符#开头的命令, 修改原始的C程序: 这里将读取引入的系统头文件stdio.h, 将它插入到源程序中文本, 得到另一个C程序, 一般为hello.i;
(2) 编译阶段: 编译器(ccl)将文本文件hello.i翻译成文本文件hello.s, 就是一个汇编语言程序;
(3) 汇编阶段: 汇编器(as)将hello.s翻译成机器语言指令, 把这些指令打包成一种叫做 可重定位目标程序 的格式, 并将结果保存在目标文件hello.o中 —— 是一个二进制文件;
(4) 链接阶段: hello.c中调用了printf打印函数, 这个函数是每个C编译器都提供的 标准C库 中的, 存在于printf.o的预编译好了的目标文件中, 在此阶段由链接器(ld)将printf.o合并到hello.o中, 最后得到hello文件 —— 可执行目标文件, 可以被加载到内存中由系统执行.
3 了解编译系统如何工作是大有益处的
(1) 优化程序性能
比如:
一个switch语句是否总是比if-else语句高效?
一个函数调用的开销有多大? while循环比for循环高效吗?
指针引用比数组索引更有效吗?
为什么将循环求和的结果放到一个本地变量中, 会比将其放到一个通过引用传递过来的参数中, 运行要快很多呢?
(2) 理解链接时出现的错误
一些最令人困扰的、难以定位的程序错误往往都和链接器操作有关. 比如:
链接器报告说无法解析一个引用是什么意思?
静态变量和全局变量的区别是什么?
静态库和动态库的区别是什么?
命令行上排列库的顺序有什么影响?
(3) 避免安全漏洞
缓冲区溢出错误是造成大多数网络和Internet服务器上安全漏洞的主要原因 —— 因为很少有程序开发人员能够理解 需要限制从不受信任的源接收数据的数量和格式.
安全编程的第一步就是理解 数据和控制信息存储在程序栈上的方式会引起的后果.
未完待续...
CSAPP - Ch 1 - 计算机系统漫游的更多相关文章
- CSAPP 第一章 计算机系统漫游
第一章 计算机系统漫游 C语言的起源:(系统级编程的首选) C语言与Unix操作系统关系密切 C语言小而简单:其设计由一个人掌控 C语言是为实践目的设计的:其设计用来实现Unix操作系统 C语言程序编 ...
- CSAPP之阅读笔记-计算机系统漫游(1)
最近在看CSAPP(深入理解计算机系统第二版),其实最新版是第三版.但是,我看了一下价格100多大洋,于是去老夫子旧书网上买了本第二版的,花了30多块钱.哈哈. 网上看了一些关于此书的书评,都说是本好 ...
- CSAPP:第一章计算机系统漫游
CSAPP:计算机系统漫游 关键点:上下文.程序运行.计算机系统抽象. 信息就是位+上下文一个程序的运行过程系统的硬件组成编译系统是如何工作的?一个程序的运行过程(c语言举例)计算机系统中的抽象 信息 ...
- CSAPP =1= 计算机系统漫游
思维导图 预计阅读时间:15min 阅读书籍 <深入理解计算机系统> 参考视频 [精校中英字幕]2015 CMU 15-213 CSAPP 深入理解计算机系统 课程视频 参考文章 < ...
- [CSAPP笔记][第一章计算机系统漫游]
计算机系统漫游 我们通过追踪hello程序的生命周期来开始对系统的学习—–从它被程序员创建,到系统上运行,输出简单的消息,然后终止.我们沿着这个程序的生命周期,简要介绍一些逐步出现的概念,专业术语和组 ...
- CSAPP学习笔记 第一章 计算机系统漫游
Ch 1.0 1.计算机系统是由硬件和系统软件组成的 2.本书阐述了计算机组件是如何工作的以及执行组件是如何影响程序正确性和性能的. 3.通过跟踪hello程序的生命周期来开始对系统的学习. #inc ...
- 《深入理解计算机系统》(CSAPP)读书笔记 —— 第一章 计算机系统漫游
本章通过跟踪hello程序的生命周期来开始对计算机系统进行学习.一个源程序从它被程序员创建开始,到在系统上运行,输出简单的消息,然后终止.我们将沿着这个程序的生命周期,简要地介绍一些逐步出现的关键概念 ...
- 【CSAPP】一、计算机系统漫游
一.位+上下文 文本文件 / 二进制文件: 文本文件是只由ASCII码构成的文件 二.从源代码到可执行文件的顺序 源代码 ——> 可执行文件(机器代码)共有四步: 全过程代码 gcc hello ...
- 六星经典CSAPP笔记(1)计算机系统巡游
CSAPP即<Computer System: A Programmer Perspective>的简称,中文名为<深入理解计算机系统>.相信很多程序员都拜读过,之前买的旧版没 ...
随机推荐
- Oracle JDK与OpenJDK到底有什么不同?
不知道各位developer平时是否有过疑问,Oracle JDK是什么,OpenJDK又是什么? Oracle JDK便是平常我们在windows系统上做开发使用的JDK,又称作SUN JDK.O ...
- IO流3
public class Test1 { public static void main(String[] args) throws Exception { //第二个参数,表示是否向末尾追加,tru ...
- JVM指令
本篇指令码表,参考自ASM文档手册,如果你对asm感兴趣,可到ASM官网下载手册学习. 一.本地变量操作指令(I,L,F,D,A这些前缀表示对int,long,float,double,引用进行操作) ...
- go 学习之路(三)
一.strings和strconv使用 1.strings.HasPrefix(s string,prefix string) bool :判断字符串s是否以prefix开头 2.stings.Has ...
- Linux基础管道管理
一.I/O重定向 标准输入,标准输出,标准错误 file descriptors (FD, 文件描述符或Process I/O channels); 进程使用文件描述符来管理打开的文件 [root@l ...
- webgl核心要素
WebGL是一种3D绘图标准,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的一个JavaScript绑定,提供硬件3D加速渲染, ...
- 为什么建立数据仓库需要使用ETL工具?
在做项目时是不是时常让客户有这样的困扰: 1.开发时间太长 2.花费太多 3.需要太多资源 4.集成多个事务系统数据总是需要大量人力成本 5.找不到合适的技能和经验的人 6.一旦建立,数据仓库无法足够 ...
- strstr函数使用中的一个错误解决
最近使用ESP8266的时候,联网的过程中需要使用strstr函数来读取串口发来的某些重要信息, 使用strstr函数发现某些时候能够正常返回需要寻找的字符串的指针,有些时候找不到,后来发现原来是这样 ...
- ssm访问不了后台
最近整理ssm,写完demo案例,无论如何都访问不了后台,百度了好多,终于解决了问题所在 先看页面信息: 因为一直报404错误,一直找路径是不是弄错了,或配置文件弄错了,仅仅这个配置文件都看了无数遍, ...
- .net软件开发脚本规范-JS标准
一. JS标准 新增页面表单检查方法名称固定为checkForm. 查询页面表单检查方法名称固定为checkSearchForm. 检查表单方法checkForm与checkSearchForm固定放 ...