目录
1.信息就是位+上下文
1.1hello程序 文件名为hello.c的文本文件
文本文件和二进制文件:
文本文件是指以ASCII码方式(也称文本方式)存储的文件,后面基于 utf-8 编码的文本文件,utf-8是能够向后兼容ASCII,即相同的ASCII文本文件和UTF-8文本文件完全一致。它是一种典型的顺序文件,其文件的逻辑结构又属于流式文件。
二进制文件:是基于值编码的文件,你可以根据具体应用,指定某个值(可以看作是自定义编码)。
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
1.2大部分现代计算机系统用ASCII标准来表示文本字符
ASCII
7 位或8 位二进制数组合来表示128 或256 种可能的字符,网上有ascii标准表(略)
文本字符
每个字节表示程序中的某些文本字符
字节
(简单的解释)8个位组成一组
(详细的解释) 8个二进制位构成1个"字节(Byte)",它是存储空间的基本计量单位。1个字节可以储存1个英文字母或者半个汉字,换句话说,1个汉字占据2个字节的存储空间。
位
只由0,1组成又称比特(bit)
1.3 hello程序说明一个基本思想
系统中所有信息——包括磁盘信息,内存中的程序,内存中存放的用户数据以及网络上传送的数据都是由一串比特(位)表示
1.4区分数据对象唯一方法
读取数据对象的上下文(比如不同上下文中,一个同样的字节队列,表示不同的东西)
2源程序到可执行程序的过程(编译过程):四个阶段
linux命令 gcc -o hello hello.c
(源程序无法直接被机器执行,高级语言必须转化成低级机器语言)
预处理阶段:预处理器将头文件引入程序文本中,生成新的hello程序,.i作为扩展名
编译阶段:编译器将hello.i翻译成hello.s,包含一个汇编语言程序。里面包含main定义
汇编阶段:汇编器将hello.s翻译成机器语言指令,打包为二进制文件hello.o(美其名曰:可重定位目标程序。文本编辑器打开是乱码)
链接阶段:hello程序调用了printf函数,函数存在于printf.o的文件中,链接器合并,得到hello.o.可被加载到内存中,有系统执行。
3.了解编译系统的益处
3.1优化编译性能(第三,五,六章解答)
一个switch语句是否总是比一系列的if-else语句高效?
一个函数调用开销有多大?
while循环比for循环更有效么 ?
指针引用比数组索引更有效么?
为什么将求和的结果放到一个本地变量中,会比其放到一个通过引用传递过来的参数中,运行快得多呢?
为什么我们只是简单的重新排列一下算术表达式的括号就能让函数运行的更快?
3.2理解链接时出现的错误(第七章解答)
链接器报告说它无法解析一个引用什么意思?
静态变量与局部变量的区别?
不同的c文件定义名字相同的全局变量会发生什么?
静态库与动态库的区别?
在命令行上排列库的顺序有什么影响?
为什么有些链接错误直到运行才出现?
3.3避免安全漏洞(第三章解答)
安全漏洞主要原因 缓冲区溢出错误
程序员缺少限制不受信任的源接收数据的数量和格式
理解数据和控制信息存储在程序栈上的方式引起的后果。
4.系统硬件组成
4.1.总线
贯穿系统的电子管道
携带信息字节并负责在各个部件间传递
4.2.I/O设备
系统与外部连接的联系通道
键盘,鼠标,显示器,磁盘
4.3.主存(CRAM)
临时存储设备
存放程序和处理程序的数据
4.4.处理器(CPU)
核心:程序计数器(PC),指向某条机器指令
执行指令操作
①、加载:把一个字节或者一个字从主存复制到寄存器,以覆盖寄存器原来的内容
②、存储:把一个字节或者一个字从寄存器复制到主存的某个位置,以覆盖这个位置上原来的内容
③、操作:把两个寄存器的内容复制到 ALU,ALU 对这两个字做算术操作,并把结果存放到一个寄存器中,以覆盖寄存器原来的内容
④、跳转:从指令本身中抽取一个字,并将这个字复制到程序计数器(PC)中,以覆盖PC中原来的内容
(最好之前做过实验,理论不太直观)
5.运行hello程序
linux命令 ./hello
想要在 Linux 系统中运行该可执行程序,我们要将它的文件名输入到称为外壳(shell)的应用程序中,外壳是一个命令行解释器,它输出一个提示符,等待你输入一个命令,然后执行这个命令。如果该命令行的第一个单词不是一个内置的外壳命令,那么外壳就会假设这是一个可执行文件的名字,它将加载并运行这个文件。
初始时,外壳程序执行它的指令,等待我们输入一个命令。当我们在键盘上输入字符串"./hello"后,外壳程序将字符逐一读入到寄存器中,再把它放入到存储器中,如下图:
当我们在键盘上敲回车键的时候,外壳程序知道我们已经结束了命令的输入。然后外壳执行一系列指令来加载可执行的 hello 文件,将 hello 目标文件中的代码和数据从磁盘复制到主存。数据包括最终会被输出的字符串“Hello World\n”,一旦目标文件中的代码和数据被加载到主存,处理器就开始执行 hello 程序的 main 程序中的机器语言指令。这些指令将“Hello World\n” 字符串中的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上。