CSAPP深入理解计算机系统笔记 第1章 计算机系统漫游 知识点总结,详细

  • 信息就是位+上下文
    • 概念
      • 1.计算机系统是由硬件和系统软件组成的。
      • 2. hello程序的生命周期:创建—编译—运行—退出。
      • 3. Hello程序的生命周期是从一个源程序(源文件)开始的。
      • 源程序(源文件):程序员通过编辑器创建并保存的文本文件,文件名是hello.c。
      • 4.源程序实际上是一个由值0和1组成的位(又称比特)序列,8个位被组织成一组,称为字节。
      • 5.每个字节表示程序中的某些文本字符。
      • 6.现代计算机系统都使用ASCII标准来表示文本字符,实际上是用一个唯一的单字节大小的整数值来表示每个字符。
      • 7. hello.c程序是以字节序列的方式储存在文件中。每个字节都有一个整数值,对应于某些字符。
      • ★每个文本行都是以一个看不见的换行符“\n”来结束,它所对应的整数值为10。
      • 8.文本文件:像hello.c这样只由ASCII字符构成的文件称为文本文件,所有其他文件都称为二进制文件。
      • 9.系统中所有的信息——包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据,都是由一串比特表示。
      • 💕区分不同数据对象唯一方法:读这些数据对象时的上下文。(在不同的上下文中,一个同样的字节序列,可能表示一个整数、浮点数、字符串或机器指令)
  • 程序被其他程序翻译成不同的格式
    • 概念
      • 1.为了在系统上运行hello.c程序,每条C语句都必须为其他程序转化为一系列的低级机器语言指令。这些指令按照一种称为可执行目标程序的格式打好包,以二进制磁盘文件的形式存放起来。
      • 2.目标程序也称为可执行目标文件。
      • 3.在Unix系统上,从源文件到目标文件的转化是由编辑器驱动程序完成的:
        linux> gcc -o hello hello.c
        ​GCC编译器驱动程序读取原程序文件hello.c,并把它翻译成一个可执行目标文件hello。
    • 翻译过程分4个阶段:


      执行这4个阶段的程序(预处理器cpp、编译器ccl、汇编器as和链接器ld)一起构成编译系统( compilaton system)。
      • 预处理阶段:预处理器(cpp)根据以字符#开头的命令,修改原始的C程序。
        比如hello.c中第1行的# include<stdio.h>命令告诉预处理器读取系统头文件stdio.h的内容,并把它直接插入程序文本中。结果得到另一个C程序,通常以.i作为文件扩展名。
      • 编译阶段:编译器(ccl)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序。该程序包含函数main的定义,如下所示:


        汇编语言非常有用,因为它为不同高级语言的不同编译器提供了通用的输出语言。
      • 汇编阶段:汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序(relocate ball object program)的格式,并将结果保存在目标文件hello.o中。
        hello.o文件是一个二进制文件,它包含的17个字节是函数main的指令编码。如果在文本编辑器中打开hello.o文件,将会看到一堆乱码。
      • 链接阶段:hello程序调用了printf函数,它是每个C编译器都提供的标准C库中的一个函数。printf函数存在于一个名为printf.o的单独的预编译好了的目标文件中,这个文件必须以某种方式合并到hello.o程序中。链接器(ld)负责处理这种合并。结果得到hello文件,它是一个可执行目标文件(可执行文件) ,可以被加载到内存中,由系统执行。
  • 了解编译系统如何工作是大有益处的
    • 知道编译系统如何工作的好处
      • 优化程序性能。
        为了在C程序中做出好的编码选择,需要了解一些机器代码以及编译器将不同的C语句转化为机器代码的方式。
      • 理解链接时出现的错误。
        一些最令人困扰的程序错误往往与链接器操作有关。
      • 避免安全漏洞。
        缓冲区溢出错误是造成大多数网络和internet服务器上安全漏洞的主要原因。
        学习安全编程的第1步就是:理解数据和控制信息存储在程序栈上的方式会引起的后果。
  • 处理器读并解释存储在内存中的指令
    • 当hello.c源程序已经被编译系统编译成可执行文件hello,并存放在磁盘上。要想在Unix系统上运行该可执行文件,要将它的文件名输入到称为shell的应用程序中:
      linux> ./hello
      hello, world
      linux>
    • shell是一个命令行解释器,他输出一个提示符,等待输入下一个命令行,然后执行这个命令。
      如果该命令行的第1个单词不是一个内置的shell命令,那么shell就会假设这是一个可执行文件的名字,它将加载并运行这个文件。
      在这个例子中,shell将加载并运行hello程序,然后等待程序终止。hello程序在屏幕上输出他的消息,然后终止。shell随后输出一个提示符,等待下一个输入的命令行。
    • 系统的硬件组成
      • 1.总线
        • 贯穿整个系统的是一组电子管道,称作总线,它携带信息字节并负责在各个部件间传递。
          通常总线被设计成传送定常的字节块,也就是字(word)。
          字中的字节数(字长)是一个基本的系统参数,各个系统中都不完全相同。
          现在大多数机器字长要么是4个字节(32位),要么是8个字节(64位)。
      • 2.I/
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sabrikii

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值