linux进程地址空间

进程地址空间:进程可寻址的虚拟内存,平坦(独立且连续),一般每个进程都有唯一一个
段地址空间:非独立线性区域,被分段,不大使用。
进程可寻址4GB的虚拟内存,能寻址但不一定能访问,可被合法访问的地址区间叫内存区域

mm_struct(内存描述符): 含内存区域的链表(高效遍历,按地址增长方向排序)和红黑树(搜索指定区域),最近使用的内存区域(mmap_cache),页全局目录(pgd)等
内核线程:没有mm_struct,使用前一个进程的mm(active_mm)
(虚拟)内存区域:vm_area_struct, VMA, 描述地址空间 [ vm_start,vm_end),拥有一致属性(如访问权限)
内存区域:代码段(代码的内存映射),数据段(全局变量),用户空间栈,内存映射文件等等

find_vma():用于定位地址addr在哪个vma内,但实际找到的是第一个vm_end大于addr的vma(addr可能不在任何vma内,故返回的vma不一定包含addr)
实现:先看是否在mmap_cache内,不在的话红黑树寻找。

find_vma_prev():搜索第一个vm_end小于addr的内存区域
find_vma_intersection(): 返回第一个和指定地址区间相交的vma

mmap(): 创建一个新的线性地址区间,新区间和已有区间相邻且有相同访问权限,两区间合一(没有新建vm_area_struct),否则新建vma
文件映射:指定file(打开的文件)和offset(文件的偏移位置)
匿名映射:不指定file和offset
munmap(): 从进程地址空间删除指定区间(start,len)

页表:linux三级页表,页表太长不利于地址转换时的存放和搜索,所以考虑多级页表
顶级页表是页全局目录(PGD),二级页表是中间页目录(PMD),最后一级页表就叫页表,指向物理页面。通过mm_struct的pgd进入页全局目录。
搜索页表多由硬件完成,存在缓冲器,先查看其中是否缓存了虚拟地址到物理地址的映射,没有再搜索页表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值