1. 程式人生 > >進程映射、mmap(day05)

進程映射、mmap(day05)

代碼段 生命 one errno red nmap 參數 虛擬地址 write

一、內存管理(續)
每個進程都有自己獨立的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)