進程映射、mmap(day05)
阿新 • • 發佈:2017-10-26
代碼段 生命 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)