0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

虚拟机:linux高端内存管理之永久内核映射

如意 来源:CSDN 作者:CaspianSea 2020-06-23 08:38 次阅读

与直接映射的物理内存末端、高端内存的始端所对应的线性地址存放在high_memory变量中,在x86体系结构上,高于896MB的所有物理内存的范围大都是高端内存,它并不会永久地或自动地映射到内核地址空间,尽管x86处理器能够寻址物理RAM的范围达到4GB(启用PAE可以寻址到64GB)。一旦这些页被分配,就必须in射到内核的逻辑地址空间上。在x86上,高端内存中的页被映射到3GB-4GB。

内核可以采用三种不同的机制将页框映射到高端内存;分别叫做永久内核映射、临时内核映射以及非连续内存分配。在这里,只总结前两种技术,第三种技术将在后面总结。

建立永久内核映射可能阻塞当前进程;这发生在空闲页表项不存在时,也就是在高端内存上没有页表项可以用作页框的“窗口”时。因此,永久内核映射不能用于中断处理程序和可延迟函数。相反,建立临时内核映射绝不会要求阻塞当前进程;不过,他的缺点是只有很少的临时内核映射可以同时建立起来。

使用临时内核映射的内核控制路径必须保证当前没有其他的内核控制路径在使用同样地映射。这意味着内核控制路径永远不能被阻塞,后者其他内核控制路径有可能使用同一个窗口来映射其他的高端内存页。

永久内存映射

永久内核映射允许内核建立高端页框到内核地址空间的长期映射。他们使用住内核页表中一个专门的页表,其地址存放在变量pkmap_page_table中,这在前面的页表机制管理区初始化中已经介绍过了。页表中的表项数由LAST_PKMAP宏产生。因此,内核一次最多访问2MB或4MB的高端内存。

虚拟机:linux高端内存管理之永久内核映射

该页表映射的线性地址从PKMAP_BASE开始。pkmap_count数组包含LAST_PKMAP个计数器,pkmap_page_table页表中的每一项都有一个。

高端映射区逻辑页面的分配结构用分配表(pkmap_count)来描述,它有1024项,对应于映射区内不同的逻辑页面。当分配项的值等于0时为自由项,等于1时为缓冲项,大于1时为映射项。映射页面的分配基于分配表的扫描,当所有的自由项都用完时,系统将清除所有的缓冲项,如果连缓冲项都用完时,系统将进入等待状态。

虚拟机:linux高端内存管理之永久内核映射

为了记录高端内存页框与永久内核映射包含的线性地址之间的联系,内核使用了page_address_htable散列表。该表包含一个page_address_map数据结构,用于为高端内存中的每一个页框进行当前映射。而该数据结构还包含一个指向页描述符的指针和分配给该页框的线性地址。

page_address()函数返回页框对应的线性地址

虚拟机:linux高端内存管理之永久内核映射

kmap()函数建立永久内核映射。

虚拟机:linux高端内存管理之永久内核映射

kunmap()函数撤销先前由kmap()建立的永久内核映射

虚拟机:linux高端内存管理之永久内核映射

虚拟机:linux高端内存管理之永久内核映射


如果页确实在高端内存中,则调用kunmap_high()函数

虚拟机:linux高端内存管理之永久内核映射

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11204

    浏览量

    208699
  • 内存
    +关注

    关注

    8

    文章

    2965

    浏览量

    73804
  • 虚拟机
    +关注

    关注

    1

    文章

    904

    浏览量

    28016
收藏 人收藏

    评论

    相关推荐

    Linux内核内存映射原理分析

    Linux 内核采用延迟分配物理内存的策略,在进程第一次访问虚拟页的时候,产生缺页异常。如果是文件映射,那么分配物理页,把文件指定区间的数据
    发表于 07-21 17:06 2335次阅读

    Linux内核地址映射模型与Linux内核高端内存详解

    Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当
    发表于 05-08 10:33 3435次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>地址<b class='flag-5'>映射</b>模型与<b class='flag-5'>Linux</b><b class='flag-5'>内核</b><b class='flag-5'>高端</b><b class='flag-5'>内存</b>详解

    ARM32 Linux内存布局

    ,若都被占用不释放,则没有建立映射到物理内存都无法访问了。2. Linux内核高端内存的划分对于
    发表于 04-24 14:20

    Linux虚拟内存和物理内存的深刻分析

    能够映射的物理内存大小只有896MB,该值保存在high_memory中。内核地址空间的线性地址区间如下图所示:​ 从图中可以看出,内核采用了三种机制将
    发表于 05-31 08:00

    linux虚拟机怎么联网

    虚拟机安装linux系统无法上网的解决方法。
    发表于 06-03 09:29 2350次阅读

    虚拟机Linux如何测试 DBUS Daemon

    虚拟机Linux如何测试 DBUS Daemon
    的头像 发表于 06-22 16:35 4274次阅读
    <b class='flag-5'>虚拟机</b>:<b class='flag-5'>Linux</b>如何测试 DBUS Daemon

    Linux虚拟机tcpdump命令操作详解

    Linux虚拟机tcpdump命令操作详解
    发表于 08-12 09:50 23次下载

    KVM虚拟机管理和基本使用

    KVM — 全称是基于内核虚拟机(Kernel-based Virtual Machine)是一个开源软件,基于内核虚拟化技术,实际是嵌入系统的一个
    的头像 发表于 02-07 09:20 1227次阅读

    使用Ansible构建虚拟机部署Linux的最佳实践

    编者按:本文节选自节选自《基于Linux的企业自动化》第五章。“第5章,使用Ansible构建用于部署的虚拟机模板,通过构建虚拟机模板来探索部署Linux的最佳实践,
    的头像 发表于 05-16 15:13 1056次阅读

    Linux 内存管理总结

    一、Linux内存管理概述 Linux内存管理是指对系统内存
    的头像 发表于 11-10 14:58 484次阅读
    <b class='flag-5'>Linux</b> <b class='flag-5'>内存</b><b class='flag-5'>管理</b>总结

    linux虚拟机系统基本指令

    Linux虚拟机系统是一种通过虚拟化技术在物理服务器上部署多个独立的虚拟机实例的操作系统。它可以帮助用户更有效地利用硬件资源,并方便地部署和管理
    的头像 发表于 11-17 10:04 1487次阅读

    linux虚拟机使用教程

    引言:Linux虚拟机是一种方便且常用的技术,它允许用户在现有操作系统的基础上创建和运行另一个独立的操作系统。在本篇文章中,我们将提供一份详尽的教程,帮助你了解如何安装、配置和使用Linux
    的头像 发表于 11-17 10:06 1194次阅读

    虚拟机linux怎么编写程序

    虚拟机Linux上编写程序是一项非常常见且有用的任务。无论是开发一个简单的脚本、一个Web应用程序还是一个复杂的软件项目,Linux提供了强大的工具和环境来帮助你进行编程。本文将详细介绍如何在
    的头像 发表于 11-17 10:08 1631次阅读

    linux虚拟机怎么运行代码

    运行代码是Linux虚拟机中的常见操作,本文将详细介绍如何运行代码。 首先,要运行代码,你需要先安装好Linux虚拟机,并确保能够顺利运行。接下来,你需要打开
    的头像 发表于 11-17 10:12 4793次阅读

    怎么安装linux虚拟机

    在计算机领域,虚拟机是一种软件程序,它允许在主操作系统上运行多个虚拟操作系统。Linux虚拟机在开发、测试和学习等环境中得到广泛应用。本文将详细介绍如何安装
    的头像 发表于 11-23 10:50 1025次阅读