在Linux中,属于内核数据段的物理内存页是否可交换?

2024-03-13

我这样问是因为我记得属于内核的所有物理页面都固定在内存中,因此是不可交换的,就像这里所说的:http://www.cse.psu.edu/~axs53/spring01/linux/memory.ppt http://www.cse.psu.edu/~axs53/spring01/linux/memory.ppt

然而,我正在阅读一篇研究论文,并感到困惑,因为它说: “(物理)页面经常在内核数据段和用户空间之间移动。”

它还提到,相比之下,物理页不在内核代码段和用户空间之间移动。

我认为如果一个物理页有时属于内核数据段,有时属于用户空间,那么一定意味着属于内核数据段的物理页是可交换的,这与我目前的理解相悖。

那么,属于内核数据段的物理页是可交换的吗?不可交换?

附:该研究论文可在此处获取:https://www.cs.cmu.edu/~arvinds/pubs/secvisor.pdf https://www.cs.cmu.edu/~arvinds/pubs/secvisor.pdf

请搜索“之间移动”,您会找到它。

附:同样,从[3G + 896M]到4G的虚拟内存区域属于内核,用于映射ZONE_HIGHMEM中的物理页(x86 32位Linux,3G + 1G设置)。在这种情况下,内核可能首先将该区域中的一些虚拟页映射到承载当前进程页表的物理页,修改一些页表条目,并取消映射虚拟页。这样,物理页有时可能属于内核,有时属于用户空间,因为它们在取消映射后不属于内核,从而变得可交换。是这个原因吗?


tl;dr - 内存池和交换是不同的概念。您不能从其中之一对另一方进行任何扣除。


kmalloc()和其他内核数据分配来自板坯/竹节等等。内核获取用户空间数据的同一位置。因此页面频繁地在内核数据段和用户空间之间移动。这是对的。它没有说任何关于交换的事情。这是一个单独的问题,你无法推断出任何东西。

内核代码通常在启动时填充并标记为只读,此后永远不会更改。因此物理页不在内核代码段和用户空间之间移动.

为什么你认为因为来自同一个池子的东西是相同的?网络套接字也来自同一个内存池。它是一个关注点分离. The linux-mm(内存管理系统)处理交换。可以固定页面(不可交换)。检查静态内核内存(这可能包括.bss and .data) 是一个简单的范围检查。内存通常被固定并标记为不可交换linux-mm层。用户数据(谁的分配来自同一个池)可以被标记为可交换linux-mm。例如,即使没有交换,用户空间文本仍然是可交换的,因为它由inode。对于只读数据来说,缓存要简单得多。如果数据被交换,则会在 MMU 表中进行标记,并且故障处理程序必须区分交换和SIGBUS;这是linux-mm.

还有一些 Linux 版本no-mm(或者没有 MMU)并且这些永远不会交换任何东西。理论上,有人可能能够交换内核数据;但事实并非如此。但为什么它在内核中呢? Linux 的方式是使用module并且仅根据需要加载它们。当然,linux-mmdata 是内核数据,希望您能看到交换它的问题。

像这样的概念性问题的问题,

  1. 它可能因 Linux 版本而异。
  2. 它可能因 Linux 配置而异。
  3. 该建议可能会随着 Linux 的发展而改变。

当然,linux-mm 代码不可交换,任何中断处理程序也不可交换。在某个时间点,内核代码和/或数据可能会被交换。我认为这不是模块加载/卸载之外的当前情况(并且对于您是否称其为相当迂腐/深奥)swapping或不)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Linux中,属于内核数据段的物理内存页是否可交换? 的相关文章

  • 在嵌套函数中自我捕获

    对于闭包 我通常会附加 weak self 到我的捕获列表 然后进行空检查self func myInstanceMethod let myClosure weak self result Bool in if let this self
  • 当非特权用户运行 C/asm 程序时,会对 Linux 造成什么危害?

    我一直在考虑一种场景 让用户 可以是任何人 可能有恶意 提交在 Linux PC 我们称之为基准节点 上运行的代码 目标是为单线程例程创建一种自动化基准测试环境 假设一个网站向代理发布了一些代码 该代理将此代码交给基准节点 而基准节点仅与代
  • 套接字对和一对无名管道有什么区别吗?

    我不仅想知道用户端的差异 还想知道 Linux 内核实现中的差异 共同部分 管道是单向的 因此需要两个管道才能进行双向通信 而套接字对是双向的 管道始终是面向流的 而套接字对可以是面向数据报的 套接字对正常AF UNIX套接字 这意味着辅助
  • mod_fcgid + PHP + apache 锁定

    我正在运行一个相当典型的 LAMP 堆栈 其中 PHP 通过 mod fcgid 运行 考虑到服务器收到的流量 我认为服务器处于 高负载 状态 存在一个间歇性问题 当访问依赖 PHP 的站点时 Apache 报告所有连接都处于 正在发送内容
  • 从该共享库中查找加载的共享库的位置?

    从共享库中的函数 在正在运行的进程 用 C 编写 内 我如何发现该共享库是从哪里加载的 我找到的所有答案都涉及使用诸如ldd在命令行中 或者通过查看 proc self maps 在 Win32 上 我只需使用GetModuleFileNa
  • 在 systemd 服务文件内/内联添加 shell 命令

    我正在运行gunicorn通过 systemd 将服务器作为服务 这是示例service file Unit Description Gunicorn NGINX After network target Service User root
  • tar 命令在提取时更改所有者:组

    使用此命令提取文件时tar zxf bluez arm package tgz文件和目录的所有者 1000 组 脉冲 是 更改如下例 Example drwxrwxr x 4 1000 pulse 1024 Jul 21 00 32 dbu
  • 文件在 rpm 规范文件中列出两次

    我的规范文件的文件部分如下所示 files prefix htdocs config prefix htdocs share settings config inc php 现在 由于配置文件已经包含在 prefix htdocs 我收到警
  • Ruby - 在 tmp/pids/thin.pid 中找不到 PID (Thin::PidFileNotFound)

    我试图开始精简我的应用程序 但随后pid无法生成 thin C var www project path current config myproject testing yml start 现在我无法阻止它 因为没有 pid thin C
  • Linux环境下串口数据转换为TCP/IP

    我需要从Linux系统的串口获取数据并将其转换为TCP IP发送到服务器 这很难做到吗 我有一些基本的编程经验 但对 Linux 的经验不多 有没有开源应用程序可以做到这一点 在 Linux 中您不需要编写程序来执行此操作 只是pipe h
  • 缺少 /var/lib/mysql/mysql.sock 文件

    我正在尝试访问 mysql 当我运行 mysql 命令时 我得到以下信息 root ip 10 229 65 166 tpdatabase 1 8 0 28356 mysql 错误 2002 HY000 无法连接到 通过socket本地My
  • 如何使用AWK从文件中连续输出行

    我有一个多行文件 我想连续输出文件的某些行 比如第一次 从第1行打印到第5行 下次 打印第2行到第6行 依此类推 我发现 AWK 是一个非常有用的函数 我尝试自己编写代码 但它什么也没输出 以下是我的代码 bin bash for n in
  • 如何显示 Jupyter 笔记本的版本并在 Jupyter 笔记本中运行单元?我收到错误:错误的解释器

    我已经安装了 Anaconda 并使用 conda 环境和 conda 命令来安装软件 当我输入 jupyter notebook version 我收到以下错误 zsh Users cr517 local bin jupyter bad
  • 如何强制操作系统收回内存? (C++)

    在我的 C 代码中 我分配了大量内存来创建树 然后在每个节点中使用 删除 来释放内存 删除所有内容后 我检查操作系统使用的内存量 发现内存未释放 这是预期的 因为该进程不会立即将内存返回给操作系统 因为它仍然可能会再次使用它 问题是 我在删
  • 如何减少Scala中创建的对象数量?

    我正在 Scala 中编写一个计算机图形应用程序 它使用 RGB 类返回图像中某个点的颜色 正如你可以想象的 返回颜色 RGB 对象的函数被调用了很多次 class RGB val red Int val green Int val blu
  • 如何在 Amazon Linux 上安装最新版本的 GDAL?

    我想安装GDAL https gdal org 在运行 Amazon Linux 的 EC2 实例上 我认为它基于 RHEL 6 如果可能的话 我想避免从源代码编译 EPEL Yum 存储库中包含的 GDAL 版本对于我的目的来说太旧了 g
  • 检查 VT-x 是否已激活而无需在 Linux 中重新启动?

    我有一台配备 Intel Core i5 M 450 2 40GHz 的笔记本电脑 显然有 VT x 但没有 VT d 我有 Ubuntu 12 04 32 位 但希望在其上运行基于虚拟 64 位终端的 Linux 我如何知道 BIOS 是
  • 系统调用:sys_exit()、SYS_exit 和 exit() 之间的区别

    SYS exit sys exit 和 exit 之间有什么区别 我的理解是 Linux内核提供了系统调用 这些调用在man 2 syscalls 这些系统调用的包装函数由glibc它们的名称与系统调用大多相似 我的问题 在man 2 sy
  • 无法从外部 bash 脚本正确设置 MySQL 密码

    我有两个脚本 主要的一个脚本执行一些不同的操作并调用第二个脚本 第二个脚本安装 MySQL 从我的主脚本中我做了这样的事情 read p Set the password for the database min 4 characters
  • pthread_create 编译返回错误

    我使用以下代码创建两个线程 header files include

随机推荐

  • 避免刷新页面时 Spring MVC 表单重新提交

    我正在使用 spring MVC 将数据保存到数据库中 问题是当我刷新页面时它重新提交 JSP 页面 下面是我的代码片段
  • Pipenv install 给出“pew 不在您的路径中”

    我有 Mac OS X El Capitan 安装了 python 3 6 pip pipenv 无法使 Pipenv 工作 pipenv install Creating a virtualenv for this project War
  • 如何使用 iPhone 的摄像头跟踪运动?

    我看到有人制作了一个应用程序 可以使用摄像头跟踪你的脚 这样你就可以在 iPhone 屏幕上踢虚拟足球 你怎么能做这样的事 有谁知道有关使用 iPhone 摄像头检测物体并跟踪它们的任何代码示例或其他信息吗 我刚刚在 SecondConf
  • SharePoint 应用程序部署错误:“无法安装 SharePoint 应用程序”

    当我尝试添加 SharePoint mvc 应用程序时 出现以下错误 Error occurred in deployment step Install app for SharePoint Failed to install app fo
  • 流星mup永久怎么用?

    我可以在 Meteor mup 文档中读到 如果进程崩溃 它会永远使用它来重新启动进程 https github com arunoda meteor up https github com arunoda meteor up 在命令行中
  • Xcode 4“等待进程‘Appname’启动

    我安装了 Xcode 4 但现在无法运行我的 iPhone 项目之一 Copyright 2004 Free Software Foundation Inc GDB is free software covered by the GNU G
  • 为什么java中BitSet的内部数据存储为long[]而不是int[]?

    在java中 内部数据BitSet https docs oracle com javase 8 docs api java util BitSet html存储为long 而不是int 我想知道为什么 jdk中的代码如下 The inte
  • 如何在 Firefox 中动态调整 iFrame 大小?

    我使用本页所述的解决方案根据内容调整 iFrame 的大小 根据内容调整 iframe 的大小 https stackoverflow com questions 153152 resizing an iframe based on con
  • 使用不同版本的 Android 支持库的解决方法

    这是参考 build gradle 文件中出现的警告消息 所有 com android support 库必须使用完全相同的版本 规范 混合版本可能会导致运行时崩溃 我很清楚这一点 并在我自己的代码 构建中使用相同的版本 然而 当涉及到某些
  • 更改 bash 中的单词分隔符

    我想更改 bash 或 readline 用于分隔单词的分隔符 具体来说我想做 不分隔单词 这样如果我有文本 ls some file 我按Alt Backspace它删除整个some file文本 而不仅仅取决于 字符 这也会导致删除长标
  • 密码通知脚本在剩余天数内引发“类型不匹配”错误

    我可以让每个人单独工作 但我无法让他们一起工作 登录脚本使用strArg 调用HTA文件时 HTA文件会生成一个密码窗口 当登录脚本运行 HTA 文件时 第 31 行和第 106 行出现错误 我知道问题出在strArg 我想不明白 应在到期
  • 控制器映射中的 ASP.NET MVC 枚举参数

    ASP NET MVC 为控制器方法提供了简单的模板 例如Details 并且可以有类似的东西 public ActionResult Details int id do something 可以通过以下方式访问 http localhos
  • 如何向 JTable java 插入/删除列

    我不知道该怎么办 我正在创建一个应用程序 我需要使用表格 所以我使用 JTable 但我对此有很多问题 它似乎有效 但是当我尝试删除列时 该列消失了 仅在 GUI 中 但所有信息仍然存在 列数也不会改变 我搜索并尝试了很多不同的代码 但没有
  • MySQL 中的“unsigned”是什么意思以及何时使用它?

    MySQL 中的 unsigned 是什么意思 什么时候应该使用它 MySQL http dev mysql com doc refman 5 7 en numeric type attributes html says 所有整数类型都可以
  • 更改别名目标 python

    我想使用 python 更改别名的目标 我是否必须下载一些外部库才能执行此操作 我尝试了一下别名 但无法找到任何无需用户输入即可编辑它们的方法 我使用的是Mac Python 2 6 据我所知 使用 PyObjC 应该可以访问 Mac 的基
  • 上传时获取原始文件创建日期

    我们有一个将文件上传到我们网站的流程 对于用户来说 能够看到这些文件的创建时间变得很重要 我正在寻找一种从 HttpPostedFile 中提取原始创建日期的方法 如果有人对我有想法 我会非常感激 此时我有点困惑 您无权访问在客户端上创建文
  • Autoscaling 组中的 UpdatePolicy 对于 AWS CloudFormation 更新无法正常工作

    我正在使用 AWS CloudFormation 启动我的服务器堆栈 我创建了一个 LaunchConfig 然后创建了使用上述 launchconfig 的 AutoScaling 组 我已经设置了 CreationPolicy 它等待来
  • jQuery 的 .val() 在 Facebox 中不起作用

    我正在使用 Facebox http defunkt github com facebox http defunkt github com facebox 在我的网站之一上 我还在网站上广泛使用 jQuery 我的问题是 val 函数似乎无
  • 使用脚本桥创建 iTunes 播放列表

    我正在尝试使用可可脚本桥创建一个新的用户播放列表 但似乎无法让它工作 到目前为止我有 iTunesApplication iTunes SBApplication applicationWithBundleIdentifier com ap
  • 在Linux中,属于内核数据段的物理内存页是否可交换?

    我这样问是因为我记得属于内核的所有物理页面都固定在内存中 因此是不可交换的 就像这里所说的 http www cse psu edu axs53 spring01 linux memory ppt http www cse psu edu