linux/mm/memory.c/put_page

2023-05-16

// put_page用来完成物理页面与一个线性地址页面的挂接,从而将一个
// 线性地址空间内的页面落实到物理地址空间内,copy_page_tables函数
// 只是为一个进程提供了在线性地址空间的一个页表及1024页内存,而当时
// 并未将其对应的物理内存上。put_page函数则负责为copy_page_tables开
// 的“空头支票”买单。
// page为物理地址,address为线性地址
unsigned long put_page(unsigned long page,unsigned long address)
{
unsigned long tmp, *page_table;


/* NOTE !!! This uses the fact that _pg_dir=0 */


// 要映射的线性地址只能在主内存区,你不能给内存起始1M范围内映射线性地址
// 因为LOW_MEM内是给内核用的,且不属于分页内存范围。
if (page < LOW_MEM || page >= HIGH_MEMORY)
printk("Trying to put page %p at %p\n",page,address);
// (page-LOW_MEM)>>12得到page这个物理地址对应的页号
// mem_map[(page-LOW_MEM)>>12] !=1是检查这个page地址对应的物理内存页面
// 是不是已经注册过的页面(用get_free_page函数申请,申请时会再mem_map中
// 注册这个页面,也就是把这个页面对应的mem_map项加1。所以此处==1就代表
// 这个物理页面是刚申请好备用的,只有这种物理页面才能被映射到一个线性地
// 址。所以这里!=1就要警告)
if (mem_map[(page-LOW_MEM)>>12] != 1)
printk("mem_map disagrees with %p at %p\n",page,address);
// page_table得到address线性地址页面在页目录表中对应表项的首地址指针,这个
// 指针用来得到页表基地址,然后寻址就进行到了页表级。再配合address的次10位
// 就能寻址到address对应的内存页面基地址了。最后12bit用来在页面内寻址。
page_table = (unsigned long *) ((address>>20) & 0xffc);
// 检验address对应的页目录表项内容,即页表地址是不是有效地,若页表有效,则
// 直接把页表地址给page_table;若页表无效,则调用get_free_page函数在mem_map
// 数组内申请一个空闲页面,并将这个空闲页面设置为用户级、只读、存在,再将
// 新申请并处理好的页面地址赋值给page_table
if ((*page_table)&1)
page_table = (unsigned long *) (0xfffff000 & *page_table);
else {
if (!(tmp=get_free_page()))
return 0;
*page_table = tmp|7;
page_table = (unsigned long *) tmp;
}
// 上面已经得到了一个有效地page_table了,现在就要将page这个物理页面和address
// 这个线性地址处的页面挂接起来了。挂接的方法就是在page_table中,将address对应
// 的页表项中的内容(即address这个地址所在的页面基地址)设置为page这个物理地址
// |7没什么好说的,这里值得关注的是page_table竟然还可以当做数组来用···刚开始
// 着实吃了一惊,不过仔细想想page_table本来就是个指针,而1024个页表项也和数组
// 结构一样的,用数组的方式来访问也是可行的(当然我还是觉得用指针+偏移量更好理解)
// 再次感叹C语言的灵活啊
// 再说明下(address>>12)&0x3ff吧,毕竟自己没看出来,还是看了赵炯博士的注释才发现
// 的。这个操作实际是取出address次10位表示页面在页表内的偏移值。这样用这个偏移值
// 结合page_table这个页表首地址,就能找到address所在的页面基地址了。
page_table[(address>>12) & 0x3ff] = page | 7;
/* no need for invalidate */
return page;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux/mm/memory.c/put_page 的相关文章

随机推荐

  • Haar特征计算过程【DataWhale学习记录】

    0 前言 本文重点在于对4 haar特征值的一般性计算过程 5 Haar的分类过程 7 积分图优化Haar特征计算效率进行了详细的介绍 xff0c 也是比较有意思的部分 但是由于本人水平有限 xff0c 关于 利用并查集 合并 检测结果窗口
  • python 图片数据清洗,图片去重,去掉模糊图片,去掉结构性相似的图片

    1 python代码去掉完全相同的图片 重复的图片移动到另一文件夹保存 import shutil import numpy as np from PIL import Image import os def 比较图片大小 dir imag
  • [经验]deformable-detr配置问题:make.sh失败

    报错内容如下 xff1a 在翻遍了GitHub issues也没找到解决方案 xff0c 但貌似多数问题和CUDA版本 pytorch版本等问题相关 xff0c 另外它这个代码里涉及到的setup py又是DCNv2改的 xff0c 又搜了
  • 【推荐工具】connected papers:文献知识图谱神器

    应用背景 在阅读文献 写综述 写论文的related works的时候 xff0c 总会苦恼如何查阅该领域的论文呢 xff1f 怎么才能尽可能的查找齐全 xff1f 以前在看论文的时候 xff0c 我都是先用谷歌学术搜索 xff0c 然后看
  • 【经验】python运行报错ModuleNotFoundError: No module named XXX

    应用场景 本来是在pycharm里运行Python file xff0c 一切都很正常 xff0c 然后为了让脚本自己乖乖地在服务器上跑 xff0c 不占用IDE调试其他代码 xff0c 所以决定用命令行直接在服务器上运行 xff0c 结果
  • 【读书笔记】动手学深度学习(阿斯顿·张,李沐等)第二章(更新中)

    本文旨在记录阅读本书过程中遇到的在以往学习和使用中忽略的知识点 xff0c 也包括一些需要加强记忆的重点 此外 xff0c 原书中主要基于深度学习框架mxnet xff0c 但官方网站和对应代码中也提供了pytorch对应的版本 xff0c
  • 【经验】移植环境requirement时报错

    问题描述 在使用pip freeze gt requirements txt和pip install r requirement txt xff08 requirements txt文件用来记录当前程序的所有依赖包及其精确版本号 xff09
  • 计算机网络自顶向下第三章习题

    计算机网络第三章作业 R9 接收方通过检查序号可以判断接收到的分组是新的数据还是一次重传 xff0c 这样可以解决冗余分组问题 R10 当在信道上发生丢包时 xff0c 发送方不知道是一个数据分组丢失还是一个ACK丢失 xff0c 或者只是
  • samba服务器简介以及常用命令

    Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件 xff0c 由服务器及客户端程序构成 SMB xff08 Server Messages Block xff0c 信息服务块 xff09 是一种在局域网上共享文件和打印机
  • 提高虚拟机中使用ubuntu系统的流畅度

    背景 虚拟机 xff1a virtual box6 1ubuntu版本 xff1a 14 04 现象 1 默认主题下 xff0c 编辑代码时 xff0c 会出现很卡的现象 xff08 频率较高 xff09 2 操作界面不流畅 对策 可能虚拟
  • QEMU搭建U-Boot+Linux+NFS 环境 学习笔记

    使用QEMU搭建U Boot 43 Linux 43 NFS嵌入式开发环境 QEMU简介使用QEMU的事情使用QEMU学习嵌入式的好处驱动开发技能搭建嵌入式基本开发环境基本环境Vmware 43 Ubuntu18 04Vmwaretools
  • brctl使用教程

    使用brctl来操作网桥还是很方便的 xff01 比使用ip命令来操作方便多了 brctl安装 Centos系统 yum install bridge utils Ubuntu系统 Debian系 apt get install bridg
  • IntelliJ IDEA 之 配置JDK 的 4种方式

    一 新建项目前配置JDK 打开idea集成开发环境工具 xff0c 点击File gt Project Structure 如下图 xff1a 在打开的页面中 xff0c 选择SDKs属性 xff0c 并点击中间的加号 43 选择JDK x
  • STM32如何在LCD上显示单词、文字、图片等

    本文将介绍STM32F103R6如何在LCD12864上显示文字图片 注 xff1a 本文中用到的字模软件 xff0c 我放在了文章末尾 xff0c 点击链接即可下载 xff0c 是绿色版软件 xff0c 解压即可使用 xff01 点击下载
  • JAVA之Lambda表达式详解

    文章目录 一 基本概念1 背景2 Lambda表达式的语法3 函数式接口 二 Lambda表达式的基本使用1 无返回值函数式接口2 有返回值函数接口3 语法精简 三 变量捕获1 匿名内部类2 Lambda的变量捕获 四 Lambda在集合当
  • 【CUDA】安装CUDA

    文章目录 1 搜索CUDA xff0c 进入官网2 选择以前的版本3 选择指定的版本4 选择操作系统并下载5 以管理员身份运行安装CUDA6 测试是否安装成功 1 搜索CUDA xff0c 进入官网 2 选择以前的版本 3 选择指定的版本
  • 计算机组成原理---系统总线

    文章目录 1 总线的基本概念2 总线的分类2 1 片内总线2 2 系统总线2 2 1 系统总线的定义2 2 2 按照系统总线传输信息的分类2 2 3 通信总线 3 总线的性能指标3 1 总线标准 4 总线结构4 1 单总线结构4 2 多总线
  • 计算机组成原理---总线带宽的计算

    end
  • QT之窗口背景颜色和图片设置

    设置窗口 窗体的背景图片 第一种 xff1a 定义一个函数 xff0c 使用QPalette和QPixmap 在 h文件定义一个私有的函数声明 xff1a void resizeEvent QpesizeEven event 然后右键跳到定
  • linux/mm/memory.c/put_page

    put page用来完成物理页面与一个线性地址页面的挂接 xff0c 从而将一个 线性地址空间内的页面落实到物理地址空间内 xff0c copy page tables函数 只是为一个进程提供了在线性地址空间的一个页表及1024页内存 xf