Linux用户空间与内核地址空间的详细介绍

介绍

这篇文章主要介绍“Linux用户空间与内核地址空间的详细介绍”,在日常操作中,相信很多人在Linux用户空间与内核地址空间的详细介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答“Linux用户空间与内核地址空间的详细介绍”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Linux,操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。

<强> Linux内核地址映射模型

x86处理器采用了段页式地址映射模型。进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存。

段页式机制如下图。

<中心> 癓inux用户空间与内核地址空间的详细介绍”

<强> Linux内核地址空间划分

通常32位Linux内核地址空间划分0 ~ 3 g为用户空间,3 ~ 4 g为内核空间。注意这里是32位内核地址空间划分,64位内核地址空间划分是不同的。

<中心> 癓inux用户空间与内核地址空间的详细介绍”

<强> Linux内核高端内存的由来

当内核模块代码或线程访问内存时,代码中的内存地址都为逻辑地址,而对应到真正的物理内存地址,需要地址一对一的映射,如逻辑地址0 xc0000003对应的物理地址为0,次;3、0 xc0000004对应的物理地址为0,次;4,白马王子,和白马王子,逻辑地址与物理地址对应的关系为

物理地址=逻辑地址,mdash;0 xc0000000

<中心> 癓inux用户空间与内核地址空间的详细介绍”

假设按照上述简单的地址映射关系,那么内核逻辑地址空间访问为0 xc0000000 ~ 0 xffffffff,那么对应的物理内存范围就为0,次;0 ~,0,倍;40000000,即只能访问1 g物理内存。若机器中安装8 g物理内存,那么内核就只能访问前1 g物理内存,后面7 g物理内存将会无法访问,因为内核,的地址空间已经全部映射到物理内存地址范围0,次;0 ~,0,倍;40000000。即使安装了8 g物理内存,那么物理地址为0,倍;40000001的内存,内核该怎么去访问呢?代码中必须要有内存逻辑地址的,0 xc0000000, ~ 0 xffffffff的地址空间已经被用完的了,所以无法访问物理地址0,倍;40000000以后的内存。

显然不能将内核地址空间0 xc0000000 ~, 0 xfffffff全部用来简单的地址映射。因此x86架构中将内核地址空间划分三部分:ZONE_DMA, ZONE_NORMAL和,ZONE_HIGHMEM.ZONE_HIGHMEM即为高端内存,这就是内存高端内存概念的由来。

在x86结构中,三种类型的区域如下:

ZONE_DMA内存开始的16 mb

ZONE_NORMAL 16 mb ~ 896 mb

ZONE_HIGHMEM 896 mb ~结束

<中心> 癓inux用户空间与内核地址空间的详细介绍”

<强> Linux内核高端内存的理解

前面我们解释了高端内存的由来.Linux将内核地址空间划分为三部分ZONE_DMA, ZONE_NORMAL和ZONE_HIGHMEM,高端内存HIGH_MEM地址空间范围为,xf8000000 ~ 0, 0 xffffffff (896 mb ~ 1024 mb)。那么如内核是如何借助128 mb高端内存地址空间是如何实现访问可以所有物理内存?

当内核想访问高于896 mb的物理地址内存时,从0 xf8000000 ~, 0 xffffffff地址空间范围内找一段相应大小空闲的逻辑地址空间,借用一会借。用这段逻辑地址空间,建立映射到想访问的那段物理内存(即填充内核PTE页面表),临时用一会,用完后归还。这样别人也可以借用这段地址空间访问其他物理内存,实现了使用有限的地址空间,访问所有所有物理内存。如下图。

<中心> 癓inux用户空间与内核地址空间的详细介绍”

例如内核想访问2 g开始的一段大小为1 mb的物理内存,即物理地址范围为0,倍;80000000 ~,0 x800fffff。访问之前先找到一段1 mb大小的空闲地址空间,假设找到的空闲地址空间为0 xf8700000 ~, 0 xf87fffff,用这1 mb的逻辑地址空间映射到物理地址空间0,倍;80000000 ~ 0 x800fffff的内存。映射关系如下:

<中心> 癓inux用户空间与内核地址空间的详细介绍”

Linux用户空间与内核地址空间的详细介绍