进程映射、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将物理地址映射到进程的虚拟地址空间
原文地址:https://www.cnblogs.com/Kernel001/p/7732553.html