本文主要是介绍CSAPP笔记——第一章计算机系统漫游,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
hello,你好鸭,我是Ethan,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行!💪💪💪
目前博客主要更新Java系列、项目案例、计算机必学四件套等。✔️✔️✔️
人生之败,非傲即惰,二者必居其一,勤则百弊皆除。加油呀!🏃🏃🏃
🔥个人主页:Ethan Yankang
🔥专栏:CSAPP||计算机基础
🔥本篇概览:以hello world为例,讲解了程序从编写到运行的全过程,以及现代计算机的基本架构。理解了这些知识,就掌握了现代计算机的宏观之态。
文章目录
- 1.1The Lifetime of flello Program
- 1.1.1gcc -o hello hello.c
- 1.1.2.编译过程具体分析
- 1.2 the reason of learning compilation system
- 1.2.1 Optimizing program performance
- 1.2.1 Understanding link-time errors
- 1.2.1 Avoiding security holes
- 1.3 Run Hello Program by Shell
- 1.3.1 Hardware Organization of a Computer System
- 1.3.2 Process Of Run Hello Program by Shell
- STEP1 键盘中的 hello字符串被加载进寄存器中
- STEP2 复制磁盘上的hello可执行文件的数据与代码到内存
- STEP3 CPU将hello,world\n 从内存复制到寄存器文件,再从寄存器文件复制到显示设备,显示
- 1.3.3 Memory Hierarchy
- 1.4 The Operating System Manages Hardware
- 1.4.1 Operating System
- 1.4.2 Process
- 1.4.1 Virtual memory
- 1.4.1 File
- 1.5 Use ssh run hello program
- 1.5.1 如何获得更高的计算力?
- 1.5.1.1 Multi-core Processor Organization
- 1.5.1.2 Hyper Threading
- 1.5.1.3 Instruction-Level Parallelism
- 1.5.1.4 Single Instruction Multiple Data
- 1.5.2 Abstractions in Computer Systems
1.1The Lifetime of flello Program
源代码:
生命周期:
具体执行分析:
1.1.1gcc -o hello hello.c
通过一条命令 gcc -o hello hello.c , 即可通过编译系统完成编译称为可执行文件hello
1.1.2.编译过程具体分析
预处理:将源代码文件中以#开头的文件引入,源代码增加相关了内容(如#<stdio.h>)
编译:将源代码编译成汇编语言,中间过程包括词法分析、语法分析、语义分析、中间代码生成等等。
汇编:将汇编语言转化为机器指令,打包成二进制** 可重定位目标文件 ** hello.o
链接:链接器将hello.o可重定位目标文件与目标文件printf.o按照一定规则合并,最终形成可执行文件hello。该文件就可以加入内存中进行执行。
1.2 the reason of learning compilation system
1.2.1 Optimizing program performance
1.为什么Switch要比一连串if-else语句效率更高?
2.一个函数开销多大?
3.while循环比for循环更高效吗?
1.2.1 Understanding link-time errors
构建大型程序的时候,往往是在链接阶段出问题,各种函数库之间的调用是最容易出问题的。以往经验中各种奇奇怪怪错误往往是与链接器有关的。例如:
静态变量与全局变量的区别是?
静态库和静态库是什么?
1.2.1 Avoiding security holes
缓冲区溢出最易导致安全漏洞。如何编写代码避免安全漏洞?
第一步就是要理解数据和控制信息在程序栈上是如何存储的?了解不严谨不规范的书写方式会引起什么样的后果?
在第三章中,我们会讲述堆栈的原理和缓冲区溢出错误,以及如何利用操作系统与编译器来降低攻击风险。
1.3 Run Hello Program by Shell
1.3.1 Hardware Organization of a Computer System
注意这里的适配器与控制器只是封装方式不同而已,功能一样。
Main Memory就是RAM芯片,就是内存
1.3.2 Process Of Run Hello Program by Shell
STEP1 键盘中的 hello字符串被加载进寄存器中
./后面的hello不是系统程序,所以处理器会把hello这个字符串放入内存中,
STEP2 复制磁盘上的hello可执行文件的数据与代码到内存
数据就是 hello,world\n 。此过程利用技术DMA(直接内存访问),数据不经过CPU,直接从磁盘到内存
STEP3 CPU将hello,world\n 从内存复制到寄存器文件,再从寄存器文件复制到显示设备,显示
1.3.3 Memory Hierarchy
即使执行如此简单的打印程序,数据信息仍然在磁盘、内存、处理器以及IO设备之间搬运,需要花费大量时间。
Commonly
Larger storage devices than Smaller storage devices
Faster storage devices more EXPENSIVE than Slower storage devices
so ,there comes the Cache matter:
这个计算机的信息存储可用以下表示:
存储器山
1.4 The Operating System Manages Hardware
1.4.1 Operating System
上面的程序无论shell还是hello均未访问硬件如键盘、显示器、磁盘等等,全都是操作系统作为中介而代之
操作系统引入的抽象:
1.4.2 Process
这里的上下文切换中的上下文是指——
操作系统会保留程序运行中的各种状态参数,比如当前寄存器文件中的值、PC值(指令地址寄存器中的值)、内存中的值等等
现代操作系统一个进程其实是由多个线程组成。线程运行在进程的上下文之中。共享数据与代码。
1.4.1 Virtual memory
每一个进程的地址空间就是虚拟地址,其典型分布如下:
1.4.1 File
这是Unix/linux类系统的哲学抽象,其实绝大多数系统均为此。
1.5 Use ssh run hello program
远程网络运行程序
1.5.1 如何获得更高的计算力?
Thread-LevelConcurrency(线程级并发)
Instruction-Level Parallelism(指令级并行)
Single-Instruction Multiple-Data Parallelism(单指令,多数据并行)
1.5.1.1 Multi-core Processor Organization
1.5.1.2 Hyper Threading
1.5.1.3 Instruction-Level Parallelism
1.5.1.4 Single Instruction Multiple Data
单指令多数据
1.5.2 Abstractions in Computer Systems
📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤ 分享👥 留言💬thanks!!!
📚愿大家都能学有所得,功不唐捐!
这篇关于CSAPP笔记——第一章计算机系统漫游的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!