函数malloc的实现源代码~

Linux内核虚拟地址空间分配连续的内存函数--kvmalloc 其中,`size`是要分配的内存大小,`flags`是内存分配标志。例如,`GFP_KERNEL`表示在内核内存区域分配内存,`GFP_ATOMIC`表示在原子上下文中分配内存。在这个示例中,我们使用`kvmalloc`在内核虚拟地址空间中分配了一个大小为4096字节的连续内存缓冲区。`kvmalloc`是Linux内核中的一个函数,用于在内核虚拟地址空间中分配连续的内存。与`vmalloc`不同,`kvmalloc`分配的内存是连续的,因此可以用作DMA缓冲区或其他需要连续内存的场景。 阅读详情

 引用:http://topic.youkuaiyun.com/t/20051114/18/4392766.html

 

/****************************************************************  
  Copyright   1990,   1994,   2000   by   AT&T,   Lucent   Technologies   and   Bellcore.  
   
  Permission   to   use,   copy,   modify,   and   distribute   this   software  
  and   its   documentation   for   any   purpose   and   without   fee   is   hereby  
  granted,   provided   that   the   above   copyright   notice   appear   in   all  
  copies   and   that   both   that   the   copyright   notice   and   this  
  permission   notice   and   warranty   disclaimer   appear   in   supporting  
  documentation,   and   that   the   names   of   AT&T,   Bell   Laboratories,  
  Lucent   or   Bellcore   or   any   of   their   entities   not   be   used   in  
  advertising   or   publicity   pertaining   to   distribution   of   the  
  software   without   specific,   written   prior   permission.  
   
  AT&T,   Lucent   and   Bellcore   disclaim   all   warranties   with   regard   to  
  this   software,   including   all   implied   warranties   of  
  merchantability   and   fitness.     In   no   event   shall   AT&T,   Lucent   or  
  Bellcore   be   liable   for   any   special,   indirect   or   consequential  
  damages   or   any   damages   whatsoever   resulting   from   loss   of   use,  
  data   or   profits,   whether   in   an   action   of   contract,   negligence   or  
  other   tortious   action,   arising   out   of   or   in   connection   with   the  
  use   or   performance   of   this   software.  
  ****************************************************************/  
   
  #ifndef   CRAY  
  #define   STACKMIN   512  
  #define   MINBLK   (2*sizeof(struct   mem)   +   16)  
  #define   F   _malloc_free_  
  #define   SBGULP   8192  
  #include   "string.h" /*   for   memcpy   */  
   
  #ifdef   KR_headers  
  #define   Char   char  
  #define   Unsigned   unsigned  
  #define   Int   /*int*/  
  #else  
  #define   Char   void  
  #define   Unsigned   size_t  
  #define   Int   int  
  #endif  
   
  typedef   struct   mem   {  
  struct   mem   *next;  
  Unsigned   len;  
  }   mem;  
   
  mem   *F;  
   
    Char   *  
  #ifdef   KR_headers  
  malloc(size)  
  register   Unsigned   size;  
  #else  
  malloc(register   Unsigned   size)  
  #endif  
  {  
  register   mem   *p,   *q,   *r,   *s;  
  unsigned   register   k,   m;  
  extern   Char   *sbrk(Int);  
  char   *top,   *top1;  
   
  size   =   (size+7)   &   ~7;  
  r   =   (mem   *)   &F;  
  for   (p   =   F,   q   =   0;   p;   r   =   p,   p   =   p->next)   {  
  if   ((k   =   p->len)   >=   size   &&   (!q   ||   m   >   k))   {  
  m   =   k;  
  q   =   p;  
  s   =   r;  
  }  
  }  
  if   (q)   {  
  if   (q->len   -   size   >=   MINBLK)   {   /*   split   block   */  
  p   =   (mem   *)   (((char   *)   (q+1))   +   size);  
  p->next   =   q->next;  
  p->len   =   q->len   -   size   -   sizeof(mem);  
  s->next   =   p;  
  q->len   =   size;  
  }  
  else  
  s->next   =   q->next;  
  }  
  else   {  
  top   =   (Char   *)(((long)sbrk(0)   +   7)   &   ~7);  
  if   (F   &&   (char   *)(F+1)   +   F->len   ==   top)   {  
  q   =   F;  
  F   =   F->next;  
  }  
  else  
  q   =   (mem   *)   top;  
  top1   =   (char   *)(q+1)   +   size;  
  if   (sbrk((int)(top1-top+SBGULP))   ==   (Char   *)   -1)  
  return   0;  
  r   =   (mem   *)top1;  
  r->len   =   SBGULP   -   sizeof(mem);  
  r->next   =   F;  
  F   =   r;  
  q->len   =   size;  
  }  
  return   (Char   *)   (q+1);  
  }  
   
    void  
  #ifdef   KR_headers  
  free(f)  
  Char   *f;  
  #else  
  free(Char   *f)  
  #endif  
  {  
  mem   *p,   *q,   *r;  
  char   *pn,   *qn;  
   
  if   (!f)   return;  
  q   =   (mem   *)   ((char   *)f   -   sizeof(mem));  
  qn   =   (char   *)f   +   q->len;  
  for   (p   =   F,   r   =   (mem   *)   &F;   ;   r   =   p,   p   =   p->next)   {  
  if   (qn   ==   (Char   *)   p)   {  
  q->len   +=   p->len   +   sizeof(mem);  
  p   =   p->next;  
  }  
  pn   =   p   ?   ((char   *)   (p+1))   +   p->len   :   0;  
  if   (pn   ==   (Char   *)   q)   {  
  p->len   +=   sizeof(mem)   +   q->len;  
  q->len   =   0;  
  q->next   =   p;  
  r->next   =   p;  
  break;  
  }  
  if   (pn   <   (char   *)   q)   {  
  r->next   =   q;  
  q->next   =   p;  
  break;  
  }  
  }  
  }  
   
    Char   *  
  #ifdef   KR_headers  
  realloc(f,   size)  
  Char   *f;  
  Unsigned   size;  
  #else  
  realloc(Char   *f,   Unsigned   size)  
  #endif  
  {  
  mem   *p;  
  Char   *q,   *f1;  
  Unsigned   s1;  
   
  if   (!f)   return   malloc(size);  
  p   =   (mem   *)   ((char   *)f   -   sizeof(mem));  
  s1   =   p->len;  
  free(f);  
  if   (s1   >   size)  
  s1   =   size   +   7   &   ~7;  
  if   (!p->len)   {  
  f1   =   (Char   *)(p->next   +   1);  
  memcpy(f1,   f,   s1);  
  f   =   f1;  
  }  
  q   =   malloc(size);  
  if   (q   &&   q   !=   f)  
  memcpy(q,   f,   s1);  
  return   q;  
  }  
   
  /*   The   following   (calloc)   should   really   be   in   a   separate   file,   */  
  /*   but   defining   it   here   sometimes   avoids   confusion   on   systems   */  
  /*   that   do   not   provide   calloc   in   its   own   file.   */  
   
    Char   *  
  #ifdef   KR_headers  
  calloc(n,   m)   Unsigned   m,   n;  
  #else  
  calloc(Unsigned   n,   Unsigned   m)  
  #endif  
  {  
  Char   *rv;  
  rv   =   malloc(n   *=   m);  
  if   (n   &&   rv)  
  memset(rv,   0,   n);  
  return   rv;  
  }  
  #endif   
    
  去找个LXR或者FXR就可以找到,LXR是Linux的,FXR是FreeBSD的,我看了一下FreeBSD的/usr/src/lib/libc/stdlib/malloc.c,里面有1k多行,我就不贴了,给你一个地址自己去看好了(这个是给kernel用的,凑乎着看吧,user   space的source在cvs.freebsd.org有)  
  http://fxr.watson.org/fxr/source//kern/kern_malloc.c

Glibc:浅谈 malloc() 函数具体实现 简介 源代码 __libc_malloc() _int_malloc() __libc_malloc() 分析 参数 __malloc_hook 全局钩子 ptmalloc_init 转入 _int_malloc() _int_malloc 分析 计算 chunk size 是否命中 fastbins 是否命中 smallbins 非 smallbins 则转入 malloc_co... 阅读详情

相关推荐

Glibc:浅谈 malloc_consolidate() 函数具体实现

简介 源代码 分析 0x00 - 堆未初始化则初始化 0x01 - 堆已初始化则清空 fastbin 总结 简介 malloc_consolidate() 函数是定义在 malloc.c 中的一个函数,用于将 fastbin 中的空闲 chunk 合并整理到 unsorted_bin 中以及进行初始化堆的工作,在 malloc() 以及 free() 中均有可能调用 m...

加号减减号的博客 1万+

宋宝华: kvmalloc ——倚天剑屠龙刀两大神器合体?

你应该曾经纠结过是用kmalloc(),还是vmalloc()?现在你不用那么纠结了,因为内核里面现在有个API叫kvmalloc(),可以认为是kmalloc()和vmalloc()的...

宋宝华 2481

在C++中实现aligned_malloc

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

君子务本 2779

alloc_page/kvmalloc/vmalloc ...区别

kmalloc() 函数原型:void *kmalloc(size_t size, gfp_t flags);void kfree(const void *objp); 简介:kmalloc() 申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因为存在较简单的转换关系,所以对申请的内存大小有限制,不能超过128KB。 flags flag功能解释 GFP_KERNEL 正常分配内存; GFP_ATOMIC 分配内存的过程是一个原子.

what, when, why, how... 1698

malloc函数与free函数

链表这种数据结构在C语言中必不可少,它可以实现线性表的动态存储,而链表又要靠malloc函数来实现。 malloc函数: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。 malloc函数的作用是让系统寻找空闲地址后为你分配一块指定大小的空间来给你使用,这一块空间其实要比你申请的空

burning_cloud的博客 2003

C语言试题185之编写calloc函数,函数内部使用malloc函数来获取内存

题目: 编写calloc函数,函数内部使用malloc函数来获取内存 想获取更多C语言题目请猛搓这里==========》200个C语言题目目录汇总

码莎拉蒂 2737

内核月报201702

Upstream 4.10-rc7 文章来源 *LWN 文章摘要 The future of the page cache *https://lwn.net/Articles/712467/ 齐江 十刀 持久化内存用得越来越多, 促使了内核的一系列变更, 内核是否还真的需要页面缓存呢? 在2017 linux.conf.au会上, Matthew Wi...

weixin_34050389的博客 295

Linux环境下自定义malloc简易实现

在现代操作系统中,内存管理是构建高效、稳定系统的核心组件之一。它不仅涉及对物理内存的组织和分配,还包括虚拟内存的管理,以及内存映射等概念。本章将概述内存管理的基本概念和重要性,为读者提供一个坚实的理论基础。malloc函数是C语言标准库中的一个内存分配函数,它能够从堆(heap)中动态地分配一块指定大小的内存区域,并返回一个指向它的指针。如果分配失败,则返回一个空指针(NULL)。malloc函数的原型定义在stdlib.h头文件中。这里,size_t。

weixin_36288992的博客 880

malloc()函数源代码

#include "types.h" #include "stddef.h" #include "string.h" /* Imported functions */ extern void prom_printf (char *fmt, ...); static char *malloc_ptr = 0; static char *malloc_top = 0; static char *l

lxmky的专栏 1万+

【侯俊霞全网最全收集--PLC1200/200SMART(88+93课时) 第1章】

第1章:零基础快速入门西门子S7-1200

问就ycy的博客 2033

Linux-VMware安装后没有虚拟网卡VMnet1和VMnet8(亲测有效,一步一步跟着绝对成功)

VMware-安装后没有虚拟网卡VMnet1和VMnet8 就这个破东西我昨天弄了一天,网上什么VMware卸载重装,用CCleaner清理注册表什么的操作我全用了,但是昨天就是弄不好,同样的操作我昨天试了无数遍一直觉得可能是 持续更新中… 文章参考学习地址:https://blog.youkuaiyun.com/qq_42445139/article/details/87872130 ...

杨的博客 8845

glibc下malloc与free的实现原理(二):malloc函数的实现

讲解glibc下malloc的实现,为今后pwn的堆利用打好基础

weixin_44215692的博客 6157

英飞凌TC3xx DSADC旋变软解码实战:从示波器波形到VX1000数据,手把手教你避坑

本文详细介绍了英飞凌TC3xx系列微控制器的DSADC模块在电机旋变软解码中的实战应用。从示波器波形分析到VX1000数据采集,提供了一套完整的调试方法论,帮助工程师快速定位和解决常见问题,提升解码精度和系统性能。

weixin_30598225的博客 517

FreeBSD-7 内核malloc 源代码分析

华为数通硬件四部李昂li_ang82@msn.comhttp://lllaaa.cublog.cn看FreeBSD-7 的内核代码有一段时间了,但是一直没有能够总结一下。由于没有写文档,很多地方都是一带而过,并没有深入分析。为了逼自己能够分析完整个malloc 过程的代码,我决定一边分析一边记录自己的分析笔记。一提到内存分配,自然会想到malloc 和free 这对双胞胎。在FreeBSD 内核里

SmartWan的专栏 3075

Silvaco二极管、三极管、CMOS的制备

Silvaco二极管和三极管的制备

yytu231的博客 5749

Agent驱动电商运营:从选品到售后的全链路革新

在当今竞争激烈的电商市场中,传统的电商运营模式面临着诸多挑战。从选品到售后,每个环节都需要大量的人力投入和专业知识。选品需要深入了解市场趋势和消费者需求,营销需要精准定位目标用户,客服需要24小时响应用户咨询。这些工作不仅耗时耗力,而且容易受到人为因素的影响,导致效率低下和成本高企。AI Agent是一种能够感知环境、做出决策并采取行动的智能系统。感知能力:能够获取和处理环境信息。决策能力:能够根据感知到的信息做出决策。行动能力:能够执行决策,对环境产生影响。学习能力。

AI 领航者的博客 354

malloc()函数和free()函数源代码

原文地址:http://blog.youkuaiyun.com/lxmky/article/details/6909060 #include "types.h" #include "stddef.h" #include "string.h" /* Imported functions */ extern void prom_printf (char *fmt, ...); static char

遨游网络huster的专栏 1万+

【20】方案管理器

方案管理器是Excel中一个非常强大且灵活的工具,适合用于多情景分析和比较。在复杂的决策过程中,它可以帮助用户快速管理和评估不同变量组合下的结果,从而优化决策过程。

学习,输出==》再学习再输出 1585

关于C语言的malloc函数以及内存泄漏的问题

malloc函数 malloc函数的原型: (void *)malloc(int size)  malloc函数的返回值是一个void类型的指针,参数为int类型的数据,即申请分配的内存大小,单位是字节。内存分配成功之后,malloc函数返回这块内存的首地址,你需要一个指针来接受这个地址。但是由于函数的返回值是void *类型,所以必须强制转换成你所接收的类型。也就是说这块内存将来要用来

司徒若寒的博客 1万+

YOLOv11改进缝合注意力 | 深度优化的BiFormer模型-结合BiLevel Routing Attention与深度可分离卷积的创新应用(附代码)

YOLO(You Only Look Once)系列目标检测算法一直以来都是计算机视觉领域的热门选择。随着YOLOv11的发布,它在许多实际应用场景中取得了显著的性能提升。然而,面对日益复杂的目标检测任务,单纯依赖卷积神经网络(CNN)在某些情况下已经显得力不从心,特别是在处理小尺度、密集目标以及遮挡目标时,卷积操作的局部性限制了模型的表达能力。

一键难忘的博客 715

RK3588开发笔记-MIPI-CSI接口视频解码芯片XS9922B调试

Rockchip RK3588 是一款高性能的处理器,支持多种摄像头接口,包括 MIPI(Mobile Industry Processor Interface)接口。MIPI是一种用于移动设备和嵌入式系统中的摄像头、显示器和其他传感器设备的串行接口标准。MIPI是MIPI联盟发起的为移动应用处理器制定的开放标准。CSI-2(Camera Serial Interface 2)是MIPI 联盟定义的另一种高速接口,主要用于摄像模组和处理器之间的连接。

flypig has a dream! 6860

ptmalloc下的malloc与free

ptmalloc(glibc)下的malloc与free机制all_in_one分析

u014377094的博客 4675

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

VC++的malloc实现代码

导读: malloc.c属于C的运行时函数库(C Runtime Library)文件VC安装时默认没有把代码复制到硬盘,可以通过添加删除组件把文件复制到硬盘上VC++ Runtime Libraries / CRT Source Code这样在C:/Program Files/Microsoft Visual Studio/VC98下会出现一个CRT的文件夹malloc.c文

xu的blog 3625

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

函数malloc的实现源代码

引用:http://topic.youkuaiyun.com/t/20051114/18/4392766.html   /****************************************************************     Copyright   1990,   1994,   2000   by   AT&T,   Lucent   Technologies   an

zhaofuguang的专栏 1375

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

动态内存管理,malloc和calloc以及realloc函数用法

malloc其实就是动态开辟空间,其实就是让程序员自己去决定开辟多大空间int a=5,在栈空间上开辟4个字节去存变量a,char b=1在栈空间上开辟1个字节去存变量b,包括数组char arr[10]以上空间都是固定的,这种开辟空间是编译器自动完成分配的,在程序运行之前就已经分配好了,编译器负责将源代码翻译成机器语言,并确定变量在内存中的存储方式和位置。操作系统负责管理内存并为程序分配空间,但编译器决定了变量在内存中的布局和大小。但是对于空间的需求,不仅仅是上述的情况。

a1937194471的博客 2200
上一篇: malloc 最大可以分配多大内存
下一篇: 内存池设计
SearchLife
博客等级 码龄20年 51粉丝 22原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值