CPU和CPU寄存器和CPU缓存和CPU内存管理器、RAM、hard disk。以及堆栈、内存映射。

CPU registers   cpu寄存器    包含通用寄存器,状态寄存器
Cache         cpu缓存
RAM          内存
hard disk      硬盘
我们常常看到 32位 CPU、64位 CPU 这样的名称,其实指的就是寄存器的大小。32 位 CPU 的寄存器大小就是4个字节。

程序运行的时候,操作系统会给它分配一段内存,用来储存程序和运行产生的数据。这段内存有起始地址和结束地址,比如从0x1000到0x8000,起始地址是较小的那个地址,结束地址是较大的那个地址。
程序运行过程中,对于动态的内存占用请求(比如新建对象,或者使用malloc命令),系统就会从预先分配好的那段内存之中,划出一部分给用户,具体规则是从起始地址开始划分(实际上,起始地址会有一段静态数据,这里忽略)。举例来说,用户要求得到10个字节内存,那么从起始地址0x1000开始给他分配,一直分配到地址0x100A,如果再要求得到22个字节,那么就分配到0x1020
这种因为用户主动请求而划分出来的内存区域,叫做 Heap(堆)。它由起始地址开始,从低位(地址)向高位(地址)增长。Heap 的一个重要特点就是不会自动消失,必须手动释放,或者由垃圾回收机制来回收。

除了 Heap 以外,其他的内存占用叫做 Stack(栈)。简单说,Stack 是由于函数运行而临时占用的内存区域。由系统自动分配,由编译器管理。即代码在编译阶段,编译器只是指定了栈的生成规则,它告诉操作系统,栈应该怎么分配,在哪里分配,分配多大,编译器并不会生成栈,生成“栈”的这个动作,是程序在被安装所在的机器设备上在运行的时候,由系统完成的。
简单一句话:编译器确定生成栈的规则,由操作系统分配和管理。

题外话: 从静态存储区分配:内存在程序编译的时候已经确定好规则,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

比如:

int main() {
int a = 2;
int b = 3;
}

上面代码中,系统开始执行main函数时,会为它在内存里面建立一个帧(frame),所有main的内部变量(比如a和b)都保存在这个帧里面。main函数执行结束后,该帧就会被回收,释放所有的内部变量,不再占用空间。

如果函数内部调用了其他函数,会发生什么情况?

int main() {
int a = 2;
int b = 3;
return add_a_and_b(a, b);
}

上面代码中,main函数内部调用了add_a_and_b函数。执行到这一行的时候,系统也会为add_a_and_b新建一个帧,用来储存它的内部变量。也就是说,此时同时存在两个帧:main和add_a_and_b。一般来说,调用栈有多少层,就有多少帧。

虚拟内存和物理内存之间的映射通过MMU进行内存页的分配
因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。
分页虚拟内存机制。
一个技术的引入,最后的应用和当初的目的可能完全不一样。当然了,现在我们看到分页技术,可以解决地址空间隔离的问题,可以解决物理内存不足的问题,可以控制内存访问权限等等。所以如果是教科书式的回答,那么可能就是前面说的地址空间隔离之类的选项;如果是从计算机硬件发展的角度上看,最早只是为了解决段交换的性能。

在标准C库中,提供了malloc/free函数分配释放内存,这两个函数底层是由brk,mmap,munmap这些系统调用实现的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1概述 5 1.1MIPS概述 5 1.2MIPS 32 位指令集架构 5 1.2.1数据类型 5 1.2.2寄存器 6 1.2.3指令格式 7 1.2.4寻址方式 8 1.2.5指令集 8 1.2.6字节次序 9 2 实验目的与要求 9 2.1实验目的 9 2.2实验要求 9 3 实验环境 9 4 指令功能及实现 10 4.1 逻辑操作指令 10 4.2 移位操作指令 10 4.3 移动操作指令 11 4.4 算术操作指令 11 4.5 分支转移指令 12 4.6 加载存储指令 12 4.7 其他指令 13 5 总体设计 13 5.1 设计目标与实现情况 13 5.2 指令执行周期 13 5.3 五级流水线 13 5.4 数据通路图 15 6 模块设计 15 6.1IF取指令 15 6.1.1代码 15 6.1.2数据通路 15 6.1.3通路解释 16 6.2IF/ID阶段 16 6.2.1代码 16 6.2.2数据通路 16 6.2.3通路解释 16 6.3ID指令译码 17 6.3.1代码 17 6.3.2数据通路 17 6.3.3通路解释 18 6.4ID/EX阶段 20 6.4.1代码 20 6.4.2数据通路 20 6.4.3通路解释 20 6.5EX指令执行阶段 22 6.5.1代码 22 6.5.2数据通路 22 6.5.3通路解释 23 6.6EX/MEM阶段 24 6.6.1代码 24 6.6.2数据通路 24 6.6.3通路解释 24 6.7MEM存储访问阶段 25 6.7.1代码 25 6.7.2数据通路 25 6.7.3通路解释 26 6.8MEM/WB阶段 27 6.8.1代码 27 6.8.2数据通路 27 6.8.3通路解释 28 6.9Registers寄存器堆 29 6.9.1代码 29 6.9.2数据通路 29 6.9.3通路解释 29 6.10HILO寄存器 30 6.10.1代码 30 6.10.2数据通路 30 6.10.3通路解释 30 6.11LLBit寄存器 31 6.11.1代码 31 6.11.2数据通路 31 6.11.3通路解释 31 6.12RAM数据存储 32 6.12.1代码 32 6.12.2数据通路 32 6.12.3通路解释 32 6.13ROM指令存储 33 6.13.1代码 33 6.13.2数据通路 33 6.13.3通路解释 33 6.14STALL_UNIT模块 33 6.14.1代码 33 6.14.2数据通路 33 6.14.3通路解释 34 7关键问题的解决 34 7.1RAW, WAW, WAR数据相关 34 7.2PC+4的原因 35 7.2Load 数据相关 35 7.3溢出的判断 36 7.4除法的除 0 的处理 36 7.5分支控制相关 36 8实验结果与演示 37 8.1测试文件 37 8.2仿真波形 38 9心得体会 40 附录:数据通路图 41 参考文献: 42

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值