参考:《linux设备驱动开发详解》华清远见 ,--人民邮电出版社

用户空间内存动态申请

在用户空间动态申请内存的函数为 malloc(),这个函数在各种操作系统上的使用是一致的,malloc()申请的内存的释放函数为 free()。malloc()的内存一定要被 free(),否则会造成内存泄漏。理想情况下,malloc()和 free()应成对出现,即谁申请,就由谁释放。

void *malloc(unsigned int num_bytes);  /* 函数原型 */
void free(void *ptr);
char *func(void)
{char *p;p = malloc(...);if(p == NULL){...}free(p);
}

内核空间动态申请内存

问题:

  • 有哪些函数可以动态申请内存?
  • 这些动态申请内存函数之间有什么区别?

在 Linux 内核空间申请内存涉及的函数主要包括 kmalloc()、_ _get_free_pages()和vmalloc()等。kmalloc()和_ _get_free_pages()(及其类似函数)申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在较简单的转换关系。而 vmalloc()在虚拟内存空间给出一块连续的内存区,实质上,这片连续的虚拟内存在物理内存中不一定连续,而 vmalloc()申请的虚拟内存和物理内存之间也没有简单的换算关系。

1.kmalloc()

void *kmalloc(size_t size, gfp_t flags);

参数:

  1. 分配的块的大小
  2. 分配标志,用于控制kmalloc的行为,一般为GFP_KERNEL,代表优先权。

kmalloc()的底层依赖_ _get_free_pages()实现,分配标志的前缀 GFP 正好是这个底层函数的缩写。使用 GFP_ KERNEL 标志申请内存时,若暂时不能满足,则进程会睡眠等待页,即会引起阻塞,因此不能在中断上下文或持有自旋锁的时候使GFP_KERNE 申请内存。

gfp_mask标志:1.行为修饰符 2.区修饰符 3.类型 一一《linux内核设计与实现——第三版——中文版》P192

进行上下文,可以睡眠

GFP_KERNEL
进行上下文,不可以睡眠 GFP_ATOMIC
中断处理程序 GFP_ATOMIC
软中断 GFP_ATOMIC
tasklet GFP_ATOMIC
需要用于DMA的内存,可以睡眠 (GFP_DMA|GFP_KERNEL)
需要用于DMA的内存,不可以睡眠 (GFP_DMA|GFP_ATOMIC)

2.__get_free_pages ()

_ _get_free_pages()系列函数/宏是 kmalloc()实现的基础,_ _get_free_pages()系列函数/宏包括 get_zeroed_page()、__get_free_page()和_ _get_free_pages()。

get_zeroed_page(unsigned int flags); //该函数返回一个指向新页的指针并且将该页清零。
__get_free_page(unsigned int flags); //该宏返回一个指向新页的指针但是该页不清零,它实际上为:
#define __get_free_page(gfp_mask) \
__get_free_pages((gfp_mask),0)  //就是调用了下面的
__get_free_pages()   //申请 1 页。
__get_free_pages(unsigned int flags, unsigned int order);
/*该函数可分配多个页并返回分配内存的首地址,分配的页数为 2order,分配的页也不清零。order 允许的最大值是 10(即 1024 页)或者 11(即2048 页),依赖于具体的硬件平台。*/

使用_ _get_free_pages()系列函数/宏申请的内存应使用下列函数释放:

void free_page(unsigned long addr);
void free_pages(unsigned long addr, unsigned long order);

3.vmalloc()

vmalloc()一般用在为只存在于软件中(没有对应的硬件意义)的较大的顺序缓冲区分配内存,vmalloc()远大于__get_free_pages()的开销,为了完成 vmalloc(),新的页表需要被建立。因此,只是调用 vmalloc()来分配少量的内存(如 1 页)是不妥的。
vmalloc()申请的内存应使用 vfree()释放,vmalloc()和 vfree()的函数原型如下:

void *vmalloc(unsigned long size);
void vfree(void * addr);

linux内核空间内存动态申请相关推荐

  1. Linux 基础知识(2)---Linux内核空间内存申请函数kmalloc、kzalloc、vmalloc的区别

    Linux内核空间内存申请函数kmalloc.kzalloc.vmalloc的区别 kzalloc与kmalloc区别    这个函数就是原来的两个函数的整合 , 即原来我们每次申请内存的时候都会这么 ...

  2. Linux内核空间内存申请函数kmalloc、kzalloc、vmalloc的区别

    Table of Contents kmalloc() kzalloc() vmalloc() 总结 内核中的内存申请:kmalloc.vmalloc.kzalloc.kcalloc.get_free ...

  3. 【Linux 内核 内存管理】内存管理架构 ② ( 用户空间内存管理 | malloc | ptmalloc | 内核空间内存管理 | sys_brk | sys_mmap | sys_munmap)

    文章目录 一.用户空间内存管理 ( malloc / free / ptmalloc / jemalloc / tcmalloc ) 二.内核空间内存管理 1.内核内存管理系统调用 ( sys_brk ...

  4. linux内核dma内存分配,Linux 4.x 内核空间 DMA 虚拟内存地址

    Architecture: i386 32bit Machine Ubuntu 16.04 Linux version: 4.15.0-39-generic 目录 DMA 虚拟内存区 在 IA32 体 ...

  5. Linux内核学习--内存管理模块

    Linux内核学习--内存管理模块 首先,Linux内核主要由五个部分组成,他们分别是:进程调度模块.内存管理模块.文件系统模块.进程间通信模块和网络接口模块. 本部分所讲的内存是内存管理模块,其主要 ...

  6. linux内核之内存管理.doc,linux内核之内存管理.doc

    Linux内核之内存管理 作者:harvey wang 邮箱:harvey.perfect@ 新浪博客地址:/harveyperfect ,有关于减肥和学习英语相关的博文,欢迎交流 把linux内存管 ...

  7. Linux内核笔记--内存管理之用户态进程内存分配

    内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...

  8. 【Linux内核】内存映射原理

    [Linux内核]内存映射原理 物理地址空间 物理地址是处理器在总线上能看到的地址,使用RISC(Reduced Instruction Set Computing精简指令集)的处理器通常只实现一个物 ...

  9. Linux内核中内存分配函数

    1.原理说明 Linux内核 中采 用了一种同时适用于32位和64位系统的内 存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系 统中,用到了四级页表,如图2-1所示.四级页表分别为 ...

最新文章

  1. keras构建前馈神经网络(feedforward neural network)进行分类模型构建基于早停法(Early stopping)
  2. boost::hana::curry用法的测试程序
  3. 关于windows xp sp2/sp3 中tcpip.sys对于Raw socket的限制
  4. BLE - LINK LAYER SPECIFICATION
  5. 机器学习EPD:概率密度估计
  6. RHCS双机集群调测
  7. 在虚拟机中安装Linux系统
  8. Python全栈笔记(三)
  9. PHP常用正则表达式,如验证网址,邮箱等
  10. flutter图片识别_Flutter 图片解码与缓存管理研究
  11. 后缀是lnk是什么文件_lnk是什么格式_lnk后缀是什么格式
  12. 腾讯云对象存储空间分片、断点续传功能的封装与使用
  13. Nodejs+Koa2+云服务ECS 开发微信公众号(一)之环境配置
  14. 使用 Pubchempy 一行命令从 Pubchem 数据库中批量下载化合物 3D 构象的 sdf 文件
  15. 2018——颓废的一年,勿忘初心。
  16. mac 卸载自带的php,Mac_Mac系统如何卸载预装软件?Mac预装软件卸载教程,  如今任何产品在购买的时 - phpStudy...
  17. C语言杂志订阅管理系统
  18. 代码随想录训练营day30
  19. 为能源发展保驾护航,光伏电源电涌保护器SPD选型要求
  20. php正则匹配多个,15个超实用的php正则表达式

热门文章

  1. 面试题大全<持续更新>
  2. 用python获取图形对象的坐标集合
  3. [有感]_给天蓝管理层的诺干建议
  4. QQ音乐远程控制,旧iPhone连音响当播放器,另一个手机远程控制
  5. 双足机器人的稳定性判据_双足机器人行走稳定性探究.pdf
  6. C++ STL函数库 vector(henu.hjy)
  7. Paxos协议学习——译《The Part-Time Parliament》
  8. k8s中pod删除不了的原因和正确的删除方法
  9. 2020年8月20计算机大赛,NOI2020于8月17日正式开幕!今年哪些竞赛选手被保送清北计算机专业?...
  10. 使用ChatGPT帮我们写一篇论文,最后查重的重复率会是多少?