linux/mm/memory.c/int share_page(unsigned long address)

2023-05-16

/*
 * share_page() tries to find a process that could share a page with
 * the current one. Address is the address of the wanted page relative
 * to the current data space.
 *
 * We first check if it is at all feasible by checking executable->i_count.
 * It should be >1 if there are other tasks sharing this inode.
 */
// 首先,address为逻辑地址。
// share_page用来确定当前进程address地址处的页面是否有可能与某个其他进程的一个
// 页面共享。所谓共享,即让当前进程在寻址address页面时直接寻址到那个共享页面上
// 这种效果是通过修改当前进程页表中address地址处的页表项内容(这个内容就是address
// 地址对应的物理页面地址)为目标共享页面的物理地址来实现的。
static int share_page(unsigned long address)
{
struct task_struct ** p;


// 若当前进程没有可执行文件部分,直接退出。
if (!current->executable)
return 0;
// 若当前进程可执行部分存在,但是其inode引用次数小于2则退出。
// executable->i_count记录当前的进程可执行文件的inode被引用的次数,这个次数为1
// 说明这个可执行文件只被当前进程引用,这样根本就不用查找别的进程就可以知道
// 不可能找到别的进程页面可以用来共享的,所以直接返回。若这个引用计数为2,就说明
// 除当前进程外还有一个进程在引用这个executable文件,这样就共享的前提了。
if (current->executable->i_count < 2)
return 0;
// 执行到这里,说明除当前进程外还有别的进程引用了这个executable,于是遍历task[64]
// 来检测所有进程,来找到这些也引用了executable文件的进程然后try_to_share他们
for (p = &LAST_TASK ; p > &FIRST_TASK ; --p) {
// 若为空项,即task[64]中这个进程槽并未注册进程,直接进行下一个for项目。
if (!*p)
continue;
// 跳过当前进程,因为你总不能和自己try_to_share吧
if (current == *p)
continue;
// 跳过那些executable和当前进程不同的进程。
if ((*p)->executable != current->executable)
continue;
// 最后剩下的就是那些引用了当前进程executable文件的进程了,调用try_to_share
// 来试图和它共享页面。此处注意返回值。若share成功则返回1,若失败则返回0.
if (try_to_share(address,*p))
return 1;
}
// linux0.11的编程风格中有一个明显的特色,那就是return的使用。
// 首先,返回值反映了函数执行成功与否的信息。譬如本函数,成功则返回1,失败便返回0.
// 其次,函数运行逻辑中极少使用if + else来分化逻辑,而是采用if + return来分化:即
// 首先用if把那些不要的情况return掉,最后剩下的即是想要的逻辑分支了。
// 这种构架写起来和读起来都更加清晰,并且有利于函数的模块化封装,值得学习。
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux/mm/memory.c/int share_page(unsigned long address) 的相关文章

  • Nasm 打印到下一行

    我用 nasm Assembly 编写了以下程序 section text global start start Input variables mov edx inLen mov ecx inMsg mov ebx 1 mov eax 4
  • 在键盘热插拔上加载模块

    我正在尝试学习如何为 Linux 系统编写模块和驱动程序 类似于this https unix stackexchange com questions 120839 usb kernel module does not load on de
  • 从 Linux 命令行发送 SNMP 陷阱消息

    Folks 我需要从 Linux 命令行使用此命令 snmptrap 将自定义消息发送到陷阱侦听器 我需要根据用户设置在 v1 和 v2c 中发送相同的消息 这是我发现的 For v1 snmptrap v 1 c Tas hostname
  • 演员邮箱溢出。斯卡拉

    我目前正在与 scala 的两位演员合作 一 producer 产生一些数据并将其发送到parcer 生产者发送一个HashMap String HashMap Object List Int 通过消息 以及this标记发件人 parcer
  • 无法为 Python 3.4 创建工作虚拟环境

    I 安装Python 3 4 2 https docs python org 3 using unix html building python和我的 Linux Mint 17 1 中的 Virtualenv 12 0 5 然后我尝试创建
  • xdotool 类型需要很长时间并导致整个桌面冻结

    我一直在使用xdotool type过去只能在快捷方式上输入耸肩xdotool type 这可行 但总是需要相当长的时间 并导致整个桌面冻结 完全冻结 而不仅仅是输入 几秒钟 不过并没有太打扰我 现在我需要一种方法来从文件中读取内容 对其进
  • 变量作为 bash 数组索引?

    bin bash set x array counter 0 array value 1 array 0 0 0 for number in array do array array counter array value array co
  • Docker DNS 设置

    我尝试使用自定义网络和 dos 设置创建 docker 容器 docker网络创建 driver bridge opt com docker network bridge enable ip masquerade true opt com
  • 静态链接共享对象?或者损坏的文件?

    我有一个从专有来源获得的库 我正在尝试链接它 但出现以下错误 libxxx so 文件无法识别 文件格式无法识别 Collect2 ld 返回 1 退出状态 确实 ldd libxxx so statically linked 这究竟意味着
  • gnome-terminal 新选项卡,使用别名作为要执行的命令

    我已经创建了一个别名 bashrc文件如下 alias myproject cd Desktop myproject 当我重新启动终端时保存文件后 输入myproject带我到项目目录 但是当我尝试使用别名作为新的命令参数时gnome te
  • List.Clear() 在 C# 中是如何实现的?

    我假设它使用数组来实现 List 怎么List Clear 实施的 它实际上清理了数组还是只是为此列表创建了一个新数组 public class List private Array array public void Clear1 arr
  • gcc 不太可能使用宏

    我正在编写一段关键代码 其逻辑大致如下 if expression is true do something with extremely low latency before the nuke blows up This branch i
  • 使用脚本自动输入 SSH 密码

    我需要创建一个自动向 OpenSSH 输入密码的脚本ssh client 假设我需要通过 SSH 进入myname somehost用密码a1234b 我已经尝试过 bin myssh sh ssh myname somehost a123
  • sqlite 插入需要很长时间

    我正在将不到 200 000 行插入到 sqlite 数据库表中 我只是在终端中通过 sqlite3 使用一个非常简单的 sql 文件 我打赌它已经运行了至少 30 分钟 这是正常现象还是我应该关闭该过程并尝试不同的方法 sqlite中的插
  • 是否有可能在linux中找到包含特定文本的文件?

    考虑这种情况 我在文件夹 Example 下有很多文件 如果我需要找到一个包含特定短语 如 Class Example 的文件 我该如何使用 Linux shell 来做到这一点 linux中有类似 定位 的函数可以做到这一点吗 Thank
  • linux下如何获取昨天和前天?

    我想在变量中获取 sysdate 1 和 sysdate 2 并回显它 我正在使用下面的查询 它将今天的日期作为输出 bin bash tm date Y d m echo tm 如何获取昨天和前天的日期 这是另一种方法 对于昨天来说 da
  • R 未获取用户库

    我有一个带 R 3 6 0 的 Fedora 30 系统 用户库设置在Renviron就像这个 R LIBS USER R LIBS USER R x86 64 redhat linux gnu library 3 6 事实上 它出现在交互
  • 如何从 Linux 的 shell 中删除所有以 ._ 开头的文件?

    确实如标题所示 我已将许多文件从 Mac 复制到 Raspberry Pi 这导致了许多以前缀开头的多余文件 我想删除以以下开头的文件夹中的每个文件 我该怎么做 尝试类似的方法 cd path to directory rm rf 或者 如
  • 如何在 Swift 中将 Int 转换为字符

    我在这里挣扎了十多分钟 失败了 我屈服了 我需要在 Swift 中将 Int 转换为 Character 但无法解决它 Question 你如何转换 cast an Int integer to a Character char 在斯威夫特
  • 错误:NVIDIA-SMI 失败,因为无法与 NVIDIA 驱动程序通信

    NVIDIA SMI 抛出此错误 NVIDIA SMI 失败 因为无法与 NVIDIA 通信 司机 确保安装了最新的 NVIDIA 驱动程序并且 跑步 我清除了 NVIDIA 并按照提到的步骤重新安装了它here https askubun

随机推荐