内存管理API之get_unmapped_area
unsigned long
get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,unsigned long pgoff, unsigned long flags)
在当前进程的用户空间中获得一个未映射的起始地址.
其在do_mmap中有使用这个函数。
其源码分析如下:
unsigned long
get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,unsigned long pgoff, unsigned long flags)
{unsigned long (*get_area)(struct file *, unsigned long,unsigned long, unsigned long, unsigned long);#针对特定平台的检查,目前arm64中arch_mmap_check 是一个空函数unsigned long error = arch_mmap_check(addr, len, flags);if (error)return error;#申请虚拟空间的地址不能超过最大值。这里可以知道虚拟空间size 的最大值就是TASK_SIZE/* Careful about overflows.. */if (len > TASK_SIZE)return -ENOMEM;#指向当前进程的unmap 空间的分配函数get_area = current->mm->get_unmapped_area;#file 不为空的话,则unmap 空间的分配函数执行file中指定的函数if (file) {if (file->f_op->get_unmapped_area)get_area = file->f_op->get_unmapped_area;} else if (flags & MAP_SHARED) {#如果file为空,说明可能申请的是匿名空间,这里检查如果是共享内存的话,则分配函数执行共享内存的分配函数/** mmap_region() will call shmem_zero_setup() to create a file,* so use shmem's get_unmapped_area in case it can be huge.* do_mmap_pgoff() will clear pgoff, so match alignment.*/pgoff = 0;get_area = shmem_get_unmapped_area;}#使用前面已经指定的分配函数来在未映射的虚拟空间中映射的空间中申请.addr = get_area(file, addr, len, pgoff, flags);if (IS_ERR_VALUE(addr))return addr;#addr +len 不能大于TASK_SIZEif (addr > TASK_SIZE - len)return -ENOMEM;#检查分配到的地址是否已经被映射,如果已经被映射则返回error,毕竟我们这里要分配的是进程未映射的空间。if (offset_in_page(addr))return -EINVAL;#secure检查error = security_mmap_addr(addr);return error ? error : addr;
}
内存管理API之get_unmapped_area相关推荐
- 内存管理API之page_address
void *page_address(const struct page *page) 这个函数用于得到页的虚拟地址,这里的页可以是高端页或者低端页 其源码分析如下: void *page_addre ...
- 深入理解PHP内存管理之谁动了我的内存
本文地址: http://www.laruence.com/2011/03/04/1894.html 转载请注明出处 首先让我们看一个问题: 如下代码的输出, var_dump(memory_get_ ...
- C和C++安全编码笔记:动态内存管理
4.1 C内存管理: C标准内存管理函数: (1).malloc(size_t size):分配size个字节,并返回一个指向分配的内存的指针.分配的内存未被初始化为一个已知值. (2).aligne ...
- 转载:Windows CE内存管理
内存管理 如果你在写Windows CE 程序中遇到的最重要的问题,那一定是内存问题.一个WinCE 系统可能只有4MB 的RAM,这相对于个人电脑来说是十分少的,因为个人电脑的标准配置已经到了128 ...
- 操作系统思考 第六章 内存管理
第六章 内存管理 作者:Allen B. Downey 原文:Chapter 6 Memory management 译者:飞龙 协议:CC BY-NC-SA 4.0 C提供了4种用于动态内存分配的函 ...
- Wireshark----wmem 内存池、内存管理的学习--README.wmem 翻译
1. 什么是内存池? 当创建大量消耗小内存的对象时,频繁调用new/malloc会导致大量的内存碎片,致使效率降低.内存池的概念就是预先在内存中申请一定数量的,大小相等 的内存块留作备用,当有新的内存 ...
- 阅读micropython源码-内存管理组件GC
阅读micropython源码-内存管理组件GC 苏勇,2021年8月 文章目录 阅读micropython源码-内存管理组件GC 初探micropython中的内存管理机制 分析指定的内存相关参数 ...
- Linux内存管理之slab 2:slab API
Linux内存管理之slab 2:slab API 0. 前沿/须知: 1. kmem_cache_create 1.1 kmem_cache_create (仅分配一个kmem_cache实例)未分 ...
- Linux内存管理基础
系统启动之Linux内存管理基础 Keywords 非一致内存访问(NUMA)模型.节点(node).内存管理区(Zone).一致内存访问(UMA)模型.内核页表.内存管理区分配器(伙伴系统Buddy ...
- 深入理解Linux内存管理(0.3)
学习方法论 写作原则 标题括号中的数字代表完成度与完善度 0.0-1.0 代表完成度,1.1-1.5 代表完善度 0.0 :还没开始写 0.1 :写了一个简介 0.3 :写了一小部分内容 0.5 :写 ...
最新文章
- Lambda方法推导(method references)
- android - 拍照
- 阿里技术协会(ATA)11月系列精选文集
- BZOJ3091: 城市旅行
- 图解交换机与路由器组网
- Mysql 解决emoji表情处理问题 - Incorrect string value: ‘\xF0\x9F\x92\x94‘ for column
- linux切换tab,linux-mint – ALT-TAB切换器中的图标从哪里加...
- U盘刻录操作系统的详细步骤
- JAVA学习笔记_StringUtil.isEmpty_null不是null
- 唐宇迪学习笔记17:支持向量机
- 数据结构——图的应用
- 微信公众号迁移流程和公众号迁移公证书办理步骤
- 2021-2027全球与中国IPA干燥机市场现状及未来发展趋势
- Oracle默认排序规则是什么?
- linux自制硬件防火墙,自制linux系统——打造属于自己的linux系统
- 案例:爬取豆瓣电影Top250中的电影信息
- TESTTESTTESTTESTTESTTEST
- vue+elementUi——实现竖向公告滚动效果(功能实现)
- varbinary 与 text 不兼容如何解决
- 【068】特征选择之 pearson 皮尔森系数 PimaIndiansdiabetes
热门文章
- 代码质量分析利器之SonarQube【史上最全】
- android webview 下载文件
- 2019春计算机基础在线作业,2019春计算机基础在线作业100分
- 51单片机之继电器实验
- coon.php连接,PHP 连接 MySQL
- 记录“麻辣香锅”病毒处理过程
- 【C语言】求最大公约数和最小公倍数
- 用计算机画经验频率曲线,第四节经验频率曲线经验频率曲线的绘制步骤收集水文资料,组成.ppt...
- Maya动画后期——粒子特效的制作
- 农夫山泉赴港上市,迷之操作暗藏“算计”