计算机组成原理学习基础(二)

函数调用栈

栈帧 整个函数A所占用的所有内存空间 就是A的栈帧
函数 A 调用函数B是怎么执行的

  1. 程序执行会先把A入栈
  2. 当A中的函数指令执行到要调用B的时候,会调用call B
  3. 把函数B调用结束后要执行的下一条指令地址压栈
  4. 执行push rbp操作把函数B压栈
  5. 函数B执行完毕 调用pod B B出栈 并且把刚才入栈的指令放入PC寄存器 同时把控制权返回给出栈后的栈顶

其实程序最终的执行都是一条一条的指令,不断的更新PC寄存器中的指令地址,函数调用也是一个指令 call,如果所有的程序都在一个函数里执行也就不存在什么函数调用栈了,函数的地址在编译阶段已经确定,不过是虚拟地址而已,当函数之间相互调用时 不过就是增加一种函数调用栈的机制,来达到执行了一个函数后再回来继续执行效果。
与if/else的跳转过去就不回来的相比 函数调用栈更高明一些吧

内联函数(inline) 以及编译器优化

标记为内联函数的函数 编译器会帮助我们进行优化,把函数的实现部分直接插入到函数的调用处,也就是有10个地方调用这个函数就有10份这样的代码

编译 连接 装载

一、编译
如下代码

//add_lib.c
int add(int a, int b){
	return a + b;
}
#include<stdio.h>
int main(){
	int a = 10;
	int b = 5;
	int c = add(a,b);
	printf("c = %d",c);
}

gcc -g -c add_lib.c link_example.c 编译两个文件 生成 目标文件

二、链接-连接器生成可执行文件

gcc -o link-example add_lib.o link_example.o

三、整个过程

由编译器生成汇编代码 汇编器生成目标代码 链接器连接静态文件生成可执行文件
装载器把可执行文件装载到内存中 CPU从内存中读取指令和数据 开始真正的执行。程序是通过装载器变成指令和数据的。

四、ELF文件格式

  1. 文件头:保留文件属性、对应的CPU、对应的操作系统
  2. 代码段:存储程序的代码和指令
  3. 数据段:全局变量和局部静态信息
  4. 重定位表:保存的是那些跳转是我们不知道的,在链接之前不知道要跳转到哪里,这些信息都存储在重定位表中
  5. 符号表 保存当前文件里定义的函数名称和对应的地址薄

五、链接器干的事儿

  1. 扫描所有输入的目标文件 把符号表里的信息收集起来,构成全局符号表
  2. 根据重定位表把不确定的跳转地址代码根据符号表里的地址进行一次修正
  3. 把所有的目标文件对应段进行一次合并,最终形成可执行代码。

六、装载器干的事儿

  1. 解析可执行文件,把对应的指令和数据加载到内存中 让CPU执行
内存

一、内存分页

  1. 分页是把整个物理内存空间切分成一段段固定尺寸的大小
  2. getconf PAGE_SIZE 查看操作系统的页大小
  3. 一个页中的物理内存是连续的,这时一个程序不再是拥有整个程序大小的连续内存区域,而是分成了很多页
  4. 内存分页之后,程序也不需要一次性就把程序全部加载到内存里,只需要把当前需要的指令加载到内存中就好,当程序访问到不存在的物理内存时会出发一次缺页中断,这是操作系统会把存放在硬盘上的虚拟内存读出来加载到物理内存中。
动态链接

一、 地址无关码

  1. 动态代码库的变量和函数 都使用相对地址
  2. 动态链接解决方案

plt 程序连接表
got 全局偏移表
共享库在内存中的物理地址是确定的,不同的程序在加载动态库的时候会往自己的数据段中插入一个全局偏移表,这个偏移表记录着所使用的动态库的相对地址,当要使用其中的函数时只需要查找全局偏移表,然后找到物理地址就好。

虽然不同程序调用同样的动态库,各自的内存地址是独立的,调用的又都是同一个动态库,但是不需要去修改动态库里面的代码所使用的地址,而是各个程序各自维护好自己GOT 就能找到对用的动态库了。

二进制表示

一、数字二进制表示

  1. 最高位是符号位
    5 0101
    -5 1011 -23+21+1 = -5
  2. 二进制加法 -5 + 1
    1011 + 0001 = 1100 = -8 + 4 = -4

二、字符二进制表示

  1. ASCII 美国信息交换标准码 只有英文数字和特殊字符 8 位 128个字符
  2. 字符集 是字符的集合 例如Unicode 包含150万种语言的14万个不同字符
  3. 字符编码 是对于字符集里的字符 怎么用二进制一一表示的字典 字符集就可以用UTF-8 UTF-16 UTF-32 进行编码
电路

一、电报机

蜂鸣器+电线+按钮 按下的时间长一点就是一个划信号 按下时间短一些就是一个点信号 对应的就是0/1 SOS 就是 点点点划划划点点

二、继电器
电信号在传输过程中 由于线路长了之后信号会减弱 电阻等原因,那么这是就需要在中间有一个加强信号的机制,就是继电器,他会把信号原封不动的往下传,远离就是 开关和磁性线圈,开关默认是关上的 当同上电之后磁性线圈有了磁性 就让开关断开 又断电 那么对应到下游就是01信号一层一层传递

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值