Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
$B%a%b%j4IM}!"%"%I%l%96u4V!"%Z!<%8%F!<%V%k(B
[go: Go Back, main page]

$B%a%b%j4IM}!"%"%I%l%96u4V!"%Z!<%8%F!<%V%k(B

					2012$BG/(B01$B7n(B24$BF|(B
$B>pJs2J3XN`(B $B%*%Z%l!<%F%#%s%0%7%9%F%`(B II

                                       $BC^GHBg3X(B $B%7%9%F%`>pJs9)3X8&5f2J(B 
                                       $B%3%s%T%e!<%?%5%$%(%s%9@l96(B, $BEE;R!&>pJs9)3X7O(B
                                       $B?7>k(B $BLw(B
                                       <yas@is.tsukuba.ac.jp>

$B$3$N%Z!<%8$O!" http://www.coins.tsukuba.ac.jp/~yas/coins/os2-2011/2012-01-24
$B$"$k$$$O!" http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/

$B"#O"Mm;v9`(B

$BB46HM=Dj$N#4G/@8$KBP$9$kFCJLA]

$B"#:#F|$NBg;v$JOC(B

$B"#%f!<%6!&%W%m%;%9$N%a%b%j(B

$B"!%+!<%M%kFb$N%a%b%j3dEv$F(B($BA02s(B)

$B"!(BOS$B$K5a$a$i$l$k5!G=(B($B%*%Z%l!<%F%#%s%0%7%9%F%`(BI$BI|=,(B)

x86 $B$K$O!"$=$NB>!"(BMultics $BM3Mh$N!V%;%0%a%s%H!W$,$"$k!#(BLinux $BEy$NJ#?t%"!<(B $B%-%F%/%A%c$GF0:n$9$k(B OS $B$O!"(Bx86 $B0MB8$N5!G=$K$O0MB8$7$J$$7A$G@_7W$5$l$k!#(B

$B"!(BUnix$B$K$*$1$k%a%b%j$K4X$9$k%7%9%F%`!&%3!<%k$H%i%$%V%i%j(B

$B%7%9%F%`!&%3!<%k(B $B%i%$%V%i%j(B $B$=$NB>(B

$B"!(BUnix$B$K$*$1$k%W%m%;%9$N%"%I%l%96u4V$N4pK\E*$J9=B$(B

$B%F%-%9%H!

$B?^(B? $B%W%m%;%9$N%"%I%l%96u4V$N9=B$(B

$B"#(BLinux$B$K$*$1$k%f!<%6%W%m%;%9$N%"%I%l%96u4V$N

$B"!%"%I%l%96u4V$H%a%b%j!&%(%j%"(B

$BMxMQA[%"%I%l%9(B $B$r;H$C$F5!3#8lL?Na$rFI$_=P$7$?$j!"%G!<%?$rFI$_=q$-$9$k!#(B (x86 $B$G$O!"%;%0%a%s%F!<%7%g%s$b;H$($k$N$G!"@~7A$G$O$J$$%"%I%l%96u4V$b2D(B $BG=$@$,!"(BLinux $B$G$O!"B>$N%"!<%-%F%/%A%c$H$N7s$M9g$$$b$"$j!"@~7A$J6u4V$r(B $B;H$&!#(B)

$B@~7A$J%"%I%l%96u4V$O!"%a%b%j!&%(%j%"(B(memory area)($B$^$?$O!"(Bmemory region$B!"(Bmemory interval)$B$KJ,3d$5$l$k!#(B

$B"!(Btask_struct$B9=B$BN$H(Bmm_struct$B9=B$BN(B

$B%+!<%M%kFb$G$O!"%W%m%;%9$N%a%b%j$O!"
  • $B9=B$BN(B task_struct: 1$B%W%m%;%9$G(B1$B8D!#(B
  • $B9=B$BN(B mm_struct: $BIaDL!"(B1$B%W%m%;%9$G(B1$B8D!#(B($BJ#?t%W%m%;%9$G6&M-$5$l$F$$$k$3$H$,$"$k!#(B)
  • $B9=B$BN(B vm_area: 1$B%W%m%;%9$GJ#?t!#(B
    linux-3.1.3/include/linux/sched.h
    
    1220:	struct task_struct {
    ...
    1284:	        struct mm_struct *mm, *active_mm;
    ...
    1572:	};
    
    tast_struct $B$N(B mm $B%U%#!<%k%I(B

    task_struct$B!

    $B?^(B? $B%W%m%;%94XO"$N%a%b%j$N9=B$BN(B

    $B"!(Bmm_struct$B9=B$BN(B

    linux-3.1.3/include/linux/mm_types.h
    
     266:	struct mm_struct {
     267:	        struct vm_area_struct * mmap;           /* list of VMAs */
     268:	        struct rb_root mm_rb;
     269:	        struct vm_area_struct * mmap_cache;     /* last find_vma result */
    ...
     280:	        pgd_t * pgd;
     281:	        atomic_t mm_users;                      /* How many users with user space? */
     282:	        atomic_t mm_count;                      /* How many references to "struct mm_struct" (users count as 1) */
     283:	        int map_count;                          /* number of VMAs */
    ...
     288:	        struct list_head mmlist;                /* List of maybe swapped mm's.  These are globally strung
     289:	                                                 * together off init_mm.mmlist, and are protected
     290:	                                                 * by mmlist_lock
     291:	                                                 */
    ...
     299:	        unsigned long start_code, end_code, start_data, end_data;
     300:	        unsigned long start_brk, brk, start_stack;
     301:	        unsigned long arg_start, arg_end, env_start, env_end;
    ...
     365:	};
    

    $B"!(Bvm_area_struct$B9=B$BN(B

    linux-3.1.3/include/linux/mm_types.h
    
     178:	struct vm_area_struct {
     179:	        struct mm_struct * vm_mm;       /* The address space we belong to. */
     180:	        unsigned long vm_start;         /* Our start address within vm_mm. */
     181:	        unsigned long vm_end;           /* The first byte after our end address
     182:	                                           within vm_mm. */
     183:	
     184:	        /* linked list of VM areas per task, sorted by address */
     185:	        struct vm_area_struct *vm_next, *vm_prev;
     186:	
     187:	        pgprot_t vm_page_prot;          /* Access permissions of this VMA. */
     188:	        unsigned long vm_flags;         /* Flags, see mm.h. */
     189:	
     190:	        struct rb_node vm_rb;
    ...
     219:	        const struct vm_operations_struct *vm_ops;
    ...
     222:	        unsigned long vm_pgoff;         /* Offset (within vm_file) in PAGE_SIZE
     223:	                                           units, *not* PAGE_CACHE_SIZE */
     224:	        struct file * vm_file;          /* File we map to (can be NULL). */
     225:	        void * vm_private_data;         /* was vm_pte (shared mem) */
    ...
     233:	};
    
    vm_area_struct$B$N(Bvm_flags$B$NCM(B(include/linux/mm.h)
    $B%U%i%0(B$B@bL@(B
    VM_READ $BFI$_9~$_2D(B
    VM_WRITE $B=q$-9~$_2D(B
    VM_EXEC $B
    VM_SHARED $B6&M-$5$l$F$$$k(B
    VM_GROWSDOWN $B%"%I%l%9$,>.$5$$J}$K?-$S$k(B
    VM_GROWSUP $B%"%I%l%9$,Bg$-$$J}$K?-$S$k(B
    VM_DENYWRITE $B=q$-9~$_IT2D!#(B
    VM_EXECUTABLE $B
    VM_LOCKED $B%m%C%/$5$l$F$$$k!#(B
    VM_DONTCOPY $B%3%T!
    VM_DONTEXPAND $B3HD%IT2D!#(B

    $B"!%W%m%;%9$N%"%I%l%96u4V$N

    $B%W%m%;%9$N%"%I%l%96u4V(B $B$O!"

    mm_struct$B!

    $B?^(B? $B%W%m%;%9$N%"%I%l%96u4V$N

    • $B3FNN0h$K$O!"(Bstruct vm_area_struct $B$,BP1~$7$F$$$k!#(B
    • $B%F%-%9%H$H%G!<%?(B($B=i4|CMIU$-(B)$B$O!"(Bvm_area_struct $B$r7PM3$7$F!" BSS$B!"%R!<%W!"%9%?%C%/$O!"%U%!%$%k$H7k$S$D$$$F$$$J$$!#:G=i$K%"%/%;(B $B%9$5$l$?;~$K!"(B0 $B$GKd$a$i$l$?%Z!<%8!&%U%l!<%`(B(anonymous page)$B$,3d$jEv$F(B $B$i$l$k!#(B
    $B3FNN0h$O!"
    $B%F%-%9%H(B
    $B5!3#8l$rCV$/!#(BVM_EXEC $BB0@-$H(B VM_READ$BB0@-$,IU$$$F$$$k!#=q$-9~$_6X;_(B $B$G6&M-2DG=!#(Bmm_struct $B$N(B start_code $B$H(B end_code $B$,!"3+;OHVCO$H=*N;HVCO(B $B$rJ];}$9$k!#(B
    $B%G!<%?(B($B=i4|CMIU$-(B)
    $B%G!<%?$rCV$/!#(BVM_READ|VM_WRITE $BB0@-$,IU$$$F$$$k(B($B0J2 BSS($B=i4|CML5$7%G!<%?(B)
    0 $B$G=i4|2=$5$l$k%G!<%?$rCV$/!#%U%!%$%k$K=i4|CM$,4^$^$l$J$$!#(B
    $B%R!<%W(B
    $B%G!<%?$rCV$/!#(Bmalloc() $B$N86;q(B($B$N#1$D(B)$B!#(Bbrk() $B$d(B sbrk() $B%7%9%F%`!&(B $B%3!<%k$GBg$-$5$,JQ99$5$l$k!#HVCO$,Bg$-$$J}$K?-$S$k!#(Bmm_struct $B$N(B start_brk $B$H(Bbrk $B$,3+;OHVCO$H=*N;HVCO$rJ];}$9$k!#(B
    $B%9%?%C%/(B
    $B4X?t8F$S=P$7$N%9%?%C%/$,CV$+$l$k!#%9%?%C%/!&%]%$%s%?$,;X$9!#6I=jJQ(B $B?t$d4X?t$NLa$jHVCO$,CV$+$l$k!#%9%?%C%/%]%$%s%?$,2<8B$r1[$($F>.$5$/$J$k(B $B$H!"<+F03HD%$5$l$k$3$H$,$"$k$k(B

    $B"!%W%m%;%9$N%"%I%l%96u4V$N%l%$%"%&%H(B($BF0E*%j%s%/%i%$%V%i%j(B)

    $B85$N$K!"F0E*%j%s%/!&%i(B $B%$%V%i%j$KM3Mh$9$k%F%-%9%H$d%G!<%?$N$?$a$N%a%b%j!&%(%j%"$,:n$i$l$k!#(B /proc/PID/maps $B$H$$$&%U%!%$%k$r8+$k$H!"$=$NMM;R$,J,$+$k!#(B
    $ echo $$ [$B
    3981
    $ ls /proc/$$ [$B
    attr             cpuset   fd        maps        oom_adj    smaps   task
    auxv             cwd      io        mem         oom_score  stat    wchan
    cmdline          environ  limits    mounts      root       statm
    coredump_filter  exe      loginuid  mountstats  schedstat  status
    $ cat /proc/$$/maps  [$B
    00110000-00114000 r-xp 00000000 08:02 490576     /lib/libnss_dns-2.5.so
    00114000-00115000 r--p 00003000 08:02 490576     /lib/libnss_dns-2.5.so
    00115000-00116000 rw-p 00004000 08:02 490576     /lib/libnss_dns-2.5.so
    ...
    08047000-080f5000 r-xp 00000000 08:02 481554     /bin/bash
    080f5000-080fa000 rw-p 000ae000 08:02 481554     /bin/bash
    080fa000-080ff000 rw-p 080fa000 00:00 0 
    09d66000-09e25000 rw-p 09d66000 00:00 0          [heap]
    ...
    bffdd000-bfff2000 rw-p bffe9000 00:00 0          [stack]
    $ wc /proc/$$/maps  [$B
    45 263 2920 /proc/3981/maps
    $ []
    
    /proc/PID/maps $B$N%U%#!<%k%I$N0UL#(B
    1. $B%a%b%j!&%;%0%a%s%H$N3+;OHVCO$H=*N;HVCO!#(B
    2. $B%"%/%;%95v2D!#(Br(read), w(write), x(executable), p(private), s(shared)
    3. $B%*%U%;%C%H(B
    4. $B%V%m%C%/!&%G%P%$%9$N%a%8%c!l9g$K$O!"(B00:00 $B$K$J$k!#(B
    5. $B%U%!%$%k$N(Binode$BHV9f!#(B
    6. $B%U%!%$%kL>!#(B
    $B%V%m%C%/!&%G%P%$%9$K$O!"%a%8%c!$OITMW$@$,!"(B/proc/PID/maps $B$G$O!"?M4V$K$H$C$F(B $BJ,$+$j$d$9$$$h$&$K$o$6$o$6I=<($7$F$$$k!#(B

    $B%V%m%C%/!&%G%P%$%9$N%a%8%c! $ ls -l /dev/sda2 [$B brw-r----- 1 root disk 8, 2 Jan 24 12:00 /dev/sda2 $ [] $B%U%!%$%k$N(B inode $BHV9f$O!"(Bls -i $B$G$o$+$k!#(B

    $ ls -li /bin/bash [$B
    481554 -rwxr-xr-x 1 root root 735004 Jan 22  2009 /bin/bash
    $ ls -li /lib/libnss_dns-2.5.so [$B
    490576 -rwxr-xr-x 1 root root 21948 Oct 26 08:16 /lib/libnss_dns-2.5.so
    $ []
    

    $B"#%Z!<%8%F!<%V%k(B

    $B"!2>A[%"%I%l%9$HJ*M}%"%I%l%9(B

    • $B%a%b%j$K$O!"J*M}%"%I%l%9$,$U$i$l$F$$$k!#(B
    • $B%f!<%6!&%W%m%;%9$,A[%"%I%l%9(B(virtual address) $B$r(B $B=PNO$9$k!#(B
    • $B2>A[%"%I%l%9$N$&$A!">e0L$O!"(BMMU (MMU) $B$K$h$jJQ49$9$k!#(B
    • $B2>A[%"%I%l%9$N$&$A!"2<0L(B($B%Z!<%8%5%$%:J,(B)$B$O!"$=$N$^$^%a%b%j$KAw$i$l$k!#(B
    MMU $B$K$h$kJQ49J}K!$O!"%Z!<%8%F!<%V%k$KJ]B8$5$l$k!#(B

    CPU$B!

    $B?^(B? MMU$B$K$h$k2>A[%"%I%l%9$+$iJ*M}%"%I%l%9$X$NJQ49(B

    $B"!(B1$BCJ$N%Z!<%8!&%F!<%V%k(B

    $B2>A[%"%I%l%9$N9=@.$N(B $BNc(B$B!#(B 1$B%Z!<%8$,(B4KB (4096, 0x1000)$B$G!"2>A[%"%I%l%9$,(B32$B%S%C%H$N;~!#(B
    • p: 31..12$B%S%C%H!#%Z!<%8%F!<%V%k$N%$%s%G%C%/%9(B (20$B%S%C%H(B)
    • offset: 11..0$B!#%Z!<%8Fb%*%U%;%C%H(B (12$B%S%C%H(B)

    p(20$B%S%C%H(B)+offset

    $B?^(B? 1$BCJ$N%Z!<%8%F!<%V%k(B

    $B%Z!<%8%F!<%V%k$O!" unsigned int page_table[0x100000]; $B$3$NG[Ns$NMWAG$O!"%Z!<%8!&%U%l!<%`$N@hF,HVCO(B($BJ*M}%"%I%l%9(B)$B!#(B

    MMU($B%O!<%I%&%'%"(B) $B$O!"$3$N%Z!<%8%F!<%V%k$r;H$C$F!"A[%"(B $B%I%l%9$+$iJ*M}%"%I%l%9$r5a$a$k!#0J2<$O!"(BMMU $B$NF0$-$r(B C $B8@8l$G@bL@$7$?$b(B $B$N!#(B

    unsigned long int physical_address( unsigned long int virtual v ) {
        unsigned long int p, page, offset;
        p = v >> 12;         // 32$BCf!">e0L(B20$B%S%C%H(B(32-12==20)$B$N
    
    
    
    

    mm_struct$B!

    $B?^(B? 1$BCJ$N%Z!<%8%F!<%V%k(B

    $BCm0U(B: $BGr$$ItJ,$O!"(B0 $B$,F~$C$F$$$k!#(B0 $B$NItJ,$O!"%Z!<%8!&%U%l!<%`$,3d$jEv(B $B$F$i$l$F$$$J$$$3$H$r0UL#$9$k!#(B0 $B$rJ];}$9$k$?$a$K$b!"%a%b%j$,I,MW$G$"$k!#(B

    page_table[] $B$O!"(B0x100000 $B8D(B == 1024 * 1024 $B8D(B == 1M $B8D$NMWAG$+$i$J$k!#(B 1$BMWAG$,(B 4 $B%P%$%H(B(32$B%S%C%H(B) $B$J$i!"(B4MB $B$N%a%b%j$,I,MW$K$J$k!#(B

    $B"!B?CJ$N%Z!<%8!&%F!<%V%k(B

    $B

    $B2>A[%"%I%l%9$N9=@.$N(B $BNc(B$B!#(B 1$B%Z!<%8$,(B4KB$B!"2>A[%"%I%l%9$,(B32$B%S%C%H$N;~$NJ,3d$NNc(B($BB>$NJ,3dJ}K!$b9M$($i(B $B$l$k(B)

    • p: 31..27$B%S%C%H!#(BPGD$B$N%$%s%G%C%/%9(B(5$B%S%C%H(B)
    • q: 26..22$B%S%C%H!#(BPUD$B$N%$%s%G%C%/%9(B(5$B%S%C%H(B)
    • r: 21..17$B%S%C%H!#(BPMD$B$N%$%s%G%C%/%9(B(5$B%S%C%H(B)
    • s: 16..12$B%S%C%H!#(Bpt$B$N%$%s%G%C%/%9(B(5$B%S%C%H(B)
    • offset: 11..0$B%S%C%H!#%Z!<%8Fb%*%U%;%C%H(B(12$B%S%C%H(B)

    5+5+5+5+12

    $B?^(B? $B2>A[%"%I%l%9$N(B4$B$D$NItJ,$X$NJ,3dNc(B

    mm_struct$B!

    $B?^(B? 4$BCJ$N%Z!<%8%F!<%V%k(B

    • PGD: Page Global Directory
    • PUD: Page Upper Directory
    • PMD: Page Middle Directory
    • Page Table Entry$B$NG[Ns(B (pte $B$NG[Ns(B)
    unsigned int pgd[0x20];
    
    unsigned long int physical_address( unsigned long int virtual v ) {
        unsigned int *pud, *pmd, *pte, p, q, r, s, page, offset;
        p = v >> (32-5) ;
        q = (v >> (32-10)) & 0x1f;
        r = (v >> (32-15)) & 0x1f;
        s = (v >> (32-20)) & 0x1f;
        offset = v & 0xfff;
        pud = pgd[p];
        pmd = pud[q];
        pte = pmd[r];
        page = pte[s]
        return( page + offset );
    }
    

    $B"!(Bx86$B$N%Z!<%8!&%F!<%V%k(B

    x86 $B$G$O!"=>Mh!"(B2$BCJ$N%Z!<%8%F!<%V%k$rMQ$$$F$$$k!#
  • p $B$,(B 10 $B%S%C%H(B (31..22$B%S%C%H(B)
  • q $B$,(B 0 $B%S%C%H(B
  • r $B$,(B 0 $B%S%C%H(B
  • s $B$,(B 10 $B%S%C%H(B (21..12$B%S%C%H(B)
  • offset $B$,(B 12 $B%S%C%H(B (11..0$B%S%C%H(B)

    10+12+12

    $B?^(B? $B2>A[%"%I%l%9$N(B3$B$D$NItJ,$X$NJ,3dNc(B

    mm_struct$B!

    $B?^(B? x86$B$N(B2$BCJ$N%Z!<%8%F!<%V%k(B

    $B"!(Bx86$B$N%Z!<%8!&%F!<%V%k(B(PAE$BM-8z(B)

    x86 $B$G(B PAE$B!J(BPhysical Address Extension)$B$,M-8z$N;~$K$O!"A[%"%I%l%9$O!"(B32$B%S%C%H$G$"$k$,!"J*M}%"%I%l%9$O!"(B36$B%S%C%H$^$G;H$($k$h$&$K$J$k!#(B
    • p $B$,(B 2 $B%S%C%H(B
    • q $B$,(B 0 $B%S%C%H(B
    • r $B$,(B 9 $B%S%C%H(B
    • s $B$,(B 9 $B%S%C%H(B
    • offset $B$,(B 12 $B%S%C%H(B

    $B"#%Z!<%8!&%U%)!<%k%H(B

    $B%a%b%j$,3d$jEv$F$i$l$F$$$J$$>l=j$r%W%m%;%9$,%"%/%;%9$7$?;~$K$O!"%Z!<%8!&(B $B%U%)!<%k%H$,H/@8$9$k!#(B
    • $B@5$7$$%"%I%l%9$r:G=i$K%"%/%;%9$7$?>l9g(B
      • $B%Z!<%8%F!<%V%k$,$J$1$l$P:n$k!#(B
      • $B%Z!<%8!&%U%l!<%`$,3d$jEv$F$i$l$F$$$J$1$l$P!"3d$jEv$F$k!#(B
      • $B%U%!%$%k$HBP1~$7$F$$$l$P!"%U%!%$%k$+$iFbMF$rFI$_9~$`!#(B $BBP1~$7$F$$$J$1$l$P!"(B0 $B$GKd$a$k!#(B
    • $B@5$7$$%"%I%l%9$r#22sL\0J9_$K%"%/%;%9$7$?>l9g(B
      • $B%Z!<%8%$%s$N=hM}$r9T$&(B
    • $BIT@5$J%"%I%l%9$r%"%/%;%9(B
      • $B%(%i!<(B(EFAULT$BEy(B) $B$G%W%m%;%9$r=*N;$5$;$k(B
    $B4X?t(Bdo_page_fault() $B$,$3$N$h$&$J=hM}$r9T$&!#$3$N4X?t$O!"8"8B30$N%"%/%;(B $B%9!"$?$H$($P!"=q$-9~$_6X;_$N%a%b%j$K=q$-9~$_$r;n$_$?>l9g$N%(%i!<$b=hM}(B $B$9$k!#(B

    $B"!(Bx86 do_page_fault()

    linux-3.1.3/arch/x86/mm/fault.c
    
     987:	dotraplinkage void __kprobes
     988:	do_page_fault(struct pt_regs *regs, unsigned long error_code)
     989:	{
     990:	        struct vm_area_struct *vma;
     991:	        struct task_struct *tsk;
     992:	        unsigned long address;
     993:	        struct mm_struct *mm;
     994:	        int fault;
     995:	        int write = error_code & PF_WRITE;
     996:	        unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE |
     997:	                                        (write ? FAULT_FLAG_WRITE : 0);
     998:	
     999:	        tsk = current;
    1000:	        mm = tsk->mm;
    ...
    1003:	        address = read_cr2();
    ...
    1119:	        vma = find_vma(mm, address);
    ...
    1120:	        if (unlikely(!vma)) {
    1121:	                bad_area(regs, error_code, address);
    1122:	                return;
    1123:	        }
    1124:	        if (likely(vma->vm_start <= address))
    1125:	                goto good_area;
    1126:	        if (unlikely(!(vma->vm_flags & VM_GROWSDOWN))) {
    1127:	                bad_area(regs, error_code, address);
    1128:	                return;
    1129:	        }
    ...
    1142:	        if (unlikely(expand_stack(vma, address))) {
    1143:	                bad_area(regs, error_code, address);
    1144:	                return;
    1145:	        }
    ...
    1151:	good_area:
    1152:	        if (unlikely(access_error(error_code, vma))) {
    1153:	                bad_area_access_error(regs, error_code, address);
    1154:	                return;
    1155:	        }
    ...
    1162:	        fault = handle_mm_fault(mm, vma, address, flags);
    ...
    1195:	}
    
    • $B%O!<%I%&%'%"0MB8$N%3!<%I!#(Barch/x86 $B$N2<$K$"$k!#(B
    • tsk $B$K8=:_ mm $B$K8=:_ Linux $B%+!<%M%k$K=P$F$/$k(B likely() $B$d(B unlikely() $B$O!"9bB.2=$N$?$a$N(B $B%R%s%H$J$N$G!"0UL#$rGD0.$9$k;~$K$OB8:_$7$J$$$b$N$H$7$F$h$$!#(B
    • x86 $B$N(B cr2 (control register 2) $B$K!"%Z!<%8!&%U%)!<%k%H$,@8$8$?(B $B%"%I%l%9$,4^$^$l$F$$$k!#(B
    • find_vma() $B$G!"(Bvm_area_struct $B$rC5$9!#8+$D$+$i$J$1$l$P!"(B bad_area()$B!#(Bfind_vma() $B$O!"%-%c%C%7%c$d(B red-black tree $B$r;H$C$F9bB.$K(B vm_area_struct $B$rC5$9!#(B
    • $BIaDL$O!"(Bvma->vm_start $B$h$j$b(B address $B$OBg$-$$!#(B
    • $B%9%?%C%/$K$D$$$F$O!"(Bvm_flags $B$N(B VM_GROWSDOWN $B%S%C%H$,(B $BN)$C$F$$$k!#(B
    • $B$=$N>l9g$O!"%9%?%C%/$N(B vma $B$r<+F0E*$K3HD%$9$k!#(B
    • handle_mm_fault() $B$r8F$S!"%Z!<%8%F!<%V%k$r:n$k!#(B

    $B"!(Bhandle_mm_fault()

    linux-3.1.3/mm/memory.c
    
    3442:	int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma,
    3443:	                unsigned long address, unsigned int flags)
    3444:	{
    3445:	        pgd_t *pgd;
    3446:	        pud_t *pud;
    3447:	        pmd_t *pmd;
    3448:	        pte_t *pte;
    ...
    3461:	        pgd = pgd_offset(mm, address);
    3462:	        pud = pud_alloc(mm, pgd, address);
    3463:	        if (!pud)
    3464:	                return VM_FAULT_OOM;
    3465:	        pmd = pmd_alloc(mm, pud, address);
    3466:	        if (!pmd)
    3467:	                return VM_FAULT_OOM;
    ...
    3501:	        pte = pte_offset_map(pmd, address);
    3502:	
    3503:	        return handle_pte_fault(mm, vma, address, pte, pmd, flags);
    3504:	}
    
    • $B%Z!<%8%F!<%V%k$r(B pgd, pud, pmd, pte $B$N=g$K3d$jEv$F$F$$$/!#(B
    • $B:G8e$K(B pte $B$N(B1$B%(%s%H%j$r(B handle_pte_fault() $B$G:n$k!#(B

    $B"!(Bhandle_pte_fault()

    linux-3.1.3/mm/memory.c
    3386:	int handle_pte_fault(struct mm_struct *mm,
    3387:	                     struct vm_area_struct *vma, unsigned long address,
    3388:	                     pte_t *pte, pmd_t *pmd, unsigned int flags)
    3389:	{
    3390:	        pte_t entry;
    ...
    3393:	        entry = *pte;
    ...
    3395:	                if (pte_none(entry)) {
    3396:	                        if (vma->vm_ops) {
    3397:	                                if (likely(vma->vm_ops->fault))
    3398:	                                        return do_linear_fault(mm, vma, address,
    3399:	                                                pte, pmd, flags, entry);
    3400:	                        }
    3401:	                        return do_anonymous_page(mm, vma, address,
    3402:	                                                 pte, pmd, flags);
    3403:	                }
    3404:	                if (pte_file(entry))
    3405:	                        return do_nonlinear_fault(mm, vma, address,
    3406:	                                        pte, pmd, flags, entry);
    3407:	                return do_swap_page(mm, vma, address,
    3408:	                                        pte, pmd, flags, entry);
    ...
    3437:	}
    
    • pte $B$,$^$C$5$i(B($B=i$a$F%"%/%;%9$5$l$?(B)
      • vma->vm_ops->fault $B$H$$$&4X?t$,$"$l$P!"(B do_linear_fault() $B$G=hM}$9$k!#(B
      • $BL5$1$l$P!"(Bdo_anonymous_page() $B$G=hM}!#(B 0 $B$G=i4|2=$5$l$?%Z!<%8$r3d$jEv$F$k!#(B
    • pte $B$,$^$C$5$i$G$O$J$$(B
      • do_swap_page() $B$G%Z!<%8%$%s!#(B $B%G%#%9%/$+$i#1%Z!<%8FI$_=P$9!#(B

    $B"#%/%$%:(B5 $B%a%b%j4IM}!"%"%I%l%96u4V!"%Z!<%8%F!<%V%k(B

    $B!zLdBj(B(501) /proc/PID/maps

    /proc/PID/maps$B$NFbMF$O!"$3$N%Z!<%8$NCf$G$I$N9=B$BN$N%j%9%H$rI=<($7$?$b$N$H(B $B9M$($i$l$k$+!#
  • $B%j%9%H$N5/E@$rJ];}$7$F$$$k9=B$BN$NL>A0(B
  • $B%j%9%H$N5/E@$rJ];}$7$F$$$k9=B$BN$NCf$N%U%#!<%k%IL>(B
  • $B%j%9%H$K$D$J$,$l$F$$$k9=B$BN$NL>A0(B

    $B!zLdBj(B(502) 1$BCJ$N%Z!<%8%F!<%V%k(B

    $B2>A[%"%I%l%9$N%5%$%:$,(B32$B%S%C%H!"(B1$B%Z!<%8$NBg$-$5$,(B4KB$B$H$9$k!#(B $B
  • 0x00000000 $B$+$i(B 0x00000fff $B$^$G(B
  • 0x00001000 $B$+$i(B 0x00001fff $B$^$G(B
  • 0xfffff000 $B$+$i(B 0xffffffff $B$^$G(B 1$BCJ$N%Z!<%8%F!<%V%k$rMQ$$$F$$$?>l9g!"%Z!<%8%F!<%V%k$KI,MW$J%a%b%j$O2?%P(B $B%$%H$K$J$k$+!#%Z!<%8%F!<%V%k$N(B1$B%(%s%H%j$N%P%$%H$O!"(B4$B%P%$%H$H$9$k!#(B $B$J$*!"KvC<$N%Z!<%8!&%U%l!<%`$KI,MW$J%a%b%j(B($B$3$N>l9g$O!"(B3$B%Z!<%8!"(B12KB)$B$O!"(B $B%Z!<%8%F!<%V%k$KI,MW$J%a%b%j$G$O$J$$$N$G!"7W;;$KF~$l$J$$!#(B

    $B!zLdBj(B(503) 2$BCJ$N%Z!<%8%F!<%V%k(B

    $BLdBj(B(502) $B$G!"$B!V(Bx86$B$N%Z!<%8!&%F!<%V%k!W(B$B$HF1$8(B) $B$rMQ$$$F$$$?$H$9$k!#(B
    • 1$BCJL\(B: 31..22$B%S%C%H(B ($B>e0L(B10$B%S%C%H(B)
    • 2$BCJL\(B: 21..12$B%S%C%H(B
    • $B%*%U%;%C%H(B: $B2<0L(B12$B%S%C%H(B (11..0$B%S%C%H(B)
    $B$3$N;~!"%Z!<%8%F!<%V%k$KI,MW$J%a%b%j$O2?%P%$%H$K$J$k$+!#%Z!<%8%F!<%V%k(B $B$N(B1$B%(%s%H%j$N%P%$%H$O!">e0L$N%Z!<%8%F!<%V%k$b2<0L$N%Z!<%8%F!<%V%k$b(B4$B%P(B $B%$%H$H$9$k!#(B
    Last updated: 2012/02/07 17:26:15
    Yasushi Shinjo / <yas@is.tsukuba.ac.jp>