免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1034 | 回复: 0
打印 上一主题 下一主题

lab2:page_insert/remove [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-18 00:36 |只看该作者 |倒序浏览

存储管理容易把人高糊涂
pgdir_walk
对一个线性地址,查找其在页表内的页表项的指针地址(这个指针是虚拟地址) 
查找两级页目录/表,需要注意虚拟地址/线性地址和物理地址。如果使用指针访问,要使用虚拟地址,如果不是,可以使用KADDR()或者page2kva()等进行转换;如果是在页目录/表里的某一项,它是物理地址,可以使用PTE_ADDR()取出地址。
在当页表不存在时,需要创建页表的时候,注意使用memset进行初始化(使用虚拟地址),否则有可能通不过assert(PTE_ADDR(boot_pgdir[0]) == page2pa(pp0));
page_insert
将物理地址映射到线性地址,如果该线性地址已经被映射过,则删除先前的映射
使用pgdir_walk查找线性地址的页表项指针,然后进行映射操作。这里需要注意的是应该首先把物理页的pp_ref加1,然后再进行删除先前的映射,删除时使用page_decref(),它对pp_ref进行减1操作,如果pp_ref减到0则释放页(加入空闲列表);如果先减后加,是会出问题的,assert(page_alloc(&pp)==-E_NO_MEM)通不过,考虑:当对同一个物理页面映射到同一个线性地址两次,先减(释放),可能物理页加到空闲列表,然后再加就会有问题,因为空闲列表是一个全局变量,如果在这个过程中有别人申请空间,那么使用到本不该被使用的页。
page_remove
页计数减1,减到0就把页添加到空闲列表。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/11545/showart_1866604.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP