上一页 1 2 3 4 5 6 7 8 9 10 ··· 31 下一页
摘要: 函数调用 我们知道,一个C程序由若干个函数组成,C程序的执行实际上就是函数之间的相互调用。请看下面的代码: #include <stdio.h> void funcA(int m, int n){ printf("funcA被调用\n"); } void funcB(float a, float b 阅读全文
posted @ 2021-06-18 17:36 Smah 阅读(625) 评论(0) 推荐(0) 编辑
摘要: 引言 函数的调用和栈是分不开的,没有栈就没有函数调用,本节就来讲解函数在栈上是如何被调用的。 栈帧/活动记录 当发生函数调用时,会将函数运行需要的信息全部压入栈中,这常常被称为栈帧(Stack Frame)或活动记录(Activate Record)。活动记录一般包括以下几个方面的内容: 1) 函数 阅读全文
posted @ 2021-06-18 17:30 Smah 阅读(1286) 评论(0) 推荐(1) 编辑
摘要: 引言 在《Linux下C语言程序的内存布局(内存模型)》中我们讲到,程序的虚拟地址空间分为多个区域,栈(Stack)是其中地址较高的一个区域。栈(Stack)可以存放函数参数、局部变量、局部数组等作用范围在函数内部的数据,它的用途就是完成函数的调用。 栈内存由系统自动分配和释放:发生函数调用时就为函 阅读全文
posted @ 2021-06-18 17:27 Smah 阅读(3628) 评论(0) 推荐(1) 编辑
摘要: 引言 首先我们要解释一个概念——进程(Process)。简单来说,一个可执行程序就是一个进程,前面我们使用C语言编译生成的程序,运行后就是一个进程。进程最显著的特点就是拥有独立的地址空间。 严格来说,程序是存储在磁盘上的一个文件,是指令和数据的集合,是一个静态的概念;进程是程序加载到内存运行后一些列 阅读全文
posted @ 2021-06-18 17:25 Smah 阅读(872) 评论(0) 推荐(0) 编辑
摘要: 引言 在32位环境下,Windows 默认会将高地址的 2GB 空间分配给内核(也可以配置为1GB),而将剩下的 2GB 空间分配给用户程序。 内存分布 不像 Linux,Windows 是闭源的,有版权保护,资料较少,不好深入研究每一个细节,至今仍有一些内部原理不被大家知晓。关于 Windows 阅读全文
posted @ 2021-06-18 17:24 Smah 阅读(1193) 评论(0) 推荐(0) 编辑
摘要: 引言 在《虚拟地址空间以及编译模式》一节中讲到,虚拟地址空间在32位环境下的大小为 4GB,在64位环境下的大小为 256TB,那么,一个C语言程序的内存在整个地址空间中是如何分布的呢?数据在哪里?代码在哪里?为什么要这样分布?这些就是本节要讲解的内容。 内存模型 程序内存在地址空间中的分布情况称为 阅读全文
posted @ 2021-06-18 17:23 Smah 阅读(1595) 评论(0) 推荐(1) 编辑
摘要: 引言 通过页表完成虚拟地址和物理地址的映射时,要经过多次转换,还要进行计算,如果由操作系统来完成这项工作,那将会成倍降低程序的性能,得不偿失,所以这种方式是不现实的。 MMU 在CPU内部,有一个部件叫做MMU(Memory Management Unit,内存管理单元),由它来负责将虚拟地址映射为 阅读全文
posted @ 2021-06-18 17:18 Smah 阅读(1311) 评论(0) 推荐(1) 编辑
摘要: 分页 现代操作系统都使用分页机制来管理内存,这使得每个程序都拥有自己的地址空间。每当程序使用虚拟地址进行读写时,都必须转换为实际的物理地址,才能真正在内存条上定位数据。如下图所示: 内存地址的转换是通过一种叫做页表(Page Table)的机制来完成的,这是本节要讲解的重点,即: 页表是什么? 为什 阅读全文
posted @ 2021-06-18 17:17 Smah 阅读(1848) 评论(0) 推荐(0) 编辑
摘要: 关于虚拟地址和物理地址的映射有很多思路,我们可以假设以程序为单位,把一段与程序运行所需要的同等大小的虚拟空间映射到某段物理空间。 例如程序A需要 10MB 内存,虚拟地址的范围是从 0X00000000 到 0X00A00000,假设它被映射到一段同等大小的物理内存,地址范围从 0X00100000 阅读全文
posted @ 2021-06-18 17:15 Smah 阅读(1056) 评论(0) 推荐(0) 编辑
摘要: 计算机内存是以字节(Byte)为单位划分的,理论上CPU可以访问任意编号的字节,但实际情况并非如此。 CPU 通过地址总线来访问内存,一次能处理几个字节的数据,就命令地址总线读取几个字节的数据。32 位的 CPU 一次可以处理4个字节的数据,那么每次就从内存读取4个字节的数据;少了浪费主频,多了没有 阅读全文
posted @ 2021-06-18 17:13 Smah 阅读(1172) 评论(0) 推荐(1) 编辑
上一页 1 2 3 4 5 6 7 8 9 10 ··· 31 下一页