1. 进程的地址空间


<aside> 📖 概念上的定义

char *p 可以和 intptr_t 互相转换

可以指向 “任何地方”

进程的地址空间:若干连续的 “段”

<aside> 📖 操作系统提供查看进程地址空间的机制

pmap - report memory map of a process

本质是通过读取 /proc/[pid]/maps 实现

信息中包含:

<aside> 📖 vDSO (virtual dynamic shared object)

无需陷入内核的系统调用,如 gettimeofday

维护有 vvar 这样的公共只读空间

系统调用就是一组接口的约定,并不一定要陷入内核态执行

</aside>

2. 进程的地址空间管理


<aside> 📖 管理进程地址空间的系统调用

进程的地址空间 = 内存里若干连续的 “段”

// 映射
void *mmap(void *addr, size_t length, int prot, int flags,
           int fd, off_t offset);
int munmap(void *addr, size_t length);
// 修改映射权限
int mprotect(void *addr, size_t length, int prot);

</aside>

<aside> 📖 映射

把文件映射到了进程地址空间:文件 = 字节序列 = 内存

可以快速完成大范围空间的映射

但这样也会产生Memory-Mapped File的一致性问题

</aside>

3. 地址空间的隔离


<aside> 📖 地址空间:实现进程隔离

每个 *ptr 都只能访问本进程 (状态机) 的内存