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

					2011$BG/(B01$B7n(B25$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-2010/2011-01-25
$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"!(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"!(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"!%"%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 resion$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
    include/linux/sched.h
    1163:	struct task_struct {
    ...
    1219:	        struct mm_struct *mm, *active_mm;
    ...
    1497:	};
    
    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

    include/linux/mm_types.h
     222:	struct mm_struct {
     223:	        struct vm_area_struct * mmap;           /* list of VMAs */
     224:	        struct rb_root mm_rb;
     225:	        struct vm_area_struct * mmap_cache;     /* last find_vma result */
    ...
     236:	        pgd_t * pgd;
     237:	        atomic_t mm_users;                      /* How many users with user space? */
     238:	        atomic_t mm_count;                      /* How many references to "struct mm_struct" (users count as 1) */
     239:	        int map_count;                          /* number of VMAs */
    ...
     243:	        struct list_head mmlist;                /* List of maybe swapped mm's.  These are globally strung
     244:	                                                 * together off init_mm.mmlist, and are protected
     245:	                                                 * by mmlist_lock
     246:	                                                 */
    ...
     254:	        unsigned long start_code, end_code, start_data, end_data;
     255:	        unsigned long start_brk, brk, start_stack;
     256:	        unsigned long arg_start, arg_end, env_start, env_end;
    ...
     289: };
    

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

     130:	struct vm_area_struct {
     131:	        struct mm_struct * vm_mm;       /* The address space we belong to. */
     132:	        unsigned long vm_start;         /* Our start address within vm_mm. */
     133:	        unsigned long vm_end;           /* The first byte after our end address
    ...
     136:	        /* linked list of VM areas per task, sorted by address */
     137:	        struct vm_area_struct *vm_next, *vm_prev;
    ...
     139:	        pgprot_t vm_page_prot;          /* Access permissions of this VMA. */
     140:	        unsigned long vm_flags;         /* Flags, see mm.h. */
     141:	
     142:	        struct rb_node vm_rb;
    ...
     171:	        const struct vm_operations_struct *vm_ops;
    ...
     174:	        unsigned long vm_pgoff;         /* Offset (within vm_file) in PAGE_SIZE
     175:	                                           units, *not* PAGE_CACHE_SIZE */
     176:	        struct file * vm_file;          /* File we map to (can be NULL). */
     177:	        void * vm_private_data;         /* was vm_pte (shared mem) */
    ...
     186:	};
    
    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$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

    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

    $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
    • offset: 11..0$B!#%Z!<%8Fb%*%U%;%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]; 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

    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()

    arch/x86/mm/fault.c
     948:	dotraplinkage void __kprobes
     949:	do_page_fault(struct pt_regs *regs, unsigned long error_code)
     950:	{
     951:	        struct vm_area_struct *vma;
     952:	        struct task_struct *tsk;
     953:	        unsigned long address;
     954:	        struct mm_struct *mm;
     955:	        int write;
     956:	        int fault;
     957:	
     958:	        tsk = current;
     959:	        mm = tsk->mm;
    ...
     962:	        address = read_cr2();
    ...
    1077:	        vma = find_vma(mm, address);
    1078:	        if (unlikely(!vma)) {
    1079:	                bad_area(regs, error_code, address);
    1080:	                return;
    1081:	        }
    1082:	        if (likely(vma->vm_start <= address))
    1083:	                goto good_area;
    1084:	        if (unlikely(!(vma->vm_flags & VM_GROWSDOWN))) {
    1085:	                bad_area(regs, error_code, address);
    1086:	                return;
    1087:	        }
    ...
    1100:	        if (unlikely(expand_stack(vma, address))) {
    1101:	                bad_area(regs, error_code, address);
    1102:	                return;
    1103:	        }
    ...
    1109:	good_area:
    1110:	        write = error_code & PF_WRITE;
    1111:	
    1112:	        if (unlikely(access_error(error_code, write, vma))) {
    1113:	                bad_area_access_error(regs, error_code, address);
    1114:	                return;
    1115:	        }
    ..
    1122:	        fault = handle_mm_fault(mm, vma, address, write ? FAULT_FLAG_WRITE : 0);
    ...
    1142:	}
    
    • $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
    • good_area $B$N>l9g!"=q$-9~$_$K4X$9$k%"%/%;%95v2D$,$"$k$+$r%A%'%C%/$9$k!#(B
    • handle_mm_fault() $B$r8F$S!"%Z!<%8%F!<%V%k$r:n$k!#(B

    $B"!(Bhandle_mm_fault()

    mm/memory.c
    3198:	int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma,
    3199:	                unsigned long address, unsigned int flags)
    3200:	{
    3201:	        pgd_t *pgd;
    3202:	        pud_t *pud;
    3203:	        pmd_t *pmd;
    3204:	        pte_t *pte;
    ...
    3216:	        pgd = pgd_offset(mm, address);
    3217:	        pud = pud_alloc(mm, pgd, address);
    3218:	        if (!pud)
    3219:	                return VM_FAULT_OOM;
    3220:	        pmd = pmd_alloc(mm, pud, address);
    3221:	        if (!pmd)
    3222:	                return VM_FAULT_OOM;
    3223:	        pte = pte_alloc_map(mm, pmd, address);
    3224:	        if (!pte)
    3225:	                return VM_FAULT_OOM;
    3226:	
    3227:	        return handle_pte_fault(mm, vma, address, pte, pmd, flags);
    3228:	}
    
    • $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()

    3142:	static inline int handle_pte_fault(struct mm_struct *mm,
    3143:	                struct vm_area_struct *vma, unsigned long address,
    3144:	                pte_t *pte, pmd_t *pmd, unsigned int flags)
    3145:	{
    3146:	        pte_t entry;
    ...
    3149:	        entry = *pte;
    ...
    3151:	                if (pte_none(entry)) {
    3152:	                        if (vma->vm_ops) {
    3153:	                                if (likely(vma->vm_ops->fault))
    3154:	                                        return do_linear_fault(mm, vma, address,
    3155:	                                                pte, pmd, flags, entry);
    3156:	                        }
    3157:	                        return do_anonymous_page(mm, vma, address,
    3158:	                                                 pte, pmd, flags);
    3159:	                }
    3160:	                if (pte_file(entry))
    3161:	                        return do_nonlinear_fault(mm, vma, address,
    3162:	                                        pte, pmd, flags, entry);
    3163:	                return do_swap_page(mm, vma, address,
    3164:	                                        pte, pmd, flags, entry);
    ...
    3193:	}
    
    • 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$H%U%#!<%k%I(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: 2011/01/24 18:06:16
    Yasushi Shinjo / <yas@is.tsukuba.ac.jp>