malloc实现

浅析malloc()的几种实现方式 导读:   malloc()是C语言中动态存储管理的一组标准库函数之一。其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。   动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不像数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时 阅读详情

malloc实现

几个问题

malloc()函数是C语言中内存分配函数,

  • malloc()函数返回的内存是否马上就分配物理内存?
  • 如果不考虑libc,malloc分配100Byte,那么实际上内核是为其分配100Byte吗?
  • vm_normal_page()函数返回的什么样的页面的struct page数据结构?为什么内存管理代码中需要这个函数?
  • get_user_page()函数的作用和实现流程。
  • follow_page()函数的作用和实现流程。
malloc()

malloc()函数是C函数库封装的一个核心函数,C函数库会做一些处理后调用Linux内核系统去调用brk系统调用。它们之间的关系可以这样理解:把malloc()想象成零售,brk就是它的代理商。malloc函数的实现为用户进程维护一个本地小仓库,当进程需要使用更多的内存时就要向这个小仓库要货,小仓库存货不足时就通过代理商brk向内核批发。

brk实现

brk系统调用只有一个参数,即新的堆顶地址。实现在<mm/mmap.c>中。

看代码真是一个有趣但又痛苦的过程。由于代码量太大,所以这里只写一下流程,具体代码自行阅读吧。

brk()函数实现流程:

  1. 如果新边界等于老边界,则转入5

  2. 如果新边界小于老边界,则调用do_munmap()释放多余的空间

  3. 如果新边界大于老边界,则首先调用find_vma_intersection()函数检测将要扩展的区域是否被占用

  4. 调用do_brk进行真正的操作

    i. 检测将要新增的VMA区域是否可用
    ii. 调用find_vma_links()循环遍历用户进程红黑树中的VMAs,根据addr找到最合适的插入位置
    iii. 检测是否可以与相邻区域合并合并,若可以合并,则直接进行合并操作
    iiii. 若无法合并,则创建新的VMA,初始化并加入到链表和红黑树中
    iiiii. 更新mm_struct中的统计字段

  5. 如果设置了VM_LOCKED标志,则表示需要马上分配物理页面,调用mm_populate()函数

    i. 直接调用__mm_populate()
    ii. 遍历范围内所有的VMAs,找到VMA调用populate_vma_page_range()函数做进一步处理
    iii. 调整设定gup_flags,调用__get_user_pages()函数
    a. 找到VMA,然后调用follow_page_mask()查看VMA中的虚拟页面是否已经分配了物理页面
    b. 若没有分配物理页面,则调用faultin_page()函数,进而调用到handle_mm_fault()来人为的触发一个缺页中断
    c. 循环遍历参数范围内的所有page

  6. 一切顺利,返回传入的brk参数

在学习c语言过程中,malloc函数是很经典的函数,使用起来也很简单便捷,可是内核的实现可真心不简单啊。

brk中涉及内存管理中的几个重要函数
1.get_user_pages()
2.follow_page()
3.vm_normal_page()
malloc的底层实现(ptmalloc) 前言   本文主要介绍了ptmalloc对于内存分配的管理。结合网上的一些文章和个人的理解,对ptmalloc的实现原理做一些总结。 内存布局   介绍ptmalloc之前,我们先了解一下内存布局,以x86的32位系统为例:      从上图可以看到,栈至顶向下扩展,堆至底向上扩展, mmap 映射区域至顶向下扩展。 mmap 映射区域和堆相对扩展,直至耗尽虚拟地址空间中的剩余区域,... 阅读详情

相关推荐

malloc函数的c语言实现

我写的malloc函数 用c语言实现 增加了合并内存释放内存的功能

malloc简单实现

1、三个函数加一个结构体采用链表的思想实现内存动态申请和释放: 1)、内存初始化函数:heap_init() 2)、内存申请函数:mmalloc() 3)、内存释放函数:mfree() 4)、结构体: typedef struct blockhead_t { Int32 signature; //固定为这个宏 BLOCKHEAD_SIGNATURE Bool al

痞啖子蔡-博客 1006

Ubuntu下Vim创建属于自己的头部注释和代码模板

痛点 每次打开vim想写个C或者C++的程序都要把固定的模板敲一遍,是不是感觉非常的繁琐,能不能把Vim弄得像IDE那样新建一个文件直接生成对应的头部注释和代码模板,减少这些重复工作呢?下面我尽量详细的介绍实现的方法: 先看看新建文件后的效果 C语言格式效果 C++语言效果 方法: 使用命令 vi /etc/vim/vimrc 打开vimrc这个文件,然后复制以下代码至文件末尾的空白处即可! 修改vimrc文件里面的内容必须要用root管理员身份才能进行修改,修改时先切换至root身份即可。 "新建.

weixin_42137584的博客 1561

Linux内存管理:用户空间页面固定与高效查找机制

本文深入解析了Linux内核中get_user_pages机制如何安全高效地访问用户空间内存。该机制通过四级页表查找、特殊页面处理(如门页面和大页面)以及智能优化策略(惰性检测和权限自适应),解决了用户空间页面可能被换出的核心挑战。文章详细剖析了权限检查、VMA查找、页表遍历等关键流程,展示了Linux在内核与用户空间交互中的精巧设计,为驱动程序开发、文件系统操作等场景提供了可靠的内存访问保障。

weixin_51019352的博客 642

从零到一:Bioconductor新手入门与R包安装实战

本文详细介绍了Bioconductor在生物信息学中的重要性及其R包安装实战指南。从环境准备到BiocManager的使用,再到常见问题排查,帮助新手快速掌握这一强大工具。特别推荐org.Hs.eg.db等核心工具包,助力基因注释和功能分析,提升研究效率。

weixin_29061041的博客 418

Easy系列PLC远程IO模块的安装配置和地址访问(EtherCAT总线)

EtherCAT分布式时钟DC(SOEM源码解析)EtherCAT分布式时钟DC(SOEM源码解析)_soem dc同步-优快云博客文章浏览阅读1.2k次。分布式时钟(DC,Dsitributed Clock)可以使所有 EtherCAT设备使用相同的系统时间,从而控制各设备任务的同步执行。_soem dc同步1200PLC连接分布式IO组态编程应用(ES200SP固件版本不同解决方法)

RXXW_Dor的博客 175

malloc 底层实现及原理

原文:malloc 底层实现及原理 - 爱笑的张飞 - 博客园 文章目录结论具体内容内存分配的原理具体分配过程情况一:malloc 小于 128K 的内存,使用 brk 分配情况二:malloc 大于 128K 的内存,使用 mmap 分配(munmap 释放) 摘要:偶尔看到面试题会问到 malloc 的底层原理,今天就来记录一下,毕竟学习要“知其所以然”,这样才会胸有成竹。 注:下面分析均是基于 linux 环境下的 malloc 实现。步骤是:先总结结论,再逐步展开 结论 1)当开辟的空间小于 12

zj 2031

MATLAB点云处理总目录

点云处理研究学习

weixin_44329757的博客 2556

malloc 的实现原理

malloc原理详解

papaya的博客 1663

基于BQ25895RTWR的锂电池充电管理硬件设计

BQ25895 是一款适用于单节锂离子电池和锂聚合物电池的高度集成型 5A 开关模式电池充电管理和系统电源路径管理器件。此类器件支持高输入电压快速充电。低阻抗电源路径对开关模式运行效率进行了优化、缩短了电池充电时间并延长了放电阶段的电池使用寿命。• 移动电源、移动 Wi-Fi 热点。• 便携式互联网器件。

corlin6688的博客 1087

YOLOv5源码逐行超详细注释与解读(1)——项目目录结构解析

全网最全YOLOv5项目目录结构超详细分析。逐个文件注释,小白上手必备

路人贾的博客 9万+

malloc的原理

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33769207的博客 331

NX二次开发 计算多个体的最小包围盒

多个体的最小包围盒

weixin_72680115的博客 430

libc中malloc怎么实现的

libc中malloc怎么实现的 参考:内存分配原理以及malloc的实现

chuxuezhe1111的博客 896

深度学习实战87-高中数学自适应测试系统研究与应用研发,前后台页面设计

大家好,我是微学AI ,今天给大家介绍一下深度学习实战87-高中数学自适应测试系统研究与应用研发,前后台页面设计。高中数学自适应测试系统旨在通过精准评估学生能力,用最少的题目发现其薄弱环节,并提供定制化的学习计划,帮助学生快速提升成绩。同时,系统结合了AI大模型实现自动判卷、生成报告,减轻教师负担,并支持个性化作业布置,使教学更加高效。学生可以清晰了解自身学习状态,教师也能获得精准的学生画像,实现差异化教学。

微学AI的博客 444

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

malloc底层实现

转载malloc 底层实现及原理 - 爱笑的张飞 - 博客园

Lce的专栏 284

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

实现自己的malloc

按照上篇文章的思路,自己实现的一个简单malloc: #include &lt;unistd.h&gt; #include &lt;stdio.h&gt; struct header_t { size_t size; //8B unsigned is_free; //4B struct header_t* next; ...

专注于网络编程,游戏后台,高并发 1341

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

如何实现一个malloc

任何一个用过或学过C的人对malloc都不会陌生。大家都知道malloc可以分配一段连续的内存空间,并且在不再使用时可以通过free释放掉。但是,许多程序员对malloc背后的事情并不熟悉,许多人甚至把malloc当做操作系统所提供的系统调用或C的关键字。实际上,malloc只是C的标准库中提供的一个普通函数,而且实现malloc的基本思想并不复杂,任何一个对C和操作系统有些许了解的程序员都可以很

Daemon的专栏 1062

malloc函数实现原理

任何一个用过或学过C的人对malloc都不会陌生。大家都知道malloc可以分配一段连续的内存空间,并且在不再使用时可以通过free释放掉。但是,许多程序员对malloc背后的事情并不熟悉,许多人甚至把malloc当做操作系统所提供的系统调用或C的关键字。实际上,malloc只是C的标准库中提供的一个普通函数,而且实现malloc的基本思想并不复杂,任何一个对C和操作系统有些许了解的程序员都可以很

qq_36595791的博客 1317

win32平台下malloc的内部实现

win32平台下malloc的内部实现 by flyingkisser 2007.09.10 如果您不想看那一堆确实比较XX的汇编代码,我直接给您一个结论吧: 1.malloc是如何实现的? malloc(Size)最终调用的是HeapAlloc(msvcrt!_crtheap,0,dwSize) 2.msvcrt.dll使用到的堆是如何初始化的? msvcrt的dll入口函数初始化时,调用Hea

fisher_jiang的专栏 5698

malloc的实现

malloc族函数实现

小红九さんの技術ブログ 2175

malloc 的原理?malloc 的底层实现?

malloc的底层实现是一个复杂的内存管理过程,它通过不同的算法和系统调用高效地管理动态内存分配和释放。在现代系统中,malloc实现已进行了大量优化,以提高性能和减少内存碎片化。malloc是 C 语言中的一个动态内存分配函数,用于从堆中分配指定大小的内存块。它的底层实现涉及操作系统的内存管理机制和用户态的内存管理库(如glibc的malloc实现)。下面是malloc。

weixin_47151388的博客 2329

malloc实现源码

/*** *malloc.c - Get a block of memory from the heap * * Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: * Defines the malloc() function. * **************************

BetaBin 1998
上一篇: VMA使用
下一篇: J-LINK 操作使用指南
识荒者
博客等级 码龄10年 533粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值