当前位置: 首页 > 编程日记 > 正文

Linux内核之内存管理(4)--缺页处理程序

本文主要解说缺页处理程序,凝视足够具体,不再解释。

//以下函数将一页内存页面映射到指定线性地址处,它返回页面的物理地址
//把一物理内存页面映射到线性地址空间指定处或者说把线性地址空间指定地址address处的页面映射到主内存区页面page上。主要工作是在相关也文件夹项和页表项中设置指定页面的信息。在处理缺页异常函数do_no_page中会调用这个函数。
參数:address--线性地址;page--是分配的主内存区中某一页面指针
static unsigned long put_page(unsigned long page,unsigned long address)
{unsigned long tmp,*page_table;//首先判定给定page的有效性。假设该页面位于LOW_MEM或者超出系统高端内存HIGH_MEMORY,则发出警告。再查看一下page是不是已经分配的页面。若没有发出警告,即判定其在内存页面映射字节图mem_map[]中相应字节是否已经置位。if(page<LOW_MEM || page>=HIGH_MEMORY)printk("Trying to put page at %p at %p",page,address);if(mem_map[(page-LOW_MEM)>>12]!=1)printk("mem_map disagrees with %p at %p\n",page,address);//依据參数指定的线性地址address计算其在页文件夹表中相应的文件夹项指针,并从中取得二级页表地址。假设该文件夹项有效(p=1),即指定的页表在内存中,则从中取得指定页表地址放到page_table变量中,否则申请一空暇页面给页表使用,并在相应文件夹项中设置相应标志,然后将该页表地址放到page_table变量中page_table=(unsigned long *)((address>>20) & 0xffc)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[(address>>12) &0x3ff]=page|7;return page;
}
//运行缺页处理,页异常中断处理过程中调用的函数。在page.s程序中被调用。函数參数error_code和address是进程在訪问页面时由CPU因缺页产生异常而自己主动生成。error_code指出出错类型,address是产生缺页的线性地址。
//该函数首先查看所缺页是否在交换设备中,若是则交换进来。否则尝试与已载入的同样文件进行页面共享,或者仅仅是由于进程动态申请内存页面仅仅需映射一页物理内存页就可以。若共享操作不成功,那么仅仅能从相应文件里读入所缺的数据页面到指定线性地址处
void do_no_page(unsigned long error_code,unsigned long address)
{int nr[4];unsigned long tmp;unsigned long page;int block,i;struct m_inode *inode;if(address<TASK_SIZE)printk("\n\rBAD! KERNEL PAGE MISSING\n\r");if(address-current->start_code>TASK_SIZE){printk("Bad things happen:nonexistent page error in no_page\n\r");do_exit(SIGSEGV);}//然后依据指定的线性地址address求出其相应的二级页表项指针,并依据该页表项内容推断address处的页面是否在交换设备中。若是则调入页面并退出。方法是首先取指定线性地址address相应的文件夹项内容。假设相应二级页表存在,则取出该文件夹项中二级页表的地址,加上页表项偏移即得线性地址address相应的页面指针,从而获得页表项的内容。若页表项内容不为0而且页表项存在为P=0,则说明该页表项指定的物理页面应该在交换设备中。于是从交换设备中调入指定页面后退出page=*(unsigned long *)((address>>20) & 0xffc);if(page & 1){page &=0xfffff000;page+=(address>>10) & 0xffctmp=*(unsigned long *)page;if(tmp && !(1 & tmp)){swap_in(unsigned long*)page);return;}}//否则取线性空间中指定地址address处页面地址,并计算出指定线性地址在进程空间中相对于进程基址的偏移长度值tmp,即相应的逻辑地址。从而能够算出缺页页面在运行文件映像或在库文件里的详细起始数据块号。由于设备上存放的可运行文件映像第1块数据是程序头结构,因此在读取该文件时须要跳过第一块数据。所以须要首先计算缺页所在的数据块号。由于每块数据长度为BLOCK_SIZE=1KB,因此一页内存可存放4个数据块。进程逻辑地址tmp除以数据块大小再加1就可以得处缺少页面在运行映像文件里起始块号block。address &=0xfffff000;tmp=address-current->start_code;if(tmp>=LIBRARY_OFFSET){inode=current->library;block=1+(tmp-LIBRARY_OFFSET);}else if(tmp<current->end_data){inode=current->executable;block=1+tmp/BLOCK_SIZE;}else{inode=NULL;block=0}//是动态申请的数据内存页面if(!node){get_empty_page(address);return;}//尝试共享tmp处的物理页面if(share_page(inode,tmp))return;if(!(page=get_free_page()))oom();for(i=0;i<4;block++,i++)nr[i]=bmap(inode,block);bread_page(page,inode->i_dev,nr);...if(put_page(page,address))return;free_page(page);oom();
}</span>

转载于:https://www.cnblogs.com/mengfanrong/p/3774140.html

相关文章:

WebSocket协议分析

点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 解析websocket数据格式。”好久不见&#xff0c;一晃一年又过去了&#xff0c;祝大家新年好运。今天&#xff0c;给大家分析一个常见的协议——WebSocket&#xff0c;这是一个标准协议&#xff0c;虽然没有HTTP历史悠久&#xff…

《postfix邮件服务下mailq、postmap、postqueue 、 postsuper等用法》

1、Mailq 功能说明&#xff1a;显示待寄邮件的清单。 语  法&#xff1a;mailq [-q] 补充说明&#xff1a;mailq可列出待寄邮件的清单&#xff0c;包括邮件ID&#xff0c;邮件大小&#xff0c;邮件保存时间&#xff0c;寄信人&#xff0c;收信人&#xff0c;以及邮件无法寄出…

[deviceone开发]-一个很炫的手势动画示例

一、简介 这是iOS下的效果&#xff0c;android下完全一致。通过do_GestureView组件和do_Animation组件&#xff0c;deviceone能很容易实现复杂的跨平台纯原生动画效果,这个示例就是通过手势控制图片上下动画滑动实现开合效果&#xff0c;还支持声音效果。 二、效果图 三、相关下…

iOS lldb调试

LLDB 初始 LLDB 是一个有着 REPL 的特性和 C ,Python 插件的开源调试器。LLDB 绑定在 Xcode 内部&#xff0c;存在于主窗口底部的控制台中。调试器允许你在程序运行的特定时暂停它&#xff0c;你可以查看变量的值&#xff0c;执行自定的指令&#xff0c;并且按照你所认为合适的…

万物之中,希望至美

一觉醒来&#xff0c;虎年就这么来了。感谢各位朋友过去的一年与我同在。在新的一年到来之际&#xff0c;我首先做个检讨&#xff0c;过去的一年&#xff0c;我们这个公众号&#xff0c;更新不够频繁&#xff0c;属于三天打鱼两天晒网型公众号&#xff0c;没有为大家带来足够丰…

[转]VS2015编译的程序在其他机器上缺少msvcp120.dll

http://www.lai18.com/content/1159618.html 1、 今天分享一个自己在开发过程中遇到的困难。用VS2015开发了一个windows客户端&#xff08;win32项目&#xff09;&#xff0c;在自己的机器上运行很流畅。当你得意的把releas版本进行打包&#xff0c;并进行发布后&#xff0c;问…

Discuz!的cookie机制

最近在做Discuz!的插件&#xff0c;需要用到cookie&#xff0c;一直觉得奇怪的一个问题&#xff0c;Discuz!大量使用了cookie&#xff0c;但是我在编写插件的时候如果不加入session_start函数cookie就无法使用&#xff0c;按理说Discuz!使用了这么多cookie它的核心应该有调用se…

iOS infoplist 权限设置

<dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> <key>NSBluetoothPeripheralUsageDescription</key> <string>需要使用您的蓝牙</string> <key>NSCalendarsUsageDes…

python使用socket实现协议TCP长连接框架

点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 使用python实现协议中常见的TCP长连接框架。”分析多了协议就会发现&#xff0c;很多的应用&#xff0c;特别是游戏类和IM类应用&#xff0c;它们的协议会使用长连接的方式&#xff0c;来保持客户端与服务器的联系&#xff0c;这…

哈夫曼编码与解码

这是我的第一篇博客&#xff0c;希望大神们批评指正。 首先介绍以下什么是哈夫曼树&#xff08;来自百度百科&#xff09; 哈夫曼树─即最优二叉树&#xff0c;带权路径长度最小的二叉树&#xff0c;经常应用于数据压缩。 在计算机信息处理中&#xff0c;“哈夫曼编码”是一种一…

012-python基础-数据运算

1、算数运算&#xff1a; 2、比较运算 3、赋值运算 4、逻辑运算 5、成员运算&#xff1a; 6、身份运算&#xff1a; 7、位运算&#xff1a; 8、运算符优先级&#xff1a; 转载于:https://www.cnblogs.com/chhphjcpy/p/6064572.html

优化XCode的编译速度

1.将Debug Information Format改为DWARF 在工程对应Target的Build Settings中&#xff0c;找到Debug Information Format这一项&#xff0c;将Debug时的DWARF with dSYM file改为DWARF。 这一项设置的是是否将调试信息加入到可执行文件中&#xff0c;改为DWARF后&#xff0c;如…

给windows装个Mac黑苹果虚拟机

点击上方↑↑↑蓝字[协议分析与还原]关注我们“ windows下安装使用苹果Mac虚拟机。”平常的生活工作中&#xff0c;我大部分时候使用Windows&#xff0c;偶尔用用Mac。实在是用不惯Mac&#xff0c;但有的时候&#xff0c;有些工作还是需要在Mac上搞&#xff0c;不得不用&#x…

Ajax基础讲解 1

随着web的不断发展&#xff0c;Ajax的运用越来越普及&#xff0c;但是对很多同学来说Ajax稍微有些难懂&#xff0c;今天呢就简单给大家讲解一下Ajax的一些基础入门的知识&#xff0c;希望可以帮到刚学习Ajax的同学。 第一步&#xff1a;首先就是服务器的搭建&#xff0c;关于服…

在虚拟机linux环境下编译windows版adb fastboot

原文出自&#xff1a;http://blog.chinaunix.net/uid-20546441-id-1746200.html我根据虚拟机编译遇到的问题进行一些添加【前提条件】Linux Android源码完整虚拟机磁盘空间100G左右&#xff08;60G用来存放代码和编译后的文件&#xff09;swap 30G左右&#xff0c;若太小会导致…

PC端微信小程序wxapkg解密

sh点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 解密PC端wxapkg文件。”用过微信pc版的应该都知道&#xff0c;PC上也可以使用微信小程序。这个小程序用起来和手机端差不多&#xff0c;不过&#xff0c;在分析时&#xff0c;确是有差别的——PC上的wxapkg文件是加密的。无论如…

cron 定时器简单入门

cron:计划任务&#xff0c;是任务在约定的时间执行已经计划好的工作&#xff0c;根据配置文件约定的时间来执行特定的任务。 编写测试类继承 IJob &#xff0c;实现Execute 此方法就是用于定时的任务 配置定时时间&#xff1a; 先创建windows服务&#xff0c;服务创建详情 Inst…

PHP5.5.13 + Apache2.4.7安装配置流程详解

---恢复内容开始--- 自学PHP的这段时间里&#xff0c;真是倍感辛酸&#xff0c;相信广大的菜鸟们应该很我感同身受吧&#xff0c;在查阅了网上和众多数资料后&#xff0c;总结出来想当比较全面的安装方法&#xff0c;拿出来与广大的编程爱好者一起分享哈。 首先到官网上下载相关…

cocos2dx小游戏数据签名算法破解

点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 快速破解小游戏常见的数据签名算法。”最近在分析各种小游戏的协议&#xff0c;本文以《我不是无双》这款小游戏为样例介绍这类小游戏的分析方法。01—抓包在分析开始&#xff0c;首先明确分析的目的是学习这款游戏的网络协议算法…

laravel5 MAC is invalid

如果本机的环境更换过,项目中用来加密Crypt组件中的参数会变更. 如果出现这个问题,得更换数据库中加密后的变量 stackoverflow上找到的解决方法都是 composer dump-autoload composer clear-cache 之后再清空浏览器缓存 其实最简单的解决方法是将数据库中的所有数据重新encrpt一…

不大于N的所有素数

算法如下&#xff1a; #include<stdio.h> #include<math.h> void Sieve(int n) {int p,j,i;int A[n1],L[n1];for(p2;p<n;p)A[p]p;for(p2;p<sqrt(n);p){if(A[p]!0){jp*p;while(j<n){A[j]0;jjp;}}}i0;for(p2;p<n;p){if(A[p]!0){L[i]A[p];i;}}for(p0;p<…

3集合与函数类型

import UIKit var str “Hello, playground” // 1 数组 // 创建一个空的数组 var arr1 Int; arr1.append(6); // 创建一个特定大小 并且所有数据都被默认的构造方法 // 以下数组有6个5 var arr2 Array(repeating: 5, count: 6); // 通过两个数组相加创建一个数组 var a…

非凡推崇_2015年值得推崇的25位编码者

非凡推崇by freeCodeCamp通过freeCodeCamp 2015年值得推崇的25位编码者 (25 Coders Worth Following on Twitter in 2015) Our community upvoted the following 25 coders, in no particular order, as “Coders Worth Following in 2015”:我们的社区对以下25位编码员进行了…

CSS中各种各样居中方法的总结

在开发前端页面的时候&#xff0c;元素的居中是一个永远都绕不开的问题。看似简单的居中二字&#xff0c;其实蕴含着许许多多的情况&#xff0c;对应着很多的处理方法&#xff0c;本文就试图对页面布局中的居中问题进行总结~~ 居中问题分为水平居中和竖直居中两种&#xff1b;而…

iOS 流式播放音频文件

方式一&#xff1a; https://github.com/tumtumtum/StreamingKit 方式二&#xff1a; https://github.com/AlexanderYeah/SK_PlayOnWavFileDemo

java 创建 HMAC 签名

ava 创建 HMAC 签名 psd素材 1. []ComputopTest.java package com.javaonly.hmac.test; import java.io.IOException; import java.security.InvalidKeyException; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import …

2014年数字:我的人生在命令行中

by freeCodeCamp通过freeCodeCamp 2014年数字&#xff1a;我的人生在命令行中 (2014 in Numbers: My Life Behind the Command Line) For 2014, I decided to simplify my life. Rather than pursuing a variety of human experiences, as I had previously, I wanted to focu…

c# unity PlayerPrefs 游戏存档,直白点就是讲游戏数据本地保存下来

在游戏会话中储存和访问游戏存档。这个是持久化数据储存&#xff0c;比如保存游戏记录。 我的理解是通过某个特殊的标签来保存在本地&#xff0c;而且该标签为key的意思&#xff0c;初始值不用赋值。 在游戏开发中较为实用。 暂时用到了 SetInt(string key, int value); 还有Ge…

4-类和结构体和可选类型

import UIKit var str “Hello, playground” // 1 枚举语法 // 与 C 和 Objective-C 不同&#xff0c;Swift 的枚举成员在被创建时不会被赋予一个默认的整型值 // 书写方式一 enum sizeType{ case small case middle case large } // 书写方式二 enum sizeNumber { case x,…

android处理url中的特殊字符

java处理url中的特殊字符&#xff08;如&,%...&#xff09; URL(Uniform Resoure Locator&#xff0c;统一资源定位器)是Internet中对资源进行统一定位和管理的标志。 一个完整的URL包括如下内容&#xff1a; 应用协议名称&#xff0c;包括http,ftp,file等标志 资源定位…