csapp
第一章神奇的helloworld
一些奇怪的目录
前言
计算机入门前的基础知识学习过程:
程序部分:java红宝书
数学核心部分:密码学
基础知识部分:深入了解计算机系统(csapp)
什么是计算机系统(让我们从最简单的helloworld开始吧)
1、信息就是位+上下文
万物之源:一个源程序hello.c
这个源程序每一个字节里面由一个名字叫做ASCII的字符表示而成
ASCII字符表 每一个字符下面对应一个数字
注意:这个每个字符都是以一个\n结束的 代表的值是10
文本文件:只有ASCII字符组成
其他的统称为二进制文件
源程序:由0和1组成的位(又叫做bit比特)
位跟字节关系:8个位==一个字节
由上述这些信息可以推断出:系统中的信息都是由一堆大比特组成的
区分他们很难 唯一方法是根据上下文定这个东西表示啥玩意儿
就是同样是“我是大傻逼”在不同的上下文中表示不一样的意思
2、 程序被其他程序翻译成不同形式
为了让机器能够识别并且正常运行这个费了半天劲:
敲得语言是高级语言–>低级机器语言指令–>(被按照可执行目标程序的格式打包---->二进制磁盘存放
可执行目标文件:目标程序
奇妙的编译系统Unix:
linux> gcc m-o hello hello.c
gcc编译系统读取源程序文件hello.c 编译成一个可执行目标文件hello
分四个阶段 (预处理器 编译器 汇编器 链接器---------四个构成编译系统)
预处理阶段
预处理器(cpp):根据字符#开头的命令修改原始c程序:
#include<stdio.h>这个告诉cpp 你赶紧去搜索读取系统头文件stdio.h 将他赶紧直接插入文本中---------->结果 :hello.i出来啦
编译阶段(准备第二个坑 x86汇编教材的自学笔记干就完了!第二个坑开好了)
编译器(ccl)把hello.i---->翻译成hello.s 包含了一个汇编语言程序 这个程序里面由main函数的定义等
汇编语言的作用:为不同的高级语言的不同编译器提供了通用的语言。
人话: 懒得转换 直接一种语言通用你们必须用老子的 不然 爱加载不加载
汇编阶段
汇编器(as)汇编hello.s---->翻译成机器语言让电脑工作
电脑打包 可重定位目标程序结果保存在hello.o中
hello.o 是二进制文件 (17个字节指令编码)
编译系统干嘛的有啥鸟用
- 优化程序性能
为了了解一些机器代码是如何将c语句转化成机器代码的方式:
如 if-else为啥比swich更高效之类的
- 理解链接时出现的错误
为什么有些链接错误 到运行的时候才能发现?之类的
第七章就可以得到答案 - 避免安全漏洞
处理器读并解释存在内存中的指令
当hello.c源程序被编译系统翻译成hello的时候 如果想Unix系统上运行
将改文件名输入到shell的程序中
linux> ./hello
hello,world
linux>
shell干嘛的:是输出一个提示符等待一个命令行 然后执行命令
规则如下:若该命令行第一个单词不是内置的shell 则shell会假设这是一个可执行文件的名字并且加载并且运行这个程序
shell—等待终止---->hello 输出 —>结束---->shell继续跳到下一个命令行