版权声明:本人学习所用,转载请标明出处 https://blog.csdn.net/qq_39582960/article/details/84665528
导语
本章围绕“hello world!”程序的生命周期,讲解计算机硬件和软件如何协同工作,以及了解:
- C代码的简单优化与现代处理器和存储器系统设计的关系。
- 编译器的过程调用及避免缓冲区溢出技巧。
- 编写自己的Unix shel、动态储存分配包、web服务器。
1.1 信息就是上下文
程序的源文件以ASCII标准的字节序列存放于文件中:
- 源程序均由值0和1组成,1字节=8位,代表一个文本字符。
- hello程序中,[.c]称为文本文件,其他文件称为二进制文件。
基本思想:系统中所有的信息均由比特串表示。
1.2 程序被其他程序翻译成不同的格式
C语句 -> 低级机器语言 ->可执行目标程序 (可执行目标文件)
Linux下 linux> gcc -o hello hello.c
指令驱动hello程序的四个阶段:
- 预处理器以‘#’开头做预处理,将stdio.h的内容插入程序中。
- 生成汇编语言。
- 生成机器语言指令。
- 将已单独预编好的printf.o合并入程序。
- 加载入内存,由系统执行。
1.3 了解编译系统如何工作是大有益处的
三个好处:
- 优化程序性能:通过了解机器代码以及编译器将不同的C语句转化为机器代码的方式来选择更优的编码方式。
- 理解编译和链接是出现的莫名奇妙的错误
- 避免安全漏洞
1.4 处理器读并解释储存在内存中的指令
利用命令行解释器shell运行可执行文件:
linux> ./hello
系统的硬件组成:
运行hello程序:
- shell程序读入字符->寄存器->内存(通过总线实现传输)
- 输入结束后shell加载相关指令->将必要数据从磁盘复制到内存。(直接存储器存取技术)
- CPU开始执行hello程序中的机器语言。
- 指令将字符串从主存复制到寄存器文件->而后复制到显示设备->最终显示到屏幕。
1.5 高速缓存至关重要
发现问题:系统耗费大量时间挪运数据。
高速缓存存储器(cache):
- 存储设备的速度与体积成反比、与造价成正比。
- 利用静态随机访问存储器(SRAM)技术实现L1、L2、L3等多级缓存。
- 接受大量本应属于内存操作的工作,提高CPU效率。
1.6 储存设备的层次结构
未完待续…