- 论坛徽章:
- 4
|
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权限,也设为不可写。 |
|