虚拟地址,虚拟地址空间, 交换分区

1.虚拟内存是内存管理的一种方式, 它在磁盘上划分出一块空间由操作系统管理,当物理内存耗尽是充当物理内存来使用。它将多个物理内存碎片和部分磁盘空间重定义为连续的地址空间,以此让程序认为自己拥有连续可用的内存。当物理内存不足时,操作系统会将处于不活动状态的程序以及它们的数据全部交换到磁盘上来释放物理内存,以供其它程序使用。

2.虚拟地址空间:在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中,这个沙盘就是虚拟地址空间(virtual address space)。虚拟地址空间由内核空间(kernel space)和用户模式空间(user mode space)两部分组成。
虚拟地址会通过页表(page table)映射到物理内存,页表由操作系统维护并被处理器引用,每个进程都有自己的页表。内核空间在页表中拥有较高特权级,因此用户态程序试图访问这些页是会导致一个页错误(page fault)。其中内核空间是持续存在的,并且在所有进程中都映射到同样的物理内存。与此相反,用户模式空间的映射随进程切换的发生而不断变化。

虚拟地址,虚拟地址空间, 交换分区_第1张图片

linux进程内存布局:
进程内存空间通过分段存储来管理
虚拟地址,虚拟地址空间, 交换分区_第2张图片

*内核空间(kernel space)(1G) 用户空间(3G)
内核总是驻留在内存中,是操作系统的一部分。内核空间为内核保留,不允许应用程序读写该区域的内容或直接调用内核代码定义的函数。
*环境变量(environment variables)
*命令行参数(command-line arguments)
*栈(stack)
栈又称堆栈,由编译器自动分配释放,用来存储临时数据和栈帧。
*内存映射段(memory mapping segment)
将硬盘文件的内容直接映射到内存,内存映射是一种方便高效的文件I/O方式, 因而被用于装载动态共享库。
*堆(heap)
堆用于存放进程运行时动态分配的内存段。
***BSS段(bss segment)
静态内存分配,保存未初始化的全局及静态变量(皆为0),可读可写。
*数据段(data segment)
静态内存分配,保存已初始化的全局及静态变量,可读可写。
*代码段(text segment)
保存可执行机器码和常量,可读不可写可执行。
*保留区(reserved)(32位cpu下占128M)
位于虚拟地址空间的最低部分,未赋予物理地址。任何对它的引用都是非法的,用于捕捉使用空指针和小整型值指针引用内存的异常情况。
它并不是一个单一的内存区域,而是对地址空间中受到操作系统保护而禁止用户进程访问的地址区域的总称。

在32位X86架构的Linux系统中,用户进程可执行程序一般从虚拟地址空间0x08048000开始加载。该加载地址由ELF文件头决定

3.交换分区:在物理内存满时, 如果还需要内存资源,内核 则把物理内存中非活动的页面放到交换分区中。

你可能感兴趣的:(linux)