如何与导航网站做友情链接,百度霸屏推广,自己做百度网站,wordpress 导航菜单目录
一、虚拟地址空间
1.虚拟地址空间的定义
2.虚拟地址空间的布局
二、内存壁垒 1.内存壁垒的定义编辑
2.段错误
三、内存映射的建立与解除 #xff08;1#xff09;mmap #xff08;2#xff09;munmap
#xff08;3#xff09;堆内存的分配和释放
1.sbrk
…
目录
一、虚拟地址空间
1.虚拟地址空间的定义
2.虚拟地址空间的布局
二、内存壁垒 1.内存壁垒的定义编辑
2.段错误
三、内存映射的建立与解除 1mmap 2munmap
3堆内存的分配和释放
1.sbrk
2.brk 我们先来思考一个问题你写出的程序经过编译之后得到a.out是如何跑起来的呢 a.out文件是二进制指令的集合。其内容经过了操作系统的管理调度被加载到了物理内存中CPU再从物理内存中读取指令并且执行这样我们的程序就跑起来啦 一、虚拟地址空间
1.虚拟地址空间的定义 这段文字告诉了我们我们看到的地址是假的是操作系统给我们看到的表象我们借助这个表象的地址操作系统存下的映射关系就能找到相应的物理内存从而进行数据的访问了。 那么操作系统为什么要维护这样一个映射关系表呢而不给我们实际的物理地址
其实在计算机刚刚诞生的时候还没有操作系统人们就是这样做的但是这样会有许许多多的麻烦事人们要不断的计算所使用内存的大小从而规划下一步在哪个地方使用内存但是一旦操作不当就会导致内存泄漏或者程序崩溃。 于是人们便开发了操作系统这样的一个东西来帮助我们合理使用内存。而操作系统自己用了一个虚拟内存的东西来映射实际的物理内存从而知道哪一块空间被使用了哪一块空间没有被使用自此我们对内存的操作大部分都交给了操作系统来处理于是人力资源得到了极大的程度的解放。 32位 1对于32位操作系统而言每个进程都有4G大小的虚拟地址空间。 2所谓的地址空间就是一个地址范围表示程序的寻址能力但是并不意味着一定用到了4G大小的物理内存我们所看到的虚拟地址都是在4G的这个范围内的 3对于32位操作系统其虚拟地址空间范围是0X0000 0000到0XFFFF FFFF也就是4G 4其中的0到3G-1范围归用户使用称为用户地址空间3G到4G-1的范围归内核使用称为内核地址空间。 64位 1对于64位操作系统而言目前的程序还没有那么大的内存需求所以不支持完全的64位虚拟地址 264位操作系统上其用户的地址空间是0X0000 0000 0000 0000到0X0000 FFFF FFFF FFFF 3其内核的地址空间是0XFFFF 0000 0000 0000到0XFFFF FFFF FFFF FFFF 4内核地址空间和用户地址空间之间的是不规范地址空间不允许使用 5用户地址空间的代码不能直接访问内核空间的代码和数据但是可以通过系统调用进入内核间接与系统内核交互 2.虚拟地址空间的布局 二、内存壁垒 1.内存壁垒的定义 从上面一段话中我们可以看到每一个进程中只有内核空间的虚拟地址是一样的别的用户地址空间部分都是各自独立的可能在两个进程中虚拟地址的值都是一样的但是映射在物理内存中却有差别 且内核的代码和数据只能通过系统调用来访问 2.段错误 第一种情况是对没有映射到物理内存的虚拟内存进行了访问但是操作系统没有记录这个虚拟地址所以就成了一个野指针类似的虚拟地址。 第二种情况是在只读内存区域进行了写操作比如在常量代码段进行修改 三、内存映射的建立与解除 1mmap 一般情况下我们第一个参数start都给的是NULL让系统自己来决定细虚拟地址 length要求是按页圆整即4096的整数倍个字节 而prot必须在PROT_READ和PROT_WRITE以及PROT_EXEC和PROT_NONE中选择一个作为我们映射区的操作权限 最后flags是映射标志我们这里因为没有涉及到文件所以是将虚拟内存映射到物理内存中所以要选择MAP_ANONYMOUS注意这里的flags都是可以多种选择的比如我们可以用MAP_PRIVATE|MAP_ANONYMOUS让他既是匿名映射又是映射到缓冲区中 fd是文件描述符我们在后续讲到文件系统的时候再说 2munmap 3堆内存的分配和释放
1.sbrk 2.brk