前言
- 计算机能运作,是基于硬件和软件来运行程序,系统会追着时间方式不断变化,但是内在的概念基本不会改变,所以单纯的学习新的工具,短期内收益增加会明显,但是长期来看,缺乏核心竞争力(-毕竟体力和精神力无法和年轻人相比),
这样就会出现吃青春饭的现象,所以学习机器内在运行原理非常重要,因为这块儿东西,需要花费大量时间去学习和研究,是达到某个高点的必经之路.所以来学习这本教材
1.1 信息就是 位 + 上下文
程序的生命周期是从一个源程序(或者说源文件)开始的(比如我创建了一个hello.c的文件,并保存),这些文件本质上由值0 和 1 组成的位(又称 为比特)序列,8 个位被组织成一组,称为字节。每个字节表示程序中的某些文本字符,
就想下图,一个字节对应一个数值,比如
等于10,#号对应的是35,
hello.c的表示方法说明一个基本思想,系统终所有的信息,例如你能看到的文件,磁盘上的文件,都是比特表示的, 区分不同对象的唯一方法是上下文,一不同的上下文表达不同的数据
- c语言编译成二进制可运行流程
练习
vi hello.c
#include <stdio.h> 2
int main()
{
printf("hello, world
");
:return 0;
}
[root@instance-bhrt87fn code]# gcc -o hello hello.c # 编译hello.c文件
[root@instance-bhrt87fn code]# ls
hello hello.c # hello 是被创建的可执行的二进制文件
[root@instance-bhrt87fn code]# ./hello
hello,word!
1.2 系统的硬件组成
- 了解硬件组织有助于我们更深入了解运行hello 程序时发生了什么
- Intel系统产品族的模型图
总线
- 贯穿整个系统的一组电子管道,它主要负责携带和传递信息,通常总线被设计成传送定长的字节块(字 word),4个字节(32位),8个字节(64位)
I/O 设备
- I / 0 (输 入 / 输 出 )设 备 是 系 统 与 外 部 世 界 的 联 系 通 道, 示 例 系 统 包 括 四 个 I / O 设 备 :作为用户输入的键盘和鼠标,作为用户输出的显示器,以及用于长期存储数据和程序 的磁盘驱动器(简单地说就是磁盘)。最开始,可执行程序h e l l o 就存放在磁盘上。
每个I/O 设备都通过一个控制器或适配器与I/O 总线相连。控制器和适配器之间的区别主要在于它们的封装方式。控制器是I/O 设备本身或者系统的主印制电路板(通常称作 主板)上的芯片组。而适配器则是一块插在主板插槽上的卡。无论如何,它们的功能都是 在 I/O 总线和I/O 设备之间传递信息。
主存(临时存在变量的地方)
- 主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。从 物理上来说,主存是由一组动态随机存取存储器(DRAM)芯片组成的。从逻辑上来说,存储 器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引),这些地址是从零开始 的。一般来说,组成程序的每条机器指令都由不同数量的字节构成。与 C 程序变量相对应的 数据项的大小是根据类型变化的。比如,在运行Linux的 x86-64机器上,short类型的数据 需 要 2 个 字 节 ,i n t 和 f l o a t 类 型 需 要 4 个 字 节 ,而 l o n g 和 d o u b l e 类 型 需 要 8 个 字 节
处理器
- 中央处理单元(CPU), 简称处理器,是解释(或执行)存储在主存中指令的引擎。处理
器的核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器(PC)。在任何时 刻 ,P C 都指向主存中的某条机器语言指令(即含有该条指令的地址) - 从系统通电开始,直到系统断电,处理器一直在不断地执行程序计数器指向的指令, 再更新程序计数器,使其指向下一条指令。处理器看上去是按照一个非常简单的指令执行 模型来操作的,这个模型是由指令集架构决定的。在这个模型中,指令按照严格的顺序执 行 ,而执行一条指令包含执行一系列的步骤。处理器从程序计数器指向的内存处读取指 令,解释指令中的位,执行该指令指示的简单操作,然后更新P C ,使其指向下一条指令, 而这条指令并不一定和在内存中刚刚执行的指令相邻。
- 这样的简单操作并不多,它们围绕着主存、寄存器文件(register file)和算术/逻辑单 元(ALU)进行。寄存器文件是一个小的存储设备,由一些单个字长的寄存器组成,每个 寄存器都有唯一的名字。A L U计算新的数据和地址值。下面是一些简单操作的例子, CPU在指令的要求下可能会执行这些操作。
•加 载 :从主存复制一个字节或者一个字到寄存器,以覆盖寄存器原来的内容。
•存 储 :从寄存器复制一个字节或者一个字到主存的某个位置,以覆盖这个位置上原
来的内容。
•操作:把两个寄存器的内容复制到ALU, ALU对这两个字做算术运算,并将结果
存放到一个寄存器中,以覆盖该寄存器中原来的内容。
•跳 转 :从指令本身中抽取一个字,并将这个字复制到程序计数器(P C )中,以覆盖
P C 中原来的值。
1.3 运行hello 程序的生命周期
- 用户开始通过shell程序执行'./hello' 后,shell将字符串逐一写入寄存器,然后把它帮到内存中,一旦目标文件h e llo 中的代码和数据被加载到主存
- 处理器就开始执行hello程序的main程序中的机器语言指令。这些指令将“hello world'n” 字符串中的字节从主存 复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上。
c语言的小知识
•C 语言是贝尔实验室的Dennis Ritchie于 1969年 〜 1973年间创建的。美国国家标准学
会(American National Standards Institute, ANSI)在 1989 年颁布了 ANSI C 的标准,后来 C 语言的标准化成了国际标准化组织(International Standards Organization, ISO)的责任。这 些标准定义了 C 语言和一系列函数库,即所谓的C 标准库。Kernighan和 Ritchie在他们的 经典著作中描述了 ANSI C , 这本著作被人们满怀感情地称为“K&R” [61]o 用 Ritchie的话 来说[92], C 语 言 是 “古怪的、有缺陷的,但同时也是一个巨大的成功"。为什么会成功呢?
•C 语言小而简单。C 语言的设计是由一个人而非一个协会掌控的,因此这是一个 简洁明了、没有什么冗赘的设计。K & R 这本书用大量的例子和练习描述了完整 的 C 语言及其标准库,而全书不过2 6 1页。C 语言的简单使它相对而言易于学 习,也易于移植到不同的计算机上。
•C 语 言 是 为 实 践 目 的 设 计 的 。 C 语 言 是 设 计 用 来 实 现 U n i x 操 作 系 统 的 。 后 来 , 其他人发现能够用这门语言无障碍地编写他们想要的程序。
C 语言是系统级编程的首选,同时它也非常适用于应用级程序的编写。然而,它也 并非适用于所有的程序员和所有的情况。C 语言的指针是造成程序员困惑和程序错误的 一个常见原因。同时,C 语言还缺乏对非常有用的抽象的显式支持,例如类、对象和异 常 。像 C + + 和 J a v a 这 样 针 对 应 用 级 程 序 的 新 程 序 语 言 解 决 了 这 些 问 题 。
- 说明:所有知识来自<<深入理解计算机系统>>( csapp ) 这本书 和自己的总结,仅供学习和交流,侵权删除.