brk系统调用实现分析

linux内核内存管理-brk系统调用 尽管可见度不高,brk也许是最常使用的系统调用了,用户进程通过它向内核申请空间。人们常常并不意识到在调用brk,原因在于很少有人会直接使用系统调用brk向系统申请空间,而总是通过像malloc一类的C语言库函数(或语言成分,如C++中的new)间接地调用brk。如果把malloc想象成零售,brk则是批发。库函数malloc为用户进程(malloc本身就是该进程的一部分)维持一个小仓库,当进程需要使用更多的内存空间时就向小仓库要,小仓库中存量不足时就通过brk向内核批发。前面讲过,每个进程拥有3GB字节的用 阅读详情

brk(addr)直接修改堆的大小。addr指定current->mm->brk的新值,返回值是线性区新的结束地址,这是一个系统调用。当用户态的进程调用brk()系统调用时,内核执行sys_brk(addr)函数。下面分析这个函数的执行流程:

1:检测addr参数是否位于进程代码段所在的线性区,如果是直接返回,因为堆不能与进程代码段所在的线性区重合。

mm=current->mm;
down_write(&mm->mmap_sem);
if(addr<mm->end_code){
out:
	up_write(&mm->mmap_sem);
	return mm->brk;
}


2:由于brk系统调用作用于一个线性区,它分配和释放完整的页。因此,该函数把addr的值调整为PAGE_SIZE的倍数,然后把调整的结果和内存描述的brk进程比较。

newbrk=(addr+0xfff)&0xfffff000;
oldbrk=(mm->brk+0xfff)&0xfffff000;
if(oldbrk==newbrk)
{
	mm->brk=addr;
	goto out;
}


3:如果进程请求缩小堆,则sys_brk()调用do_munmap()完成这项任务,然后返回

if(addr<=mm->brk)
{
	if(!do_munmap(mm,newbrk,oldbrk-newbrk))
		mm->brk=addr;
	goto out;
}


4:如果进程请求扩大堆,则sys_brk首先检查是否允许进程这么做。如果进程企图分配在其限制范围之外的内存,函数并不多分配内存,只简单返回mm->brk的原有值

rlim=current->signal->rlim[RLIMIT_DATA].rlim_cur;
if(rlim<RLIM_INFINITY & addr - mm->start_data>rlim)
	goto out;


5:然后,函数检查扩大之后的堆是否和进程的其他线性区重叠,如果是,不做任何事情就返回:

if(find_vma_itersection(mm,oldbrk,newbrk+PAGE_SIZE))
	goto out;


6:如果一切都顺利,则调用do_brk()函数。如果返回oldbrk,则分配成功且sys_brk返回addr的值,否则返回旧的mm->brk

if(do_brk(oldbrk,newbrk-oldbrk)==oldbrk)
	mm->brk=addr;
goto out;

do_brk()函数实际上是仅处理匿名线性区的do_mmap()简化版。可以认为它的调用等价于:

do_mmap(NULL,oldbrk,newbrk-oldbrk,PROT_READ|PROT_WRITE|PROT_EXEC,MAP_FIXED|MAP_PRIVATE,0)

当然do_brk()比do_mmap()稍快,因为前者假定线性区不映射磁盘上的文件,从而避免了检查线性区对象的几个字段。在这里就不介绍do_brk()函数了,因后面会写一篇专门介绍重要的do_munmap。


 

【存储管理】brk()系统调用 尽管应用程序编程时很少直接调用brk()系统调用 阅读详情

相关推荐

linux内核那些事之brk机制

内核向用户层提供申请用户虚拟空间的两种机制除了mmap之外,另外一个就是brk机制,mmap主要控制虚拟空间mmap区域管理,而brk机制主要管理的是一个进行的堆空间。 brk/sbrk brk 和sbrk是内核向用户提供的两个用于申请堆空间的系统调用,一般应用程序并不直接使用brk系统调用,而是通过glibc封装好的malloc接口间接调用brk系统调用。 #include <unistd.h> int brk(void *addr); void *sbrk(intptr_t in

weixin_42730667的博客 5868

linux内存管理-系统调用brk()

尽管可见度不高,brk也许是最常使用的系统调用了,用户进程通过它向内核申请空间。人们常常并不意识到在调用brk,原因在于很少有人会直接使用系统调用brk向系统申请空间,而总是通过像malloc一类的C语言库函数(或语言成分,如C++中的new)间接地调用brk。如果把malloc想象成零售,brk则是批发。库函数malloc为用户进程(malloc本身就是该进程的一部分)维持一个小仓库,当进程需要使用更多的内存空间时就向小仓库要,小仓库中存量不足时就通过brk向内核批发。 前面讲过,每个进程拥有3GB字节

guoguangwu的专栏 6915

uniapp监听扫码枪键盘事件|无输入框式监听

一般的扫码枪通过USB或蓝牙连接手机或电脑,充当的是一个外接设备。当扫码后,扫码枪会自动识别内容,然后向连接的电脑或手机发送键盘事件keydown或keyup。

tcy9099的专栏 9748

Linux 5.7内核内存管理-brk系统调用的工作原理和代码流程

brk系统调用是用于控制进程数据段(也称为堆)大小的接口。在Linux中,堆是动态内存分配的一部分,进程可以通过brk系统调用来增加或减少堆的大小。brk系统调用接受一个参数,即新的堆结束地址。brk系统调用是Linux内核内存管理中的一个重要组成部分,它允许进程动态地调整堆的大小。通过sys_brk和do_brk函数的实现,我们可以看到内核是如何管理内存区域、分配内存页以及更新内存管理数据结构的。

bai915290475的博客 1220

Android Studio运行报错: failed to load include path ……\platforms\android-35\android.jar的最细解决方案

【代码】Android Studio运行报错: failed to load include path ……\platforms\android-35\android.jar的最细解决方案。

2401_86789230的博客 2万+

保姆级教程:用CameraX API快速搞定Android多摄像头切换与预览(附避坑指南)

本文提供了一份详细的CameraX API教程,帮助开发者快速实现Android多摄像头切换与预览功能。通过简化API设计和生命周期感知能力,CameraX大幅降低了开发复杂度,同时解决了多摄像头兼容性、预览优化等常见问题。文章包含完整代码示例和实战避坑指南,特别适合需要高效集成相机功能的Android开发者。

weixin_42699679的博客 166

Linux sys_brk()系统调用实现分析

对于do_brk()功能的说明: this is really a simplified "do_mmap". it only handles anonymous maps(只处理匿名映射). eventually we may be able to do somebrk-specific accounting here. 应用层使用brk()系统调用的例子: /* sbrk and brk example */ #include <stdio.h> #include &...

669

别再只画GO图了!用R语言+Perl脚本搞定单细胞KEGG富集分析与圈图(附完整代码)

本文详细介绍了如何利用R语言和Perl脚本实现单细胞KEGG富集分析全流程,从基因ID转换到专业圈图可视化。通过对比KEGG与GO分析的互补价值,提供完整的代码实现和优化技巧,帮助研究者高效完成单细胞测序数据的通路分析,并生成高质量的圈图展示结果。

weixin_28694169的博客 403

linux的系统调用brk

brk系统调用是用来为用户进程增加/减少heap或stack内存的。

一墨的博客 857

从零开始:H20服务器上DeepSeek R1 671B大模型部署与压力测试全攻略

最近,我有幸在工作中接触到了DeepSeek R1 671B模型,这是目前中文开源领域参数量最大的高质量模型之一。DeepSeek团队在2024年推出的这款模型,以其惊人的6710亿参数量和出色的推理性能,引起了业界广泛关注。作为一名AI基础设施工程师,我有机会在H20服务器上部署这个庞然大物,并对其进行了全面的压力测试。这篇文章将详细记录我的部署过程和性能测试方法,希望能为大家提供一些参考。💡为什么选择DeepSeek R1?超大规模参数量(671B)优秀的中英文理解能力开源可商用的许可证。

wangli的博客 1万+

银行数据仓库体系实践(3)--数据架构

狭义的数据仓库数据架构用来特指数据分布,广义的数据仓库数据架构还包括数据模型、数据标准和数据治理。即包含相对静态部分如元数据、业务对象数据模型、主数据、共享数据,也包含相对动态部分如数据流转、ETL、整合、访问应用和数据全生命周期管控治理。 数据架构层面通过数据分类、分层部署等手段,从非功能性视角将数据合理布局。通过整体架构管控和设计,支持业务操作类和管理分析类应用(系统),满足业...

acumen_leo的博客 7010

linux内存管理之sys_brk实现分析【一】

目 录 1       概述... 2 1.1       报告题目... 2 2       系统调用功能概述... 2 3       数据结构分析... 4 3.1       数据结构... 5 3.2       vm_area_struct结构体... 6 3.3       mm_struct结构体... 8 4       sbrk()系统调用代码分析... 10

sadamoo的专栏 1676

Level 4自动驾驶系统设计0——功能与场景0

摘要:当前智能驾驶系统开发存在应试思维误区,过度依赖NCAP标准测试而忽视真实物理世界的复杂工况。随着系统进入L4大模型时代,必须从离散测试转向应对无限连续的长尾场景。关键在于解决传感器输入质量(避免"垃圾进垃圾出"问题),通过逆向定义方法论确保前端数据高置信度。同时采用影子模式收集分歧数据流,结合条件接受机制动态调整感知权重,最终实现功能释放主权(FO)的100%安全闭环。本文揭示了如何为端到端智驾大模型建立物理红线,这是确保L4系统量产的底层法则。

Godspeed_zwh的博客 307

sys_brk

sys_brk SYSCALL_DEFINE1(brk, unsigned long, brk) { unsigned long rlim, retval; unsigned long newbrk, oldbrk; struct mm_struct *mm = current->mm; unsigned long min_brk; down_write(&mm->mmap_

ssmale的专栏 1088

【RT-DETR涨点改进】独家小目标涨点改进篇 | TGRS 2025 | RT-DETR引入ABRNet小目标检测顶刊中的:ARF自适应性感受野和MCA双向交叉轴注意力,适合小目标检测有效涨点

本文提出了一种改进的RT-DETR小目标检测方法,通过集成自适应感受野模块(ARF)和多尺度交叉轴注意力模块(BC)来提升检测性能。ARF模块采用多种卷积核动态调整感受野,有效捕获多尺度目标特征并减少背景干扰;BC模块通过多尺度交叉轴注意力机制增强全局信息提取和特征融合能力。实验表明,该方法在复杂背景下显著提升了红外小目标检测的精度和效率,同时降低了计算开销。文章详细介绍了模块结构、原理及实现代码,并提供了多种改进配置方案,为小目标检测任务提供了有效的解决方案。

Ai缝合怪、助力小伙伴高效发论文 570

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Linux内核源码阅读之系统调用sys_brk()

摘要 brk()用于用户进程向内核申请空间,进一步说用于扩展用户堆栈空间,或者回收用户堆栈空间。 本文仅简要介绍其函数主体结构,感兴趣的读者可以阅读相关源码书籍。 asmlinkage unsigned long sys_brk(unsigned long brk) 1.malloc为小空间申请,brk()为大块空间申请。 2.sys_brk()包括两部分 增长动态分配区 uns...

刘洋_heaven的博客 1765

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

调用malloc时发生了什么(2) - sys_brk函数与VMA

调用malloc时发生了什么(2) - sys_brk函数 在上一篇中我们讲过,malloc实际调用了brk函数完成堆的分配,也了解了进程的内存布局。现在我们来看看,进程的内存布局到底是怎么实现的。具体如何堆指针增加减少的。增加减少,堆进程的影响是什么?一系列的问题等着我们去解决。 sys_brk函数(去掉了与本篇无关的代码) SYSCALL_DEFINE1(brk, unsigned

Network, Linux Kernel 1514

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Linux内核brk系统调用深度解析:堆内存管理的设计与实现

本文深入分析了Linux内核中brk系统调用的实现机制,重点剖析了sys_brk、find_vma_intersection和do_brk三个核心函数的协同工作流程。sys_brk作为系统调用入口,负责参数验证、资源限制检查及并发控制;find_vma_intersection通过红黑树查找确保地址空间不冲突;do_brk则执行实际的堆扩展操作。整个调用链展示了Linux如何通过精细的地址对齐、内存锁机制和VMA管理,在保证安全性的前提下实现高效的动态内存管理。这些机制共同维护了进程地址空间的完整性,为应用

weixin_51019352的博客 1063

Linux内存管理:mmap和brk系统调用完整技术文档

摘要:本文深入解析Linux内核的mmap和brk系统调用机制,详细介绍了两种内存管理方式的完整调用流程和关键实现。mmap用于文件映射和大内存分配,通过多层函数调用最终创建VMA结构;brk负责堆空间管理,通过do_brk实现堆扩展。文档包含完整的调用链路图、关键函数分析和代码逻辑说明,涵盖参数验证、地址空间检查、VMA合并等核心步骤,为理解Linux内存管理提供全面的技术参考。(146字)

love131452098的博客 1296

linux内存管理之sys_brk实现分析【一】 .

linuxstruct数据结构file代码分析tree 目录(?)[+] 概述 报告题目 系统调用功能概述数据结构分析 数据结构vm_area_struct结构体mm_struct结构体  Linux内存管理分析报告 分析内容: linux 内存管理之sys_brk 实现分析   目 录 1       概述... 2 1.1     

sadamoo的专栏 940

sys_brk分析 linux1.2.0版本,linux内存管理之sys_brk实现分析(续)

看上面可以看出:clear_page_tables中,要操作的线性地址即为prev,prev->next之间的空洞线性地址。理解了这点之后,上面的代码就变得很简单了^_^三:用户空间的伸展先回顾一下sys_brk的代码:asmlinkage unsigned long sys_brk(unsigned long brk){…………//前一部份是用户空间的收缩/* Check against ...

weixin_39657444的博客 123

linux-glibc内存管理小结2(内存相关系统调用的实现)

在上一节ptmalloc源码分析中我们提到dlmalloc向系统申请内存的方式有两种, 对应Linux系统下分别是sbrk()与mmap()系统调用. 本节我们就来看下brk()/sbrk()与mmap()/munmap()的实现, 作为切入点来一窥内核内存管理的特点. 在正文开始之前我们先大致描述一下内核内存管理的模型. 以32bit系统为例Linux将4G地址空间划分为两块, 低地址为用户态地...

weixin_34248023的博客 176

进程地址空间 - 堆管理

TBD

kickxxx的专栏 2249
上一篇: PAGE_MASK判定addr是否是4096倍数
下一篇: 文件读写的理论
OS技术解密
博客等级 码龄16年 3760粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值