Linux内存位置详解:从物理地址到虚拟地址 (linux 内存位置)

在计算机中,内存扮演着非常重要的角色。操作系统需要使用内存来存储运行过程中的数据和程序,而应用程序也需要内存来进行计算和存储数据。在Linux系统中,内存被分为两种类型:物理内存和虚拟内存。物理内存是实际存在于计算机中的内存,而虚拟内存则是在应用程序中看到的逻辑地址。

本文将详细介绍Linux内存位置的各个方面,包括物理地址和虚拟地址之间的区别以及操作系统如何使用这些地址来管理内存。

物理地址

物理地址是指内存中实际存储数据的地址。在计算机中,物理内存是用来存储数据和程序的物理位置。对于处理器和其他硬件设备而言,物理内存是唯一的存在。通常情况下,内存中存储的数据可以被直接访问,以便对其进行读写操作。

物理地址通常由32位或64位地址总线构成。32位地址总线可以寻址2^32(即4GB)的物理内存空间,而64位地址总线可以寻址2^64(即16EB)的物理内存空间。因此,物理地址范围取决于使用的硬件和计算机的架构。

物理地址在操作系统中扮演着重要的角色,因为它直接决定了操作系统和应用程序可以使用和管理的内存范围。如果存在物理内存短缺的情况,操作系统可能会使用虚拟内存来缓解这种情况,并将数据移动到硬盘上以腾出物理内存。

虚拟地址

虚拟地址是应用程序在其内部看到的地址。虚拟地址通常是32位或64位的整数,它对应于实际的物理地址。虚拟地址空间是由操作系统提供的,应用程序可以使用它来进行读写操作,而不必知道实际的物理地址。

操作系统使用虚拟地址来实现内存管理。它创建一个虚拟地址空间给每个应用程序,让它们看到自己有完整的地址空间,以便访问自己的数据。虚拟地址允许操作系统将内存分配给多个进程,并控制每个进程可以访问的内存范围。

虚拟地址通常是从0开始分配的。在32位操作系统中,虚拟地址范围是0到0xFFFFFFFF,而在64位操作系统中,虚拟地址范围是从0x0000000000000000到0xFFFFFFFFFFFFFFFF。这种取值范围意味着每个应用程序可以使用自己的完整的地址空间而不会影响其他进程的内存。

虚拟内存

虚拟内存是操作系统中的一种技术,它允许应用程序访问超出物理内存的数据。虚拟内存是通过使用磁盘空间作为额外的内存来实现的,这被称为虚拟内存交换文件(Swap文件)。

操作系统会将一部分物理内存映射到虚拟内存,这样就可以让应用程序看到其可用的虚拟内存空间,即使实际内存大小可能不足。当应用程序需要获取物理内存时,操作系统会将其分配给应用程序。当物理内存不足时,操作系统会将不经常被使用的内存存入磁盘作为虚拟内存,以腾出物理内存为新的数据。

虚拟内存是操作系统管理内存的基本机制之一。当应用程序运行时,操作系统将使用虚拟内存来增加物理内存。如果物理内存不足,操作系统将自动将数据移入和移出交换文件。

Linux内存地址

在Linux系统中,内存地址被分为两种类型:内核空间和用户空间。内核空间包括内核数据结构、驱动程序和操作系统等运行时使用的代码。用户空间是应用程序的地址空间。操作系统使用虚拟地址空间将这两种空间隔离开来,并防止用户应用程序访问内核数据结构。

在32位Linux系统中,内核空间地址范围是0xC0000000~0xFFFFFFFF(即3GB到4GB)。用户空间地址范围是0x00000000~0xBFFFFFFF(即0到3GB)。而在64位Linux系统中,内核空间地址范围是0xFFFF800000000000~0xFFFFFFFFFFFFFFFF(即256TB到512TB),而用户空间地址范围是0x0000000000000000~0x00007FFFFFFFFFFF(即0到128TB)。

在Linux系统中,虚拟地址空间被分成多个段,每个段都有自己的属性和限制。例如,代码段、数据段、堆和栈等。代码段包含程序的可执行代码,数据段包含全局变量和静态变量等,堆则包含动态分配的内存,栈则包含函数调用中局部变量和返回地址等。

Linux内存位置是系统中的一个重要部分。物理地址和虚拟地址之间的区别决定了操作系统如何分配内存,并且管理内存使得多个应用程序可以同时运行。在Linux系统中,虚拟地址空间被分成多个段,每个段都具有自己的属性和限制,以方便内存管理。虚拟内存则是操作系统管理内存的基本机制之一,确保程序在运行时总是有足够的内存可用。通过深入了解Linux内存位置的各个方面,您可以更好地理解如何正确分配内存,并优化Linux系统的性能。

相关问题拓展阅读:

Linux里面什么线性内存?

Linux内存线性地址空间格局解析

实用平台:i386

Linux内存线性地址空间大小为4GB,分为2个局部:用户空间局部(等闲是3G)和内核空间局部(等闲是1G)。在此我们重要关怀内核地址空间局部。

内核穿越内核页大局目录来管教所有的物理内存,由于线形地址前3G空间为用户利用,内核页大局目录前768项(刚好3G)除0、1两项外全副为0,后256项(1G)用来管教所有的物理内存。内核页大局目录在编译时静态地定义为swapper_pg_dir数组,该数组从物理内存地址0x101000处开始储藏。

由图可见,内核线形地址空间局部从PAGE_OFFSET(等闲定义为3G)开始,为了将内核装入内存,从PAGE_OFFSET开始8M线形地址用来照射内核所在的物理内存地址;接下来是mem_map数组,mem_map的起始线形地址与系统构造相干,例如对于UMA构造,由于从PAGE_SIZE开始16M线形地址空间对应的16M物理地址空间是DMA区,mem_map数组等闲开始于PAGE_SIZE+16M的线形地址;从PAGE_SIZE开始到VMALLOC_START

VMALLOC_OFFSET的线形地址空间直接照射到物理内存空间(一一对应影射,物理地址=线形地址-PAGE_OFFSET),这段区域的大小和机器切实具有的物理内存大小有关,这儿VMALLOC_OFFSET在x86上为8M,重要用来遏止越界讹谬;在内存比拟小的系统上,余下的线形地址空间(还要再扣除空白区即VMALLOC_OFFSET)被vmalloc()函数用来把不继续的物理地址空间照射到继续的线形地址空间上,在内存比拟大的系统上祥链,vmalloc()利用从VMALLOC_START到VMALLOC_END(也即PKMAP_BASE扣除2页的空白页大小PAGE_SIZE)的线形地址空间,此刻余下的线形地址空间(还要再扣除2页的空白区让雀即VMALLOC_OFFSET)又能够分成2局部:之一局部从PKMAP_BASE到FIXADDR_START用来由kmap()函坦宴早数照射高端内存;第二局部,从FIXADDR_START到FIXADDR_TOP,这是一个安宁大小的线形地址空间,(引用:Fixed

virtual addresses are needed for subsystems that need to know the

virtual address at compile time such as the

APIC),在x86系统构造上,FIXADDR_TOP被静态定义为0xFFFFE000,此刻这个安宁大小空间告终于全副线形地址空间最后4K前面,该安宁大小空间大小是在编译时计算出来并存储在__FIXADDR_SIZE变量中。真空断路器o:p>

正是由于vmalloc()利用区、kmap()利用区及安宁大小区的存在才使ZONE_NORMAL区大小受到局限,由于内核在运行时必需这些函数,因而在线形地址空间中起码要VMALLOC_RESERVE大小的空间。VMALLOC_RESERVE的大小与系统构造相干,在x86上,VMALLOC_RESERVE定义为128M,这即便为什么我们看到ZONE_NORMAL大小等闲是16M到896M的起因。

linux 内存位置的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux 内存位置,Linux内存位置详解:从物理地址到虚拟地址,Linux里面什么线性内存?的信息别忘了在本站进行查找喔。


数据运维技术 » Linux内存位置详解:从物理地址到虚拟地址 (linux 内存位置)