标签:应用程序 收集器 发送 阶段 相对 通过 覆盖 block 虚拟地址
计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组,每字节都有一个唯一的物理地址(PA)。CPU根据物理地址访问存储器的方式是物理寻址。
使用虚拟寻址时,CPU通过生成一个虚拟地址VA来访问主存,这个虚拟地址在被送到存储器之前先转换成适当的物理地址,地址翻译通过CPU芯片上的存储器管理单元完成。
地址翻译:一个N元素的虚拟地址空间(VAS)中的元素和一个M元素的物理地址空间(PAS)之间的映射。
CPU中的一个控制寄存器页表基址寄存器指向当前页表,n位的虚拟地址包含两个部分:一个p位的虚拟页面偏移(VPO) 和一个(n-p)位的虚拟页号,页表条目中的物理页页号和虚拟地址中的VPO串联起来,就得到了相应的物理地址。
使用execve函数将a.out程序加载到存储器的过程
Execve("a.out",NULL,NULL);
Unix进程可以使用mmap函数来创建新的虚拟存储器区域,并将对象映射到这些区域当中
void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offest);
若成功则为指向映射区域的指针,若出错则为MAP_FAILDE(-1)
munmap函数删除虚拟存储器的区域。
int munmap(void *start,size_t length);
若成功则返回0,若失败则返回-1.
#include <stdlib.h>
void *malloc(size_t size);
成功返回指针,指向大小至少为size字节的存储器块,失败返回NULL
#include <stdlib.h>
void free(void *ptr);
无返回值
ptr参数必须指向一个从malloc、calloc或者reallov获得的已分配块的起始位置。
#include <unistd.h>
vid *sbrk(intptr_t incr);
成功则返回旧的brk指针,出错为-1
通过将内核的brk指针增加incr来扩展和收缩堆。
Mark&Sweep垃圾收集器由标记阶段和清除阶段组成,标记阶段标记出根节点所有可达的和已分配的后继,清除阶段释放每个未被标记的已分配块。
在进程的虚拟地址空间中有较大的洞,没有映射到任何有意义的数据,如果试图引用一个指向这些洞的指针,操作系统就会以段异常来终止程序。
典型的错误是:scanf("%d",val);
,没有加&符号
常见的错误就是假设堆存储器被初始化为0.
如果一个程序不检查输入串的大小就写入栈中的目标缓冲区,程序就会出现缓冲区溢出错误。
一种常见的错误是假设指向对象的指针和他们所指向的对象是大小相同的。
一种很常见的覆盖错误来源
注意C的优先级和结合性
忘记了指针的算术操作是以它们指向的对象的大小为单位来进行,而这种大小单位不一定是字节。
理解栈的规则,有时会引用不再合法的本地变量。
标签:应用程序 收集器 发送 阶段 相对 通过 覆盖 block 虚拟地址
原文地址:http://www.cnblogs.com/5317p/p/6194117.html