冯诺伊曼计算机结构
冯诺伊曼计算机结构通常由四部分组成:
- cpu。能做简单的加减乘除,以及移位,与,或,非等逻辑操作。
- 内存。临时存储数据的设备。
- 总线。这个简单,用来传输数据用的设备。
- 硬盘。用来永久存储数据用的设备。
站在物理层的角度,内存条看到的内容就是0,1。
站在逻辑层的角度:
什么是逻辑层,可以理解成一串数字表达的意思。比如说摩斯密码,它就是一串数字,但是站在逻辑层的角度,这串数字会蕴含这某种信息。
程序的编译和连接
源文件到可执行文件,通常会经过以下几个阶段:
- 编译阶段:源文件变成汇编代码,比如helloworld.c文件,会变成helloworld.s文件,这个文件里面写了汇编代码。
- 汇编阶段:将汇编代码变成目标代码,helloworld.s编程helloworld.o。
- 链接阶段:将相关的目标代码连接在一起。比如有段程序,它需要“打印”这个功能,连接器就会去找“打印”这个目标代码,然后链接在一起。
那你说目标代码和可执行文件之间的区别是什么呢???
cpu看得懂目标代码,,但是无法顺利执行。举一个例子,有一段程序,它依赖“打印”程序,cpu执行目标代码时,找不到“打印”程序的具体逻辑,就会奔溃。
gcc的一些相关命令:
- 程序在编译过程中会分别使用这些工具,完成程序编译的每个流程。为了简化程序编译流程,GCC编译器一般会提供一个gcc命令,当你使用gcc命令去编程程序时:
gcc -o a.out helloworld.c
- 只进行预处理:
gcc -E helloworld.c
- 只做汇编处理:
gcc -S -o helloworld.S helloworld.c
- 只想对源文件进行编译,不链接
gcc -c -o helloworld.o helloworld.c
动态库和静态库
静态库中的代码会复制到可执行文件中。 动态库中的代码会被可执行文件引用。
文件的分类
- bin文件
- elf文件
站在cpu的角度,文件就两种类型,一种是bin文件,一种是elf文件。 bin文件就是一坨机器码,而elf文件除了机器码还有额外信息。这些额外信息在不同的层面代表着不同的信息,比如连接器,这些额外信息是section集合,而在加载器阶段时,segment集合。
elf有三种类型,可执行文件,可重定位文件,共享文件。
命令:readelf。