内核高端内存

csdn博客 内存相关

https://blog.csdn.net/pwl999/category_7217602.html

内核高端内存:

当内核模块代码或线程访问内存时,代码中的内存地址都为逻辑地址,而对应到真正的物理内存地址,需要地址一对一的映射

物理地址 = 逻辑地址 – 0xC0000000(3G):这是内核地址空间的地址转换关系,注意内核的虚拟地址在“高端”,但是ta映射的物理内存地址在低端。

设按照上述简单的地址映射关系,那么内核逻辑地址空间访问为0xc0000000 ~ 0xffffffff,那么对应的物理内存范围就为0×0 ~ 0×40000000,即只能访问1G物理内存。

若机器中安装8G物理内存,那么内核就只能访问前1G物理内存,后面7G物理内存将会无法访问

显然不能将内核地址空间0xc0000000 ~ 0xfffffff全部用来简单的地址映射。

因此x86架构中将内核地址空间划分三部分:ZONE_DMAZONE_NORMAL ZONE_HIGHMEM

ZONE_HIGHMEM即为高端内存,这就是内存高端内存概念的由来

 Linux将内核地址空间划分为三部分ZONE_DMAZONE_NORMALZONE_HIGHMEM

高端内存HIGH_MEM地址空间范围为 0xF8000000 ~ 0xFFFFFFFF896MB1024MB

如内核想访问2G开始的一段大小为1MB的物理内存,即物理地址范围为0×80000000 ~ 0x800FFFFF。访问之前先找到一段1MB大小的空闲地址空间,假设找到的空闲地址空间为0xF8700000 ~ 0xF87FFFFF,用这1MB的逻辑地址空间映射到物理地址空间0×80000000 ~ 0x800FFFFF的内存。

当内核访问完0×80000000 ~ 0x800FFFFF物理内存后,就将0xF8700000 ~ 0xF87FFFFF内核线性空间释放。这样其他进程或代码也可以使用0xF8700000 ~ 0xF87FFFFF这段地址访问其他物理内存。

从上面的描述,我们可以知道高端内存的最基本思想:借一段地址空间,建立临时地址映射,用完后释放,达到这段地址空间可以循环使用,访问所有物理内存。

Linux内核高端内存的划分

内核将高端内存划分为3部分:VMALLOC_START~VMALLOC_ENDKMAP_BASE~FIXADDR_STARTFIXADDR_START~4G

参考链接:

https://blog.csdn.net/tommy_wxie/article/details/17122923/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值