linux中什么是pfn

发布时间 - 2022-03-24 00:00:00    点击率:
在linux中,pfn全称“page frame number”,是物理内存区域编号。“page frame”是针对物理内存而言的,把物理内存分成一个个的page size的区域,并且给每一个page编号,而这个编号就是PFN。

本教程操作环境:linux5.9.8系统、Dell G3电脑。

1、什么是page frame?

操作系统最重要的作用之一就是管理计算机系统中的各种资源,做为最重要的资源:内存,我们必须管理起来。在linux操作系统中,物理内存是按照page size来管理的,具体page size是多少是和硬件以及linux系统配置相关的,4k是最经典的设定。因此,对于物理内存,我们将其分成一个个按page size排列的page,每一个物理内存中的page size的内存区域我们称之page frame。我们针对每一个物理的page frame建立一个struct page的数据结构来跟踪每一个物理页面的使用情况:是用于内核的正文段?还是用于进程的页表?是用于各种file cache还是处于free状态……

每一个page frame有一个一一对应的page数据结构,系统中定义了page_to_pfn和pfn_to_page的宏用来在page frame number和page数据结构之间进行转换,具体如何转换是和memory modle相关,我们会在第三章详细描述linux kernel中的3种内存模型。

2、什么是PFN?

对于一个计算机系统,其整个物理地址空间应该是从0开始,到实际系统能支持的最大物理空间为止的一段地址空间。在ARM系统中,假设物理地址是32个bit,那么其物理地址空间就是4G,在ARM64系统中,如果支持的物理地址bit数目是48个,那么其物理地址空间就是256T。当然,实际上这么大的物理地址空间并不是都用于内存,有些也属于I/O空间(当然,有些cpu arch有自己独立的io address space)。因此,内存所占据的物理地址空间应该是一个有限的区间,不可能覆盖整个物理地址空间。不过,现在由于内存越来越大,对于32位系统,4G的物理地址空间已经无法满足内存的需求,因此会有high memory这个概念,后续会详细描述。

PFN是page frame number的缩写,所谓page frame,就是针对物理内存而言的,把物理内存分成一个个的page size的区域,并且给每一个page 编号,这个编号就是PFN。假设物理内存从0地址开始,那么PFN等于0的那个页帧就是0地址(物理地址)开始的那个page。假设物理内存从x地址开始,那么第一个页帧号码就是(x>>PAGE_SHIFT)。

PFN的取值范围是 0----(memory size >> 12)。

但是由于物理内存映射的关系,物理内存的0地址对应到到系统上并不是物理地址的0。 例如:s3c2440上,内存的地址是从0x30000000开始的。当连接ram后,ram的0地址在s3c2440看来,就是0x30000000.  所以在系统中 pfn的值 应该等于 (physical address - memory base address) >> 12 。

但是linux中,用的又都是虚拟地址,所以要先将 virtual address转换成 physical address 才行。 所以在linux中有个宏定义 将内核线性空间的虚拟地址和pfn转换:

#define virt_to_pfn(kaddr)	(__pa(kaddr) >> PAGE_SHIFT)   //__pa() 将虚拟地址转化成物理地址  
#define pfn_to_virt(pfn)	__va((pfn) << PAGE_SHIFT)

所以pfn在linux内核中应该对应的是页帧号。可以通过简单的转换找到对应的物理地址。

每个物理上的页,内核给与之分配了一个描述符来描述: page。 pfn可以和page进行转换:

#define page_to_pfn __page_to_pfn
#define pfn_to_page __pfn_to_page

所有的page结构存放在mem_map中,方便进行管理。

由于linux是将物理内存分成4K大小的页来进行管理的。所以在软件上也会设置MMU进行匹配对应。后面叙述。

linux将4G的虚拟空间分成了用户空间和内核空间。用户空间是0---3G,内核空间是3G---4G。 从内核空间可以访问到用户空间,但是从用户空间必须通过系统调用来能访问内核空间。

相关推荐:《Linux视频教程》


# linux  # 数据结构  # Struct  # number  # 是从  # 最重要  # 的是  # 是一个  # 操作系统  # 会有  # 成了  # 放在  # 不可能 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  如何用西部建站助手快速创建专业网站?  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  在线制作视频网站免费,都有哪些好的动漫网站?  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  如何快速搭建高效WAP手机网站?  香港服务器租用每月最低只需15元?  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  网站建设要注意的标准 促进网站用户好感度!  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  b2c电商网站制作流程,b2c水平综合的电商平台?  Swift中循环语句中的转移语句 break 和 continue  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  Python3.6正式版新特性预览  如何用好域名打造高点击率的自主建站?  JavaScript中的标签模板是什么_它如何扩展字符串功能  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  C++用Dijkstra(迪杰斯特拉)算法求最短路径  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  Laravel如何配置Horizon来管理队列?(安装和使用)  简历没回改:利用AI润色让你的文字更专业  微信小程序 HTTPS报错整理常见问题及解决方案  如何在IIS中新建站点并配置端口与IP地址?  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  Laravel如何实现文件上传和存储?(本地与S3配置)  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  如何将凡科建站内容保存为本地文件?  再谈Python中的字符串与字符编码(推荐)  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  北京企业网站设计制作公司,北京铁路集团官方网站?  北京网站制作公司哪家好一点,北京租房网站有哪些?  原生JS获取元素集合的子元素宽度实例  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  轻松掌握MySQL函数中的last_insert_id()  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  如何用低价快速搭建高质量网站?  如何解决hover在ie6中的兼容性问题  清除minerd进程的简单方法  潮流网站制作头像软件下载,适合母子的网名有哪些?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  Python文件流缓冲机制_IO性能解析【教程】  七夕网站制作视频,七夕大促活动怎么报名?  微信小程序 input输入框控件详解及实例(多种示例)  个人摄影网站制作流程,摄影爱好者都去什么网站?  如何在云主机上快速搭建网站?  jquery插件bootstrapValidator表单验证详解