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 - 计算机系统漫游的更多相关文章

  1. CSAPP 第一章 计算机系统漫游

    第一章 计算机系统漫游 C语言的起源:(系统级编程的首选) C语言与Unix操作系统关系密切 C语言小而简单:其设计由一个人掌控 C语言是为实践目的设计的:其设计用来实现Unix操作系统 C语言程序编 ...

  2. CSAPP之阅读笔记-计算机系统漫游(1)

    最近在看CSAPP(深入理解计算机系统第二版),其实最新版是第三版.但是,我看了一下价格100多大洋,于是去老夫子旧书网上买了本第二版的,花了30多块钱.哈哈. 网上看了一些关于此书的书评,都说是本好 ...

  3. CSAPP:第一章计算机系统漫游

    CSAPP:计算机系统漫游 关键点:上下文.程序运行.计算机系统抽象. 信息就是位+上下文一个程序的运行过程系统的硬件组成编译系统是如何工作的?一个程序的运行过程(c语言举例)计算机系统中的抽象 信息 ...

  4. CSAPP =1= 计算机系统漫游

    思维导图 预计阅读时间:15min 阅读书籍 <深入理解计算机系统> 参考视频 [精校中英字幕]2015 CMU 15-213 CSAPP 深入理解计算机系统 课程视频 参考文章 < ...

  5. [CSAPP笔记][第一章计算机系统漫游]

    计算机系统漫游 我们通过追踪hello程序的生命周期来开始对系统的学习—–从它被程序员创建,到系统上运行,输出简单的消息,然后终止.我们沿着这个程序的生命周期,简要介绍一些逐步出现的概念,专业术语和组 ...

  6. CSAPP学习笔记 第一章 计算机系统漫游

    Ch 1.0 1.计算机系统是由硬件和系统软件组成的 2.本书阐述了计算机组件是如何工作的以及执行组件是如何影响程序正确性和性能的. 3.通过跟踪hello程序的生命周期来开始对系统的学习. #inc ...

  7. 《深入理解计算机系统》(CSAPP)读书笔记 —— 第一章 计算机系统漫游

    本章通过跟踪hello程序的生命周期来开始对计算机系统进行学习.一个源程序从它被程序员创建开始,到在系统上运行,输出简单的消息,然后终止.我们将沿着这个程序的生命周期,简要地介绍一些逐步出现的关键概念 ...

  8. 【CSAPP】一、计算机系统漫游

    一.位+上下文 文本文件 / 二进制文件: 文本文件是只由ASCII码构成的文件 二.从源代码到可执行文件的顺序 源代码 ——> 可执行文件(机器代码)共有四步: 全过程代码 gcc hello ...

  9. 六星经典CSAPP笔记(1)计算机系统巡游

    CSAPP即<Computer System: A Programmer Perspective>的简称,中文名为<深入理解计算机系统>.相信很多程序员都拜读过,之前买的旧版没 ...

随机推荐

  1. Codeforces比赛注意事项(英语比较好,能翻译题目的可以跳过此文章)

    由题目可知,这篇文章是讲翻译文章的. 当然不是教英语啦 其实cf的比赛对于本蒟蒻最大的挑战就是翻译题目啦 所以我比赛时只能靠各种翻译器去无耻地翻译,然后读中文. 目前较好的翻译器有:百度,谷歌,有道. ...

  2. 基于SDN网络的负载均衡研究与实现

    为什么需要软件定义网络 1.网络缺乏可扩展性,创新正在停滞不前.   我们最新的研究发现,几乎每两个组织中就有一个认为需要将网络功能扩展为采用SDN的主要业务触发因素,而不是其他催化剂.这一统计数据一 ...

  3. PowerDesigner添加唯一键(mysql)

    1.打开Columns选项卡 2.选中要添加唯一键的字段 3.点击工具栏Create Key按钮,如图 4.打开创建key窗口,根据情况修改约束名称,不修改也可以 5.切换到mysql选项卡,选中“U ...

  4. Liunx环境下配置matplotlib库使用中文绘图

    最近在使用matplotlib库的过程中需要用到中文绘图,在网上找了好多种方法,最终用一种方法解决了,在此记录. 首先Linux是有自己的中文字体的,叫做"Droid Sans Fallba ...

  5. cookbook_元编程

    1给函数添加一个包装 问题:给函数加一个外包装层,已添加额外的处理,例如,记录日志,计时统计等 解决方案:可以定义一个装饰器来包装函数 2编写装饰器时如何保存函数的元数据 问题:当一个函数被装饰器装饰 ...

  6. Oracle 数据库登录、用户解锁、改密码、创建用户授权操作

    一.数据库登录1.常用账户: 管理员: sys主要练习操作用户: scott2.测试环境是否配置成功: 1.命令窗口 win+R -> cmd(以管理员身份运行) - > sqlplus ...

  7. 2.2.2python的BeautifulSoup库

    from bs4 import BeautifulSoupimport rebroken_html = '<ul class="country"><li>A ...

  8. 【Mac】解压文件夹中文乱码

    Mac 用的英文系统,发现下载含中文的文件后,解压为乱码,如图所示: 解决方法: 下载一个解压软件:"The Unarchiver" 安装后设置下,如图: 之后设置压缩文件的默认打 ...

  9. Sring 的 @AliasFor 使用规则

    一.该标签存在的意义 顾名思义 @AliasFor 表示别名,它可以注解到自定义注解的两个属性上,表示这两个互为别名,也就是说这两个属性其实同一个含义.该标签存在的含义,从网上查发现有个点, 若  自 ...

  10. Android 属性动画实战

    什么是属性动画? 属性动画可以通过直接更改 View 的属性来实现 View 动画.例如: 通过不断的更改 View 的坐标来实现让 View 移动的效果: 通过不断的更改 View 的背景来实现让 ...