《程序是怎样跑起来的》读书笔记
读完这本书之后我后悔了,后悔我没有早点读到它。后悔我没有在学《计算机组成原理》之前读完这本书。
这本书完全可以作为《计算机组成原理》这门课的先导课,它回避了计算机组成中的一些比较复杂难懂的知识,而把目光集中于,在“计算机运行程序”这一个整体的过程中,计算机中发生了什么。
声明:本篇内容只为作者本人使用,如有任何问题,与本人无关
内容不固定,随时更新
HightLight
第一章 对程序员来说CPU是什么
- CPU所负责的就是解释和运行最终转换成机器语言的程序内容
- 内存的存储场所通过地址编号来区分,而寄存器的种类则通过名字来区分
- 其中,数据分为“用于运算的数值”和“表示内存地址的数值”两种。数据种类不同,存储该数值的寄存器也不同
- 用于运算的数值放在累加寄存器中存储,表示内存地址的数值则放在基址寄存器和变址寄存器中存储
- 程序计数器、累加寄存器、标志寄存器、指令寄存器和栈寄存器都只有一个
- 无论当前累加寄存器的运算结果是负数、零还是正数,标志寄存器都会将其保存(也负责存放溢出和奇偶校验的结果 )
- 函数调用使用的是 call 指令,而不是跳转指令
- return 命令的功能是把保存在栈中的地址设定到程序计数器中
- 实际地址 = 基址寄存器 + 变址寄存器
第二章 数据是用二进制数表示的
- IC的一个引脚只能表示两种状态
- 移位后需要在最高位补 0类似于霓虹灯往右滚动的效果这就称为逻辑右移
- 将二进制数作为带符号的数值进行运算时,移位后要在最高位填充移位前符号位的值(0 或 1)。就称为算术右移
- 只有在右移时才必须区分逻辑位移和算术位移
第三章 计算机进行小数运算时出错的原因
- 尾数部分用的是“将小数点前面的值固定为 1 的正则表达式”,而指数部分用的则是“EXCESS系统表现”
- EXCESS系统表现是指,通过将指数部分表示范围的中间值设为 0,使得负数不需要用符号来表示
- 计算机运行的过程中如何避免浮点数出错的问题?
- 首先是回避策略,即无视这些错误
- 另一个策略是把小数转换成整数来计算
第四章 熟练使用有棱有角的内存
- 队列一般是以环状缓冲区(ring buffer)的方式来实现的
第五章 内存和磁盘的亲密关系
- 磁盘缓存指的是把从磁盘中读出的数据存储到内存空间中的方式
- 虚拟内存是指把磁盘的一部分作为假想的内存来使用
- 虚拟内存的方法有分页式和分段式两种。Windows 采用的是分页式。该方式是指,在不考虑程序构造的情况下,把运行的程序按照一定大小的页(page)进行分割,并以页为单位在内存和磁盘间进行置换
- 一般情况下,Windows 计算机的页的大小是 4KB
- 多个应用可以共有同一个 DLL 文件
- DLL 文件还有一个优点就是,在不变更 EXE文件的情况下,只通过升级 DLL 文件就可以更新
- 栈清理处理指令不是程序记述的,而是在程序编译时由编译器自动附加到程序中的。编译器默认将该处理附加在函数调用方
- 另外,在C 语言中,函数的返回值,是通过寄存器而非栈来返回的
- 栈一般是用来实现函数调用机制的。如果想任意利用栈,程序员就需要自己用程序来实现所需要的栈机制
- 扇区是对磁盘进行物理读写的最小单位。Windows 中使用的磁盘,一般 1 个扇区是 512 字节。不过,Windows 在逻辑方面(软件方面)对磁盘进行读写的单位是扇区整数倍簇?
- 不管是硬盘还是软盘,不同的文件是不能存储在同一个簇中的,否则就会导致只有一方的文件不能被删除
第六章 亲自尝试压缩数据
- 在任何情况下,文件中的字节数据都是连续存储的
- 像这样,把文件内容用“数据 ×重复次数”的形式来表示的压缩方法称为 RLE(Run Length Encoding,行程长度编码)
- 我们把能还原到压缩前状态的压缩称为可逆压缩,无法还原到压缩前状态的压缩称为 非可逆压缩
第七章 程序是在何种环境中运行的
- 引导程序是存储在启动驱动器起始区域的小程序
- 引导程序的功能是把在硬盘等记录的 OS 加载到内存中运行
- OS 并不能自己启动自己
第八章 从源文件到可执行文件
- “想要买的是何种编程语言用的编译器”“编译器生成的本地代码是用于哪种 CPU 的”以及“该编译器是在什么环境下使用的”
- 在程序运行时,虚拟的内存地址会转换成实际的内存地址。链接器会在 EXE 文件的开头,追加转换内存地址所需的必要信息。这个信息称为再配置信息。
- EXE 文件的再配置信息,就成为了变量和函数的相对地址
第九章 操作系统和应用的关系
- 仅具有加载和运行功能的监控程序
- 基本的输入输出部分的程序就被追加到了监控程序中
- 初期操作系统 = 监控程序 + 基本输入输出程序
- Windows 是通过时钟分割技术来实现多任务功能的
第十章 通过汇编语言了解程序的实际构成
- 汇编语言的源代码,是由转换成本地代码的指令(后面讲述的操作码)和针对汇编器的伪指令构成的
- 编译后在函数名前附带上下划线(_),是Borland C++ 的规定
- 在函数内部利用的寄存器,要尽量返回到函数调用前的状态
第十一章 硬件控制方法
- I/O 控制器中有用于临时保存输入输出数据的内存。这个内存就是端口
- 一个 I/O 控制器既可以控制一个外围设备,也可以控制多个外围设备。各端口之间通过 端口号进行区分。端口号也称为 I/O 地址
- 这是因为,为了保护系统安全,现在的 Windows 禁止了应用直接控制硬件的方式
- 大部分的外围设备,都会频繁地发出中断请求。其原因就是为了实时处理从外围设备输入的数据
第十二章 让计算机“思考”
略