| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> linux内核源码分析之伙伴系统(四) -> 正文阅读 |
|
[系统运维]linux内核源码分析之伙伴系统(四) |
目录 内核映射
尽管
vmalloc
函数族可用于从高端内存域向内核映射页帧(这些在内核空间中通常是无法直接看
到的),但这并不是这些函数的实际用途。重要的是强调以下事实:内核提供了其他函数用于将
ZONE_HIGHMEM
页帧显式映射到内核空间,这些函数与
vmalloc
机制无关
1,持久内核映射
????????
????????如果需要将高端页帧长期映射(作为持久映射
)到内核地址空间中,必须使用
kmap
函数。需要映射的页用指向page
的指针指定,作为该函数的参数。
????????如果没有启用高端支持,该函数的任务就比较简单。在这种情况下,所有页都可以
直接访问
,因此只需要返回页的地址,无需显式创建一个映射。
????????如果确实存在
高端页
,情况会比较复杂。类似于vmalloc
,内核首先必须
建立高端页和所映射到的地址
之间的关联。还必须在虚拟地址空间中分配一个区域以映射页帧,最后,内核必须记录该虚拟区域的哪些部分在使用中,哪些仍然是空闲的。
数据结构:page_address_map?
????????
建立物理内存的page实例与其在虚拟内存区中位置之间的关联。
查找地址?
????????page_address首先检查传递进来的
page
实例在普通内存还是在高端内存。如果是前者,页地址可以根据page
在
mem_map
数组中的位置计算。对于后者,可通过上述散列表查找虚拟地址。
创建映射
为通过
page
指针建立映射,必须使用
kmap
函数。
①
它只是一个前端,用于确认指定的页是否确实
在高端内存域中。否则,结果返回
page_address
得到的地址。如果确实在高端内存中,则内核将工作委托给kmap_high
,该函数定义如下:
解除映射
????????用kmap
映射的页,如果不再需要,必须用
kunmap
解除映射
关键函数:
flush_all_zero_pkmaps
2,临时内存映射? ? ? ? kmap_atomic,其执行是原子的。该函数的一个主要优点是它比普通的kmap快速。但它不能用于可能进入睡眠的代码。因此,它对于很快就需要一个临时页的简短代码,是非常理想的。
3,没有高端内存使用通用版本的kmap返回页的地址,且不修改虚拟内存。不能用于中断处理程序,如果pkmap数组中没有空闲位置,该函数会进入睡眠状态,直至情形有所改善。
参考 《深入Linux内核架构》 剖析Linux内核物理内存管理-大学生教程-腾讯课堂 (qq.com) |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 15:20:26- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |