Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Linux | 内存分配之malloc->brk

Linux | 内存分配之malloc->brk

作者头像
heidsoft
发布于 2023-03-18 09:17:05
发布于 2023-03-18 09:17:05
2K00
代码可运行
举报
运行总次数:0
代码可运行

~/Downloads/research/linux-5.15.4/mm/mmap.c

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SYSCALL_DEFINE1(brk, unsigned long, brk)
{
  unsigned long newbrk, oldbrk, origbrk;
  struct mm_struct *mm = current->mm;
  struct vm_area_struct *next;
  unsigned long min_brk;
  bool populate;
  bool downgraded = false;
  LIST_HEAD(uf);

  if (mmap_write_lock_killable(mm))
    return -EINTR;

  origbrk = mm->brk;

#ifdef CONFIG_COMPAT_BRK
  /*
   * CONFIG_COMPAT_BRK can still be overridden by setting
   * randomize_va_space to 2, which will still cause mm->start_brk
   * to be arbitrarily shifted
   */
  if (current->brk_randomized)
    min_brk = mm->start_brk;
  else
    min_brk = mm->end_data;
#else
  min_brk = mm->start_brk;
#endif
  if (brk < min_brk)
    goto out;

  /*
   * Check against rlimit here. If this check is done later after the test
   * of oldbrk with newbrk then it can escape the test and let the data
   * segment grow beyond its set limit the in case where the limit is
   * not page aligned -Ram Gupta
   */
  if (check_data_rlimit(rlimit(RLIMIT_DATA), brk, mm->start_brk,
            mm->end_data, mm->start_data))
    goto out;

  newbrk = PAGE_ALIGN(brk);
  oldbrk = PAGE_ALIGN(mm->brk);
  if (oldbrk == newbrk) {
    mm->brk = brk;
    goto success;
  }

  /*
   * Always allow shrinking brk.
   * __do_munmap() may downgrade mmap_lock to read.
   */
  if (brk <= mm->brk) {
    int ret;

    /*
     * mm->brk must to be protected by write mmap_lock so update it
     * before downgrading mmap_lock. When __do_munmap() fails,
     * mm->brk will be restored from origbrk.
     */
    mm->brk = brk;
    ret = __do_munmap(mm, newbrk, oldbrk-newbrk, &uf, true);
    if (ret < 0) {
      mm->brk = origbrk;
      goto out;
    } else if (ret == 1) {
      downgraded = true;
    }
    goto success;
  }

  /* Check against existing mmap mappings. */
  next = find_vma(mm, oldbrk);
  if (next && newbrk + PAGE_SIZE > vm_start_gap(next))
    goto out;

  /* Ok, looks good - let it rip. */
  if (do_brk_flags(oldbrk, newbrk-oldbrk, 0, &uf) < 0)
    goto out;
  mm->brk = brk;

success:
  populate = newbrk > oldbrk && (mm->def_flags & VM_LOCKED) != 0;
  if (downgraded)
    mmap_read_unlock(mm);
  else
    mmap_write_unlock(mm);
  userfaultfd_unmap_complete(mm, &uf);
  if (populate)
    mm_populate(oldbrk, newbrk - oldbrk);
  return brk;

out:
  mmap_write_unlock(mm);
  return origbrk;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 *  this is really a simplified "do_mmap".  it only handles
 *  anonymous maps.  eventually we may be able to do some
 *  brk-specific accounting here.
 */
static int do_brk_flags(unsigned long addr, unsigned long len, unsigned long flags, struct list_head *uf)
{
  struct mm_struct *mm = current->mm;
  struct vm_area_struct *vma, *prev;
  struct rb_node **rb_link, *rb_parent;
  pgoff_t pgoff = addr >> PAGE_SHIFT;
  int error;
  unsigned long mapped_addr;

  /* Until we need other flags, refuse anything except VM_EXEC. */
  if ((flags & (~VM_EXEC)) != 0)
    return -EINVAL;
  flags |= VM_DATA_DEFAULT_FLAGS | VM_ACCOUNT | mm->def_flags;

  mapped_addr = get_unmapped_area(NULL, addr, len, 0, MAP_FIXED);
  if (IS_ERR_VALUE(mapped_addr))
    return mapped_addr;

  error = mlock_future_check(mm, mm->def_flags, len);
  if (error)
    return error;

  /* Clear old maps, set up prev, rb_link, rb_parent, and uf */
  if (munmap_vma_range(mm, addr, len, &prev, &rb_link, &rb_parent, uf))
    return -ENOMEM;

  /* Check against address space limits *after* clearing old maps... */
  if (!may_expand_vm(mm, flags, len >> PAGE_SHIFT))
    return -ENOMEM;

  if (mm->map_count > sysctl_max_map_count)
    return -ENOMEM;

  if (security_vm_enough_memory_mm(mm, len >> PAGE_SHIFT))
    return -ENOMEM;

  /* Can we just expand an old private anonymous mapping? */
  vma = vma_merge(mm, prev, addr, addr + len, flags,
      NULL, NULL, pgoff, NULL, NULL_VM_UFFD_CTX);
  if (vma)
    goto out;

  /*
   * create a vma struct for an anonymous mapping
   */
  vma = vm_area_alloc(mm);
  if (!vma) {
    vm_unacct_memory(len >> PAGE_SHIFT);
    return -ENOMEM;
  }

  vma_set_anonymous(vma);
  vma->vm_start = addr;
  vma->vm_end = addr + len;
  vma->vm_pgoff = pgoff;
  vma->vm_flags = flags;
  vma->vm_page_prot = vm_get_page_prot(flags);
  vma_link(mm, vma, prev, rb_link, rb_parent);
out:
  perf_event_mmap(vma);
  mm->total_vm += len >> PAGE_SHIFT;
  mm->data_vm += len >> PAGE_SHIFT;
  if (flags & VM_LOCKED)
    mm->locked_vm += (len >> PAGE_SHIFT);
  vma->vm_flags |= VM_SOFTDIRTY;
  return 0;
}
  • https://www.man7.org/linux/man-pages/man2/brk.2.html
  • https://corey.tech/DevOps-Industry-Updates-1/
  • https://jgsun.github.io/2019/01/21/linux-tcpdump/
  • https://zgqallen.github.io/2019/05/14/linux-glic-mm-overview/
  • https://www.freesion.com/article/87121104152/
  • https://codereview.stackexchange.com/questions/80190/malloc-free-realloc-using-brk-and-sbrk
  • https://www.kernel.org/doc/html/latest/core-api/memory-allocation.html
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-11-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云数智圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Nginx配置文件nginx.conf全解
nginx配置文件nginx.conf的配置http、upstream、server、location等;
青山师
2023/05/05
8610
深入解析Nginx配置文件
Nginx是一款高性能的HTTP和反向代理服务器,广泛应用于各类Web服务器。作为一名测试工程师,了解Nginx配置文件的细节有助于更好地进行测试和优化服务器性能。本文将详细介绍Nginx配置文件的结构及其主要配置项。
霍格沃兹测试开发Muller老师
2024/06/19
2.8K0
Nginx通过https方式反向代理的简单实现
1)nginx的反向代理:proxy_pass 2)nginx的负载均衡:upstream 下面是nginx的反向代理和负载均衡的实例: 负载机:A机器:103.110.186.8/192.168.1.8 后端机器1:B机器:192.168.1.102 后端机器2:C机器:192.168.1.103 需求: 1)访问A机器的8080端口,反向代理到B机器的8080端口; 访问A机器的8088端口,反向代理到C机器的8088端口; 访问http://103.110.86.8:8090/io
洗尽了浮华
2018/01/22
8.2K0
Nginx 极简教程,一看就会!
Nginx (engine x) 是一款轻量级的Web 服务器 、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。
用户6543014
2019/10/25
5800
Nginx 极简教程,一看就会!
nginx负载均衡(5种方式)、rewrite重写规则及多server反代配置梳理
Nginx除了可以用作web服务器外,他还可以用来做高性能的反向代理服务器,它能提供稳定高效的负载均衡解决方案。nginx可以用轮询、IP哈希、URL哈希等方式调度后端服务器,同时也能提供健康检查功能。目前有众多公司均已经部署使用nginx实现基于七层的负载均衡功能。 1)Nginx负载均衡 为了实现Nginx的反向代理以及负载均衡功能,应用中需要用到两个模块,HttpProxyModule和HttpUpstreamModule模块;其中HttpProxyModule模块的作用是将用户的数据请求转发到其他服
洗尽了浮华
2018/01/23
8.2K0
nginx负载均衡(5种方式)、rewrite重写规则及多server反代配置梳理
Nginx反向代理+负载均衡简单实现(https方式)
背景: A服务器(192.168.1.8)作为nginx代理服务器 B服务器(192.168.1.150)作为后端真实服务器 现在需要访问https://testwww.huanqiu.com请求时从A服务器上反向代理到B服务器上 这就涉及到nginx反向代理https请求的配置了~~~ ------------------------------------------------------------------------------------ A服务器(192.168.1.8)上的操作流程: 1
洗尽了浮华
2018/01/22
3K0
nginx简易教程
Nginx (engine x) 是一款轻量级的 Web 服务器 、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。
lyb-geek
2018/07/26
1K0
nginx简易教程
nginx简易教程
nginx简易教程 概述 什么是nginx? Nginx (engine x) 是一款轻量级的Web 服务器 、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。 什么是反向代理? 反向代理(
静默虚空
2018/01/05
1.6K0
nginx简易教程
基于CentOS 7配置Nginx反向代理
Nginx作为反向代理服务器被广泛使用在各大互联网企业。它简单易用,可以根据业务的需求将其不同的业务类型代理至不同的服务器,将整个站点请求压力按类型分摊到不同的服务器。该方式使的整个站点请求性能得以极大的提升。本文简要描述了Nginx几种不同情形的代理演示,供大家参考。
Leshami
2018/08/06
2.2K0
基于CentOS 7配置Nginx反向代理
Nginx
刚开始做这个网站的时候,只有一个定时任务jar包,每天定时给指定用户发短信,后来觉得其他人可能也需要这种服务,在其基础上二次开发,可扩展多任务,多用户定时任务,赚了一点点,这时候已经是部署在tomcat上了,端口占用80; 后来想自己做博客,但是博客想要使用主域名,即原服务需要修改端口,但是这种形式容易忘记端口,还需要去防火墙重新放开一个端口,想的是一个二级域名可以直接访问,这时候想到Nginx!
不期而遇丨
2022/09/09
5400
nginx配置详解
nginx大家都听说过吧,我就不详细介绍了。我这里就列一下,nginx中nginx.conf配置文件每个配置项的详细解释。
业余草
2019/01/21
1.2K0
Nginx-正反向代理及负载均衡
目录 正/反向代理 代理的方式 Nginx代理服务支持的协议 代理实战 部署web01 部署Lb01 Nginx代理常用参数 添加发往后端服务器的请求头信息 代理到后端的TCP连接、响应、返回等超时时间 proxy_buffer代理缓冲区 配置代理优化文件 负载均衡 负载均衡的架构 负载均衡的实现 连接池 实现步骤 负载均衡的比例 轮询 权重 ip_hash 负载均衡后端状态 down backup max_fails、fail_timeout proxy_next_upstream监控的错误类型 负载均衡
HammerZe
2022/03/25
5460
Nginx-正反向代理及负载均衡
Nginx 常用实践
Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。性能是 Nginx 最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发连接数,最重要的是,Nginx 是免费的并可以商业化,配置使用也比较简单。
默存
2023/09/01
3770
Nginx 常用实践
nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录
在日常运维工作中,运维人员会时常使用到nginx的反向代理,负载均衡以及缓存等功能来优化web服务性能。 废话不多说,下面对测试环境下的nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)
洗尽了浮华
2018/01/22
3.4K0
nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录
谷粒商城Nginx代理网关
首先需要在C:\Windows\System32\drivers\etc中的host文件下加入
一个风轻云淡
2023/10/15
4090
nginx常用配置
proxy_redirect 该指令用来修改被代理服务器返回的响应头中的Location头域和“refresh”头域。
章工运维
2023/05/19
9920
Nginx实例与localtion匹配规则
〇、官方手册 一、反向代理 docker run --name nginx -d -p 80:80 -v /nginx/html:/usr/share/nginx/html -v /nginx/nginx.conf:/etc/nginx/nginx.conf nginx 下面为容器的端口!!!!!! # 运行用户 #user nobody; # 启动进程,通常设置成和cpu数量相等 worker_processes 1; #全局错误日志及PID文件 #error_log logs/error.lo
wuweixiang
2019/03/12
9970
使用Nginx实现高效集群部署:前端与多个后端服务的完美结合
大家好,我是默语,擅长全栈开发、运维和人工智能技术。在本篇博客中,我将分享如何使用Nginx进行集群部署。这篇文章不仅适合新手学习,还能帮助有经验的开发者优化他们的部署架构。关键词:Nginx、集群部署、负载均衡、后端分发。
默 语
2024/11/22
1.5K0
Nginx-基础总结(上)
1.proxy_set_header :在将客户端请求发送给后端服务器之前,更改来自客户端的请求头信息。 2.proxy_connect_timeout:配置Nginx与后端代理服务器尝试建立连接的超时时间。 3.proxy_read_timeout : 配置Nginx向后端服务器组发出read请求后,等待相应的超时时间。 4.proxy_send_timeout:配置Nginx向后端服务器组发出write请求后,等待相应的超时时间。 5.proxy_redirect :用于修改后端服务器返回的响应头中的Location和Refresh。
云计算小黑
2022/12/28
4910
Nginx的安装部署以及使用
nginx是现在互联上非常流行的高性能的 Web 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。
星哥玩云
2022/07/28
9930
推荐阅读
相关推荐
Nginx配置文件nginx.conf全解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验