Linux进程地址空间管理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5. 在缺页异常的中断服务程序中按“一次一页”的方 式分配物理页框,并修改页表。
14
增加或删除一个线性区
2020/4/7
Linux OS analysis
15
处理线性区的函数
❖ 内核进程需要对一个线性区进行处理,比如确定一个给 定线性地址是否存在于一个线性地址空间中
❖ find_vma(),查找一个线性地址所属的线性区
➢ 两个参数:进程内存描述符的地址mm和线性地址addr
❖ find_vma_intersection(),查找一个与给定地址区间重叠 的线性区
❖ get_unmapped_area(),查找一个空闲的地址区间 ❖ insert_vm_struct(),向内存描述符链表中插入一个线性区 ❖ split_vma(),拆分线性区
}
内存描述符
内存描述符(续)
内存描述符(再续)
线性区(vm_area_struct)
1. 必须记录进程地址空间中哪些区域被使用了,而哪些区域空 闲。
2. 如果进程地址空间中的一个区域被分配给了进程,则内核会 创建一个对应的线性区,也叫虚拟内存区(VMA)
3. 属于同一个进程地址空间的线性区形成一个链表。 4. 不同的VMA绑定不同的访问权限和属性:可读、可写、可执
3. mmap链表中的一个节点vm_area_struct记录了实际分配的一个 内存区域。
5
进程描述符(task_struct)
struct task_struct {
ห้องสมุดไป่ตู้
/* these are hardcoded - don't touch */
volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
• 需要时动态申请,不需要时释放 • 不要求物理内存必须连续 • 回收暂时不用的页框(Ch.17)
2
进程地址空间管理2个原则
1. “先申请,后使用”“不用了,及时释放” 2. 尽量推迟物理内存的分配时机
3
内存描述符(mm_struct)
1. 每个进程都有自己独立的3GB的线性地址空间。该空 间不同的区域有不同的用途:代码区、全局数据区、 栈区、堆区…
创建一个线性区间
❖ mmap()和do_mmap(),创建一个线性区 include/linux/mm.h
static inline unsigned long do_mmap (struct file *file, unsigned long addr, unsigned long len, unsigned long prot, unsigned long flag, unsigned long offset)
13
如何实现进程地址空间动态内存分配
1. 查找进程虚拟地址空间是否存在大小合适的空闲区 域。
2. 如果有,则创建相应的线性区描述符vm_area_struct, 并将其插入链表mmap
3. 线性区创建成功后,立即返回(注意,没有分配相 应的物理页框,也没有修改页表!)
4. 当用户程序访问刚刚动态分配的内存时,会触发缺 页异常。
mmap内存映射
1. 利用mmap函数可以将一个磁盘文件或者其它设备对象映射到 虚拟内存空间。文件被映射到多个页上,所有页的大小之和 大于等于文件大小。
19
mmap内存映射
mm_struct
触发进程空间的内存动态分配的操作
1. 进程创建:fork,execv,clone 2. 扩充/紧缩堆内存:brk, sbrk 3. 创建文件内存映射或匿名映射:mmap, mremap,
munmap 4. 创建进程间共享内存:shmat, shmdt 5. 当用户堆栈不够用的时候,需要扩展堆栈 6. 上述操作都可能引起线性区数据结构的创建和删除。
➢ 根据file参数映射指定的文件中偏移量为offset,长度为len的一段内容 ➢ addr参数指明从何处开始查找一段可用的空闲线性地址区间 ➢ Prot参数指定这个区间所包含的页的存取权限 ➢ flags参数指定这个创建的线性区本身的一些标志
删除一个线性区间
❖ munmap()和do_munmap()
mm/mmap.c
➢ do_munmap()函数从进程地址空间中删除一段线性空 间
int do_munmap (struct mm_struct *mm, unsigned long addr, size_t len)
➢ mm参数指向了当前进程的内存描述符 ➢ addr参数为线性区的起始地址 ➢ len参数指明要删除的区间大小
long
counter;
long
priority;
…. … … … …
/* information */ struct fs_struct *fs;
/* open */ struct *files;
/* memory management info */
struct mm_struct *mm;
…. … … … …
Linux虚拟内存管理
进程地址空间
进程地址空间管理:管什么?
1. 管3GB的用户虚拟地址空间:
• 哪些区域被分配了,哪些区域是空闲的 • 被分配区域的用途、权限等属性信息
2. 页表的相应部分
• 需要创建映射时再创建页表,不需要时释放页表(而内核 空间对应的页表永不释放)
3. 被映射给进程的物理内存
行、私有、共享、锁定等。 5. 不同的VMA中存放了不同类型的数据:代码、全局变量、只
读数据、动态库… 6. 为了加速查找空闲虚拟内存区,Linux同时将同一进程的所有
线性区组织成一棵红黑树。 7. 线性区的开始和结束都必须4KB对齐
10
Virtual Memory Areas
与进程地址空间相关的数据结构
2. 与进程地址空间有关的全部信息都包含在一个叫内 存描述符的数据结构中。
4
相关的数据结构
1. task_struct用于描述一个进程, task_struct中有一个字段: struct mm_struct *mm;
2. mm_struct用于描述一个进程虚拟地址空间的布局。 mm_struct 中有一个字段mmap,指向了一个链表。 struct vm_area_struct *mmap
相关文档
最新文档