进程映射mmap(day05)
Posted Kernel001
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程映射mmap(day05)相关的知识,希望对你有一定的参考价值。
一、内存管理(续) 每个进程都有自己独立的4G的虚拟地址空间。 冯.诺伊曼体系结构 哈佛体系结构 section 代码段 只读数据段 栈段 举例说明 数据所属的段。 代码参见 memory.c 如何获取进程自己的pid? getpid(2) #include <sys/types.h> #include <unistd.h> pid_t getpid(void); 功能:获取进程的id 参数: void 返回值: pid_t 当前进程的pid cat /proc/pid/maps 初始化和赋值是两码事 栈段和代码段 数据段 栈段 栈段是一个容器,栈段中有多个栈帧。 一个进程只有一个栈段。 每个函数都有自己的栈帧,在函数结束的时候,函数的栈帧释放。 函数中变量的空间分配在栈帧上的,变量的空间释放了。 变量的生命结束了。 什么样的变量的空间分配在栈帧上? 函数中的自动局部变量和函数的形参的空间分配在栈帧中。 函数 静态的局部变量和全局变量的空间分配在数据段。进程 但两者的作用域不同。 stack heap 代码段 数据段 堆、 栈 堆的生命周期 要么程序员手动释放堆空间。否则,进程结束的时候。 二、使用mmap将物理地址映射到进程的虚拟地址空间。 mmap(2) #include <sys/mman.h> void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); 功能:将文件或者设备映射到内存 参数: addr:指定了映射区域的起始地址。NULL 地址有内核决定 length:指定了映射区域的长度 prot: PROT_EXEC Pages may be executed. PROT_READ Pages may be read. PROT_WRITE Pages may be written. PROT_NONE Pages may not be accessed. flags: 2选1: MAP_SHARED:对映射区域的更新给其他进程看,也同步到下层的文件。 MAP_PRIVATE:对映射区域的更新不给其他进程看。也不同步到下层的文件 MAP_ANONYMOUS:映射区域的内容被初始化为0.不与任何文件相关。 如果指了这个参数。fd和offset被忽略。 fd:文件描述符(文件) offset:文件的起始位置(文件) 返回值: MAP_FAILED 错误 errno被设置 返回映射区域的首地址。 int munmap(void *addr, size_t length); 功能:解除文件到内存的映射 参数: addr:mmap(2)的返回值 length:指定了映射区域的长度。 返回值: 0 成功 -1 失败 errno被设置 补充: 一切皆文件。 举例说明,使用mmap将物理地址映射到进程的虚拟地址空间,然后对虚拟地址空间进行操作。代码参见mmap.c 总结: 一、进程的映射 代码段 数据段 堆 栈 周六日 复习C语言 二、使用mmap将物理地址映射到进程的虚拟地址空间
以上是关于进程映射mmap(day05)的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 一 | mmap 函数简介 )
Binder 机制进程通信-正常情况 | 进程通信- mmap 内存映射 | Binder 机制重要组件