免费注册 查看新帖 |

Chinaunix

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

!请教有关vm_page_prot和vm_flags的用法! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-30 12:05 |只看该作者 |倒序浏览
在vm_area_struct中有两个参数  vm_page_prot和vm_flags。其中vm_page_prot用于对所映射区间的访问模式,有PROT_READ,PROT_WRITE,PROT_EXEC和PROT_NONE;vm_flags是vma的属性。

我想问的是vm_page_prot和vm_flags用的时候有没有关系呀,应该是有关系的把,我看到过有

vma->vm_page_prot = protection_map[flags & 0x0f];

好像是flags包含prot。那到底flags的结构是什么呀??

还有就是protection_map【】的具体定义是什么,在那里定义着呢?

谢谢了大虾们了!!

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
2 [报告]
发表于 2007-07-31 10:28 |只看该作者
pgprot_t protection_map[16] = {
        __P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111,
        __S000, __S001, __S010, __S011, __S100, __S101, __S110, __S111
};

其中,__P000 的意思是 P ( private),0 ( No Exec),0 ( No Write),0 ( No Read);
同理,__P001 的意思是 P ( private),0 ( No Exec),0 ( No Write),0 ( Read);
...................................................................................................................
...................................................................................................................
最后,__S111 的意思是 S ( Shared),1 (Exec),1 ( Write),1 ( Read);




你所看到的vma->vm_page_prot = protection_map[flags & 0x0f]等用法中,flags指的是
vm_area_struct -> vm_flags,其定义如下:

#define VM_READ                0x00000001        /* currently active flags */
#define VM_WRITE                        0x00000002
#define VM_EXEC                0x00000004
#define VM_SHARED        0x00000008

#define VM_MAYREAD        0x00000010        /* limits for mprotect() etc */
#define VM_MAYWRITE        0x00000020
#define VM_MAYEXEC        0x00000040
#define VM_MAYSHARE        0x00000080

#define VM_GROWSDOWN        0x00000100       
#define VM_GROWSUP        0x00000200
#define VM_SHM                0x00000400       
#define VM_DENYWRITE        0x00000800       
#define VM_EXECUTABLE        0x00001000
#define VM_LOCKED        0x00002000
#define VM_IO                        0x00004000 /* Memory mapped I/O or similar */

#define VM_DONTCOPY        0x00020000 /* Do not copy this vma on fork */
...................................................
...................................................


vm_flags的bit31 ~ bit4,主要在缺页异常时,由软件来判断这个vm_area是否堆栈,是否shmem.......
vm_flags的最后4个bit,指明了这个vm_area中的page是 private/shared?可否执行?可否写?可否读?既对应protection_map中的__P000 ~ __P111,__S000 ~ __S111。


在不同类型的CPU上,__P000 ~ __P111,__S000 ~ __S111对应不同的标志位。

在386的影射机制里,
exec权限虚设,
read权限用__PG_PRESENT来顶替,
write由__PG_RW位表示。
private/shared表示是否需要写时拷贝,private一律写时拷贝。对于这样的page,即使有write权限,也设为不可写。

论坛徽章:
0
3 [报告]
发表于 2007-07-31 12:13 |只看该作者

回复 #2 塑料袋 的帖子

哇,看起来好详细呀,谢谢袋子兄了,我先看看

论坛徽章:
0
4 [报告]
发表于 2007-08-01 19:06 |只看该作者

回复 #2 塑料袋 的帖子

有些不懂得地方

如果要把虚拟页面设成不可读写的。根据vm_page_prot中可以把页面设成~(PROT_READ|PROT_WRITE),而vm_flags中的VM_READ,VM_WRITE貌似也是这样的功能。。
他俩一样吗?

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
5 [报告]
发表于 2007-08-02 09:39 |只看该作者
vma->vm_page_prot = protection_map[vm_flags & 0x0f];


任何采用分页影射的CPU中,都有pgd,pte这样的结构。
同时,所有CPU的pte中,pte的后几bit都是作为page的属性位,表示page可否读,写,执行.....


protection_map[16]中的__P000,__P001........__S111,是对pte后几位的抽象描述。
而__P000,__P001........__S111这些宏定义,对应于不同的CPU,有不同的定义值,这些不同CPU上的不同定义值,是对pte后几位的实际描述。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP