Linux内核:系统调用大全(持续更新中)

2023-11-04

系统调用

1、sys_brk

系统调用sys_brk的函数原型:

/*
 * sys_brk()是一个操作系统调用,用于更改进程的堆空间大小。
 * sys_brk()函数接收一个无符号长整型参数brk,表示要求的新的程序数据段(堆)结束地址。
 * 如果brk的值大于当前的程序数据段结束地址,则增加堆的大小;如果brk的值小于当前的程序数据段结束地址,则缩小堆的大小。
 * 函数返回值为long类型,表示数据段结束地址。如果分配失败,则返回-1。
 */
asmlinkage long sys_brk(unsigned long brk);

以下是sys_brk()函数的一个示例代码:

// /*================================================================
// *   Copyright (C) 2023 baichao All rights reserved.
// *
// *   文件名称:sys_brk_demo.c
// *   创 建 者:baichao
// *   创建日期:2023年08月01日
// *   描    述:
// *
// ================================================================*/

#include <unistd.h>
#include <stdio.h>
#include <sys/syscall.h> // 增加此头文件

int main()
{
    void *cur_brk;

    // 获取当前程序数据段结束地址
    long ret = syscall(__NR_brk, 0);
    cur_brk = (void *)ret;
    printf("start, curr data sec end pos: %p\n", cur_brk);

    // 增加堆的大小
    long delta = 1024;
    ret = syscall(__NR_brk, cur_brk + delta); // 堆增长delta
    cur_brk = (void *)ret;
    printf("add, curr data sec end pos: %p\n", cur_brk);

    // 减小堆的大小
    delta = -512;
    ret = syscall(__NR_brk, cur_brk + delta); // 堆缩小delta
    cur_brk = (void *)ret;
    printf("sub, curr data sec end pos: %p\n", cur_brk);

    // 获取当前程序数据段结束地址
    ret = syscall(__NR_brk, 0);
    cur_brk = (void *)ret;
    printf("end, curr data sec end pos: %p\n", cur_brk);

    return 0;
}

执行结果如下:
在这里插入图片描述
需要注意的是,在使用sys_brk()函数时必须特别小心,因为它可以轻松地破坏程序的内存布局。通常情况下,建议使用malloc()等库函数来进行内存分配,以避免出现问题。

linux c有一个对于sys_brk的系统调用的封装函数sbrk:

// __delta如果为正,当前程序数据段结束地址在现有的地址上增加delta,即堆增长|delta|
// __delta如果为负,当前程序数据段结束地址在现有的地址上减少delta;即堆减小|delta|
// 返回值:返回增加前的堆的尾地址。
void *sbrk (intptr_t __delta) __THROW;

sbrk 函数用于扩展或缩小进程的堆大小,即为程序动态分配内存提供支持。它可以接受一个整数参数 increment,表示需要增加或减少的字节数。如果 increment 为正数,则将堆大小增加相应的字节数;如果为负数,则将堆大小减小相应的字节数。
示例代码如下:

/*================================================================
*   Copyright (C) 2023 baichao All rights reserved.
*   
*   文件名称:sbrk.c
*   创 建 者:baichao
*   创建日期:2023年08月01日
*   描    述:
*
================================================================*/


#include <unistd.h>
#include <stdio.h>

int main() {
    void *cur_brk;

    // 获取当前程序数据段结束地址
    cur_brk = sbrk(0);
    printf("start, curr data sec end pos: %p\n", cur_brk);

    // 增加堆的大小
    long delta = 100*1024*1024;
    cur_brk = sbrk(delta); // 堆增长delta, 此时的返回值cur_brk是增加前的地址
    printf("add1, curr data sec end pos: %p\n", cur_brk);
    cur_brk = sbrk(0);
    printf("add2, curr data sec end pos: %p\n", cur_brk);

    // 减小堆的大小
    delta = 50*1024*1024;
    cur_brk = sbrk(delta); // 堆缩小delta,同理,此时的返回值cur_brk是减小前的地址
    printf("sub1, curr data sec end pos: %p\n", cur_brk);
    cur_brk = sbrk(0);
    printf("sub2, curr data sec end pos: %p\n", cur_brk);

    return 0;
}

运行结果如下:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux内核:系统调用大全(持续更新中) 的相关文章

  • 设计模式_单例模式

    线程的单例模式 一 懒汉式线程单例模式 以下该实例是懒汉式的单例模式 线程不安全 public class Singleton private static Singleton singleton private Singleton 设置构
  • Pid文件和路径

    Pid文件和路径 var run通常是存放pid文件的位置 var run是tmpfs文件系统 每次重启的时候都会清空 其中 var run是 run的链接 由于每次都清空 所以 如果想在 var run下面的子目录创建pid文件的话 子目
  • 高精度车牌识别算法

    一 车牌识别概述 车牌识别属于OCR的一种 但它也有自己的特点 考虑到边缘设备部署 我们没有用lstm 仅用普通的卷积层便实现了高精度的车牌识别方案 车牌识别的应用场景也十分广泛 常见的停车场收费系统 车牌识别算法也是智能交通算法中的基础算

随机推荐

  • 杭州乐园一日游攻略

    交通路线 杭州乐园就在湘湖边上 在地铁一号线的湘湖站下车后还有几公里路程 可以选择打车或者公交 门票购买 微信公众号 淘宝 美团都有卖的 可以都看看 有的平台会有优惠 时间安排 1 早上越早去越好 排队的人少一点 2 去的时候先看看过上车排
  • pytorch 训练_基于文件存储UFS的Pytorch训练IO优化实践

    我们在协助某AI客户排查一个UFS文件存储的性能case时发现 其使用的Pytorch训练IO性能和硬件的IO能力有很大的差距 后面内容有具体性能对比数据 让我们感到困惑的是 UFS文件存储 我们使用fio自测可以达到单实例最低10Gbps
  • 矩阵的零空间和零度

    矩阵的零空间和零度 摘要 矩阵的零空间 nullspace 矩阵的零度 nullity 秩 零度定理 The Rank Nullity Theorem numpy 与 scipy 中求矩阵的秩与零空间 摘要 这篇短文中将介绍矩阵零空间与矩阵
  • 淘宝变脸:马云的反击战

    这就是一场剑拔弩张的战争 一连数日 淘宝的公关部都挤在一间不到10平方米的房间里忙个不停 他们不仅要监视各大网络论坛的动态 还得不停处理大量的电话 传真以及电子邮件 这都是发往全国各媒体的文件 声明 自淘宝9月初屏蔽百度搜索以来 双方的摩擦
  • 【Kubernetes】Error: Cask minikube is unavailable No Cask with this name exists

    1 概述 从Mac OS Catalina开始 Kubernetes文档中提供的方法不起作用了 并且Brew cask似乎也没有minikube 这里可以看到好像没有minikube了 gt Updated Casks 4k stogram
  • 【Antlr】Antlr 自动错误恢复机制

    1 概述 上一篇文章 Antlr Antlr 修改和转发Antlr的错误消息 出自 antlr 权威指南 并且补充 错误恢复指的是允许语法分析器在发现语法错误后还能继续的机制 原则上 最好的错误恢复来自人类在手工编写的递归下降的语法分析器中
  • Retrofit发起请求的流程

    请求流程 retrofit在okhttp之上做主要有 动态代理生成api的类 以及实例 Retrofit中的动态代理 使用用Converter 对请求参数和返回参数据的处理 使用Adapter对返回类型进行封装 以Observalbe为例
  • PAT 1033 旧键盘打字

    题目链接 请点击 思路 用string定义两个字符串 然后比较就可以了 然而 开始直接用cin gt gt str1 gt gt str2 导致有部分测试点始终未过去 后来参考他人的博客才发现这里应该用getline原因就在于第一行可能是空
  • vue实现网页截图

    1 安装html2Canvas npm install html2canvas save 2 在需要的vue组件中引入 import html2canvas from html2canvas 3 编写一个截图按钮
  • 1分钟解决IntelliJ IDEA 控制台中文乱码,统一设置 utf-8,再也不会乱码了

    首发地址 https it1314 top article 776 IDEA 控制台中文乱码 4 种解决方案 图文教程 中文再也不会乱码了 IntelliJ IDEA 如果不进行相关设置 可能会导致控制台中文乱码 配置文件中文乱码等问题 非
  • Apache 开源项目分类列表

    分 类 项目名 说明 开发语言 服务器 共20 Apache HTTP Server 全球第一HTTP服务器 C C Tomcat Java的Web服务器 Java James 邮件服务器 Java SpamAssassin 反垃圾邮件 C
  • 音频格式_想入坑HIFI?你得先了解这些——音频格式篇

    闲暇时戴上耳机 任旋律静静流淌 无论是忧郁的琴曲 还是律动的电音 都能带给人独特的享受 喜爱听歌的你对音频格式了解多少呢 这些傻傻分不清楚的格式又该如何区分 为什么需要高音质音源 一套最基本的音频系统涵盖了四个部分 每一个部分都缺一不可 如
  • 网络编程8/15——TCP服务器模型(多进程并发、多线程并发),TCP和UDP的本地通信(域套接字)

    目录 多进程并发服务器 模型 代码 多线程并发服务器 模型 代码 TCP本地通信 服务器 客户端 UDP本地通信 服务器 客户端 多进程并发服务器 模型 void handler int sig 回收僵尸进程 回收成功则再回收一次 直到回收
  • 论述奇偶校验和海明码

    一 奇偶校验 奇偶校验码是奇校验码和偶校验码的统称 是一种检错码 用于检查二进制数据的位错 并且用1个比特位来标记校验结果 所以当我们的数据有n位时 要传输给接收端的数据有n 1位 采用奇校验时 若所要传输的数据 含有奇数个1 则校验位为0
  • LM 系列开关电源芯片

    LM3477 High Efficiency High Side N Channel Controller 312 2006 2 18 3 03 59 LM3477A High Efficiency High Side N Channel
  • 经典网络结构梳理:Mobilenet网络结构

    论文下载地址 https arxiv org abs 1704 04861 Caffe复现地址 https github com shicai MobileNet Caffe Mobilenet发布在2017年的CVPR Mobilenet
  • CURL命令

    生成一个ca证书 openssl pkcs12 in test p12 out test crt 使用证书访问 curl cert test p12 cert type P12 cacert test crt header content
  • unity进阶--xml的使用学习笔记

    文章目录 xml实例 解析方法一 解析方法二 xml path 创建xml文档 xml实例 解析方法一 解析方法二 xml path 创建xml文档
  • 利用 RDMA 技术加速 Ceph 存储解决方案

    利用 RDMA 技术加速 Ceph 存储解决方案 晓兵XB 云原生云 2023 04 29 20 37 发表于四川 首发链接 利用 RDMA 技术加速 Ceph 存储解决方案 在本文中 我们首先回顾了 Ceph 4K I O 工作负载中遇到
  • Linux内核:系统调用大全(持续更新中)

    系统调用 1 sys brk 1 sys brk 系统调用sys brk的函数原型 sys brk 是一个操作系统调用 用于更改进程的堆空间大小 sys brk 函数接收一个无符号长整型参数brk 表示要求的新的程序数据段 堆 结束地址 如