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}(B
[go: Go Back, main page]

$B%a%b%j4IM}(B

					2014$BG/(B01$B7n(B09$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@cs.tsukuba.ac.jp>

$B$3$N%Z!<%8$O!" http://www.coins.tsukuba.ac.jp/~yas/coins/os2-2013/2014-01-09
$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$k!VFCJLA$B"#:#F|$NBg;v$JOC(B

$B"#%a%b%j4IM}(B

$B"!L\I8(B

struct page$B$X$N%]%$%s%?$,F@$i$l$?>l9g!"%a%b%j$O3d$jEv$F$i$l$F$$$k$,!"O@(B $BM}%"%I%l%9ITL@$J$N$G!"$=$N$^$^$G$O%W%m%0%i%`$G%"%/%;%9$G$-$J$$!#O@M}%"(B $B%I%l%9$,I,MW$J$i!"(Bvoid *page_address(page)$B$r;H$C$F(B struct page$B$X$N%]%$(B $B%s%?$+$i%"%/%;%92DG=$JO@M}%"%I%l%9$rF@$k$3$H$,$G$-$k!#(B

$B

  • __free_pages(page,order)
  • free_pages(addr, order)
  • free_page(addr)
    linux-3.12.6/include/linux/gfp.h
    
     331:	static inline struct page *
     332:	alloc_pages(gfp_t gfp_mask, unsigned int order)
    
     351:	extern unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order);
     352:	extern unsigned long get_zeroed_page(gfp_t gfp_mask);
    
     365:	extern void __free_pages(struct page *page, unsigned int order);
     366:	extern void free_pages(unsigned long addr, unsigned int order);
    
     374:	#define free_page(addr) free_pages((addr), 0)
    

    $B"!(Bgfp_t gfp_mask

    __get_free_pages(), alloc_pages(), alloc_page() $B$d!"(B $B8e=R$9$k(B kmalloc() $B$G$O!"(B gfp_t $B$N%U%i%0(B(gfp_mask) $B$H$7$F!"

    linux-3.12.6/include/linux/gfp.h
    $B7?(B $B@bL@(B
    GFP_ATOMIC $B9bM%@hEY!#%9%j!<%WIT2D!#3d9~$_=hM}$NA0H>(B($B3d$j9~$_%O%s%I%i!"(Btop half)$B$d8eH>(B(bottom half)$B$G;H$&!#(B
    GFP_NOIO $B%9%j!<%W2D!"F~=PNOIT2D!#(B
    GFP_NOFS $B%9%j!<%W2=!"F~=PNO2D!"%U%!%$%kA`:nIT2D!#%U%!%$%k%7%9%F%`$N$N%U%!%$%k%7%9%F%`$NA`:n$r3+;O$7$J$$(B)$B!#(B
    GFP_KERNEL $B%+!<%M%kMQ%a%b%jDL>o$NJ}K!!#%9%j!<%W2D!#%f!<%6!&%W%m%;%9$N%3%s%F%-%9%H$G;H$&!#(B
    GFP_USER $B%f!<%66u4VMQ$N%a%b%j$NDL>o$NJ}K!!#%9%j!<%W2D!#(B
    GFP_HIGHUSER HIGHMEM$B%>!<%s$+$i$N3dEv$F!#%9%j!<%W2D!#(B
    GFP_DMADMA$B%>!<%s$+$i$N3dEv$F!#%G%P%$%9!&%I%i%$%PEy$,;H$&!#(B
    $B$3$N$h$&$J%U%i%0$,B8:_$9$k:G$b=EMW$JM}M3$O!"%9%j!<%W$9$k2DG=@-$,$"$k$+(B $B$J$$$+$N0c$$!#(B $B$=$NB>$K!"$I$N%>!<%s$+$i%a%b%j$r3d$jEv$F$k$Y$-$+$rI=$9$b$N$,$"$k!#(B

    $B"!30It%U%i%0%a%s%F!<%7%g%s(B

    $BJ*M}%U%l!<%`$N3dEv$F$H3+J|$r7+$jJV$7$F$$$/$H!"30It%U%i%0%a%s%F!<%7%g%s(B (external fragmentation) $B$,@8$8$k!#A4BN$H$7$F$O6u$-%a%b%j$OB8:_$7$F$$$k(B $B$N$K!">.$5$J%a%b%j!&%U%l!<%`$,$"$A$3$A$KJ,;6$7$F$$$F!"Bg$-$5$N%Z!<%8%U(B $B%l!<%`$,B8:_$7$J$$$?$a$K%a%b%j$,3d$jEv$F$i$l$J$$>uBV$K4Y$k!#(B

    $B"!(BBuddy$B%7%9%F%`(B

    $B!V(BBuddy $B%7%9%F%`!W$O!"(BLinux $B$G;H$o$l$F$$$k30It%U%i%0%a%s%F!<%7%g%s$r5/(B $B$3$7$K$/$$%a%b%j3dEv$F%"%k%4%j%:%`!#(B

    zone$B!

    $B?^(B1(a) Buddy$B%7%9%F%`$K$h$k6u$-%Z!<%8$N4IM}(B($BO@M}E*$J8+J}(B)

    zone$B!

    $B?^(B1(b) Buddy$B%7%9%F%`$K$h$k6u$-%Z!<%8$N4IM}(B($B@~7A$J8+J}(B)

    $B"!(BBuddy$B%7%9%F%`$N>uBV(B

    /proc/buddyinfo $B$r8+$k$H!"8=:_$N6u$-%Z!<%8$N>uBV$,J,$+$k!#(B
    % cat /proc/buddyinfo [$B
    Node 0, zone      DMA      6      5      3      3      4      2      2      0      1      1      2 
    Node 0, zone   Normal    476   2577    990    354    174    104     65     34     19      1    135 
    Node 0, zone  HighMem   1416   2920   1718   1082    933    504    251    152     87     43     53 
    % []
    
    $B$3$NNc$G$O!"(BDMA $B%>!<%s$N(B 2 0 (4KB) $B$K!"(B6 $B8D!"(B 2 1 (8KB) $B$K!"(B5 $B8D!"!&!&!&!"(B2 10 $B$K(B2$B8D$N6u$-$,$"$k!#(B $B30It%U%i%0%a%s%F!<%7%g%s$,5/$-$k$H!"Bg$-$J2t$,>/$J$/$J$k!#(B

    $B"#(Bkmalloc$B$H(Bkfree

    $BJ*M}%a%b%j$O!"%Z!<%8C10L!J(B4KB$B$N%Z!<%8%U%l!<%`C10L!K$G4IM}$7$F$$$k!#(B $B$7$+$7!"%+!<%M%kFb$N%G!<%?9=B$$O!"(B4KB $B$K$T$C$?$j$O$^$i$J$$!#(B Linux $B$G%Z!<%8C10L$G$O$J$$C10L$G%a%b%j$r3NJ]!&3+J|$G$-$k$K$O!"
  • kmalloc(), kfree(): malloc(), free() $B$HN`;w$N(B API
  • $B%9%i%V!&%"%m%1!<%?(B

    $B"!(Bkmalloc()

    C$B8@8l$N%f!<%66u4V$G;H$($k%i%$%V%i%j(B malloc() $B$K;w$F$$$k!#(B
    void *kmalloc(size_t size, gfp_t flags)
    
    $B0z?t(B $B7k2L(B: $B:GDc8B!"(Bsize $BJ,$N%a%b%j$r3d$jEv$F!"$=$N@hF,$NHVCO!J%+!<%M%kFb$N2>(B $BA[%"%I%l%9!K$rJV$9!#3d$jEv$F$i$l$?%a%b%j$O!"J*M}E*$K$bO"B3$K$J$k!#3dEv(B $B$F$G$-$J$$;~$K$O!"(BNULL $B$rJV$9!#(B

    $B"!(Bkmalloc()$B$N%U%i%0$NA*Br(B

    $B>u67(B $B%U%i%0(B
    $B%W%m%;%9$N%3%s%F%-%9%H!"%9%j!<%W2DG=(B GFP_KERNEL
    $B%W%m%;%9$N%3%s%F%-%9%H!"%9%j!<%WIT2D(B GFP_ATOMIC
    $B3d9~$_%O%s%I%i(B GFP_ATOMIC
    $B3d9~$_%O%s%I%i8eH>(B(Softirq,Tasklet,$B8e=R(B) GFP_ATOMIC
    DMA$B2DG=$J%a%b%j!"%9%j!<%W2DG=(B GFP_DMA|GFP_KERNEL
    DMA$B2DG=$J%a%b%j!"%9%j!<%WIT2D(B GFP_DMA|GFP_ATOMIC

    $B"!(Bkfree()

    void kfree(const void *objp)
    
    C$B8@8l$N%f!<%66u4V$G;H$($k%i%$%V%i%j(B free() $B$H;w$F$$$k!#(B kmalloc() $B$G3d$jEv$F$?%a%b%j$r2rJ|$9$k!#(B

    $B"!(Bvmalloc()$B$H(Bvfree()

    kmallc()/kfree() $B$H;w$F$$$k$,!"3d$jEv$F$i$l$k%a%b%j$OJ*M}E*$KO"B3$7$F$$(B $B$kJ]>Z$O$J$$!#!J%+!<%M%k6u4V$N2>A[%"%I%l%9$H$7$F$OO"B3$7$F$$$k!#!K(B

    $B"#%9%i%V%"%m%1!<%?(B(slab allocator)

    $BF1$8Bg$-$5$N9=B$BN$r3d$jEv$F$k;~$K;H$&!#(B kmalloc(), kfree() $B$h$j$b!"8zN($,$h$$!#(B

    $B"!(Bfree list$BJ}<0$H$=$NLdBjE@(B

    $B9=B$BN$N3dEv$F$K$O!"(Bfree list $BJ}<0$,;H$o$l$k$3$H$b$"$k!#(B $B$3$NJ}K!$G$O!"%a%b%j$K6u$-$,$"$C$F$b!"2rJ|$G$-$k$+4JC1$K$O$o$+$i$J$$!#(B

    free list$B!

    $B?^(B? $B%U%j!<%j%9%H$NNc(B

    $B%*%V%8%'%/%H$O!"(B1$B%Z!<%8$K(B2$B8DF~$k!#(B $B%*%V%8%'%/%H$,
  • object 2
  • object 6
  • object 3
  • object 1

    free list$B!

    $B?^(B? $B%U%j!<%j%9%H$NNc(B($B%Z!<%8$r0U<1(B)

    object 2 $B$H(B object 3 $B$NItJ,$O!"(B1$B%Z!<%86u$$$F$$$k!#(B

    $B"!%9%i%V!&%"%m%1!<%?$NL\I8(B

    $B%9%i%V!&%"%m%1!<%?<+?H$O!"(Balloc_pages() $BEy$N%Z!<%8C10L$N%a%b%j3dEv$F(B $B5!G=$r8F=P$7$F%a%b%j$r3NJ]$9$k!#(B

    $B"!%Z!<%8!&%U%l!<%`!"%9%i%V!"%*%V%8%'%/%H$N4X78(B

    $B%Z!<%8%U%l!<%`#3$D!

    $B?^(B? $B%Z!<%8!&%U%l!<%`!"%9%i%V!"%*%V%8%'%/%H$N4X78(B

    $B"!(Bkmem_cache_create()

    struct kmem_cache *
    kmem_cache_create (const char *name, size_t size, size_t align,
            unsigned long flags, void (*ctor)(void *))
    
    $B0z?t(B $B7k2L(B: $B@.8y$7$?;~$K$O!"(Bstruct kmem_cache $B$X$N%]%$%s%?!#(B $B<:GT$9$k$H(BNULL$B!#?7$7$$%Z!<%8$,3d$jEv$F$i$l$?;~$K$O!"(Bctor $B$G(B $B;XDj$5$l$?4X?t$,8F$P$l$k!#(B

    $B"!(Bkmem_cache_destroy()

    void kmem_cache_destroy(struct kmem_cache *c)
    
    kmem_cache_create() $B$G3d$jEv$F$?(B struct kmem_cache *$B$r3+J|$9$k!#(B shutdown ($BEE8;$r@Z$kA`:n(B)$B$G8F$P$l$k$3$H$,$"$k!#(B

    $B"!(Bkmem_cache_alloc()$B$H(Bkmem_cache_free()

    void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)
    
    void *kmem_cache_alloc_node(struct kmem_cache *cachep,gfp_t flags, int node)
    
    void kmem_cache_free(struct kmem_cache *cachep, void *b)
    
    $B@8@.$7$?(B struct kmem_cache *$B$r;H$C$F%*%V%8%'%/%H$N%a%b%j$r3d$jEv$F$k!#(B $B3d$jEv$F$?%*%V%8%'%/%H$N%a%b%j$O!"(Bkmem_cache_free()$B$G3+J|$9$k!#(B

    kmem_cache_alloc_node() $B$O!"%a%b%j!&%"%/%;%9$,IT6Q$B"!MxMQNc(B(task_struct)

    linux-3.12.6/kernel/fork.c
    
     123:	static struct kmem_cache *task_struct_cachep;
    
     252:	void __init fork_init(unsigned long mempages)
     253:	{
    ...
     259:	        task_struct_cachep =
     260:	                kmem_cache_create("task_struct", sizeof(struct task_struct),
     261:	                        ARCH_MIN_TASKALIGN, SLAB_PANIC | SLAB_NOTRACK, NULL);
    ...
     284:	}
    
     125:	static inline struct task_struct *alloc_task_struct_node(int node)
     126:	{
     127:	        return kmem_cache_alloc_node(task_struct_cachep, GFP_KERNEL, node);
     128:	}
     129:	
     130:	static inline void free_task_struct(struct task_struct *tsk)
     131:	{
     132:	        kmem_cache_free(task_struct_cachep, tsk);
     133:	}
    

    $B"!(B/proc/slabinfo

    /proc/slabinfo $B$r8+$k$H!"%9%i%V%"%m%1!<%?$N>uBV$,$o$+$k!#(B

    % cat /proc/slabinfo  [$B
    slabinfo - version: 2.0
    # name            <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <batchcount> <limit> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>
    ip_conntrack_expect      0      0    256   15    1 : tunables  120   60    8 : slabdata      0      0      0
    ip_conntrack          22     50    384   10    1 : tunables   54   27    8 : slabdata      5      5      0
    nfs_direct_cache       0      0     68   58    1 : tunables  120   60    8 : slabdata      0      0      0
    nfs_write_data        36     42    512    7    1 : tunables   54   27    8 : slabdata      6      6      0
    ...
    task_struct           84    115   1408    5    2 : tunables   24   12    8 : slabdata     23     23      0
    anon_vma             767   1130     16  226    1 : tunables  120   60    8 : slabdata      5      5      0
    pgd                   54    238     32  119    1 : tunables  120   60    8 : slabdata      2      2      0
    pmd                  123    123   4096    1    1 : tunables   24   12    8 : slabdata    123    123      0
    size-131072(DMA)       0      0 131072    1   32 : tunables    8    4    0 : slabdata      0      0      0
    size-131072            0      0 131072    1   32 : tunables    8    4    0 : slabdata      0      0      0
    size-65536(DMA)        0      0  65536    1   16 : tunables    8    4    0 : slabdata      0      0      0
    size-65536             2      2  65536    1   16 : tunables    8    4    0 : slabdata      2      2      0
    ...
    size-32             8314   8925     32  119    1 : tunables  120   60    8 : slabdata     75     75      0
    kmem_cache           150    150    256   15    1 : tunables  120   60    8 : slabdata     10     10      0
    % []
    
    $B%9%i%V!&%"%m%1!<%?$K$O!"#2
  • $B@lMQ!#$?$H$($P!"(Btask_struct $B$J$i!"(Bsizeof(struct task_struct) $B$H$7$F%-%c%C%7%e$KJ]B8!#(B $BA0H>$KI=<($5$l$k!#(B
  • $BHFMQ!#$$$/$D$+$NBg$-$5$N%a%b%j!#(B32$B!"(B64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072$B!#(B $B8eH>$N(B size-$BHV9f(B $B!#(B DMA $B$,IU$$$F$$$k$b$N$O!"(BDMA $B2DG=$J%a%b%j!#(B

    $B"#%f!<%6!&%W%m%;%9$N2>A[%a%b%j$N

    $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"!

    Linux $B$G$O!"

    ELF $B%U%!%$%k$O!"%X%C%@$H%;%/%7%g%s$NJB$S$+$i$J$k!#=EMW$J%;%/%7%g%s$K(B $B$O!"(B.text, .rodata, .data $B$,$"$k!#(B

    $ cat hello.c [$B
    main()
    {
            printf("hello, %s!\n","world");
    }
    $ cc -o hello hello.c [$B
    $ file hello [$B
    hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, not stripped
    $ size hello [$B
       text		   data	      bss	    dec	    hex	filename
       1159		       252          8	       1419     58b	hello
    $ readelf -S hello [$B
    There are 30 section headers, starting at offset 0x7f4:
    
    Section Headers:
      [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
      [ 0]                   NULL            00000000 000000 000000 00      0   0  0
      [ 1] .interp           PROGBITS        08048134 000134 000013 00   A  0   0  1
    ...
      [13] .text             PROGBITS        08048310 000310 00018c 00  AX  0   0 16
    ...
      [15] .rodata           PROGBITS        080484b8 0004b8 00001e 00   A  0   0  4
    ...
      [24] .data             PROGBITS        080496c8 0006c8 000004 00  WA  0   0  4
      [25] .bss              NOBITS          080496cc 0006cc 000008 00  WA  0   0  4
    ...
      [28] .symtab           SYMTAB          00000000 000ca4 000410 10     29  45  4
    $ []
    

    $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
    • 32$B%S%C%H%7%9%F%`$G!"(B0x00000000-0xffffffff
    • 64$B%S%C%H%7%9%F%`$G!"(B0x00000000-0xffffffffffffffff ($B/$7>.$5$$!#(B0x00ffffffffffff $B$/$i$$!#(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%a%b%j!&%(%j%"$K$O!"3+;OHVCO$H=*N;HVCO!J$^$?$OBg$-$5!K$,$"$k!#(B
    • $B%a%b%j!&%(%j%"Kh$KJ]8nJ}K!$rJQ$($i$l$k!#%F%-%9%H$rFI$_9~$_@lMQ(B (read-only)$B$K$9$k$J$I!#(B
    • $B%a%b%j!&%(%j%"Kh$K%U%!%$%k$KBP1~$5$;$i$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.12.6/include/linux/sched.h
    
    1023:	struct task_struct {
    ...
    1091:	        struct mm_struct *mm, *active_mm;
    ...
    1414:	};
    
    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.12.6/include/linux/mm_types.h
     326:	struct mm_struct {
     327:	        struct vm_area_struct * mmap;           /* list of VMAs */
     328:	        struct rb_root mm_rb;
     329:	        struct vm_area_struct * mmap_cache;     /* last find_vma result */
    ...
     339:	        pgd_t * pgd;
     340:	        atomic_t mm_users;                      /* How many users with user space? */
     341:	        atomic_t mm_count;                      /* How many references to "struct mm_struct" (users count as 1) */
     342:	        int map_count;                          /* number of VMAs */
    ...
     364:	        unsigned long start_code, end_code, start_data, end_data;
     365:	        unsigned long start_brk, brk, start_stack;
     366:	        unsigned long arg_start, arg_end, env_start, env_end;
    ...
     439:	};
    

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

    linux-3.12.6/include/linux/mm_types.h
    
     228:	struct vm_area_struct {
    ...
     231:	        unsigned long vm_start;         /* Our start address within vm_mm. */
     232:	        unsigned long vm_end;           /* The first byte after our end address
    ...
     236:	        struct vm_area_struct *vm_next, *vm_prev;
     237:	
     238:	        struct rb_node vm_rb;
    ...
     250:	        struct mm_struct *vm_mm;        /* The address space we belong to. */
     251:	        pgprot_t vm_page_prot;          /* Access permissions of this VMA. */
     252:	        unsigned long vm_flags;         /* Flags, see mm.h. */
    ...
     278:	        const struct vm_operations_struct *vm_ops;
    ...
     283:	        struct file * vm_file;          /* File we map to (can be NULL). */
    ...
     292:	};
    
    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.12.6/arch/x86/mm/fault.c
    
    1225:	dotraplinkage void __kprobes
    1226:	do_page_fault(struct pt_regs *regs, unsigned long error_code)
    1227:	{
    ...
    1231:	        __do_page_fault(regs, error_code);
    ...
    1233:	}
    
     997:	static void __kprobes
     998:	__do_page_fault(struct pt_regs *regs, unsigned long error_code)
     999:	{
    1000:	        struct vm_area_struct *vma;
    1001:	        struct task_struct *tsk;
    1002:	        unsigned long address;
    1003:	        struct mm_struct *mm;
    1004:	        int fault;
    1005:	        unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
    1006:	
    1007:	        tsk = current;
    1008:	        mm = tsk->mm;
    1009:	
    1010:	        /* Get the faulting address: */
    1011:	        address = read_cr2();
    ...
    1138:	        vma = find_vma(mm, address);
    1139:	        if (unlikely(!vma)) {
    1140:	                bad_area(regs, error_code, address);
    1141:	                return;
    1142:	        }
    1143:	        if (likely(vma->vm_start <= address))
    1144:	                goto good_area;
    1145:	        if (unlikely(!(vma->vm_flags & VM_GROWSDOWN))) {
    1146:	                bad_area(regs, error_code, address);
    1147:	                return;
    1148:	        }
    ...
    1161:	        if (unlikely(expand_stack(vma, address))) {
    1162:	                bad_area(regs, error_code, address);
    1163:	                return;
    1164:	        }
    ...
    1170:	good_area:
    1171:	        if (unlikely(access_error(error_code, vma))) {
    1172:	                bad_area_access_error(regs, error_code, address);
    1173:	                return;
    1174:	        }
    ...
    1181:	        fault = handle_mm_fault(mm, vma, address, flags);
    ...
    1223:	}
    
    • $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()

    ../src/mm-memory.c.npr
    
    3839:	int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma,
    3840:	                    unsigned long address, unsigned int flags)
    3841:	{
    ...
    3859:	        ret = __handle_mm_fault(mm, vma, address, flags);
    3873:	        return ret;
    3874:	}
    
    3748:	static int __handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma,
    3749:	                             unsigned long address, unsigned int flags)
    3750:	{
    3751:	        pgd_t *pgd;
    3752:	        pud_t *pud;
    3753:	        pmd_t *pmd;
    3754:	        pte_t *pte;
    ...
    3759:	retry:
    3760:	        pgd = pgd_offset(mm, address);
    3761:	        pud = pud_alloc(mm, pgd, address);
    3762:	        if (!pud)
    3763:	                return VM_FAULT_OOM;
    3764:	        pmd = pmd_alloc(mm, pud, address);
    3765:	        if (!pmd)
    3766:	                return VM_FAULT_OOM;
    ...
    3834:	        pte = pte_offset_map(pmd, address);
    3835:	
    3836:	        return handle_pte_fault(mm, vma, address, pte, pmd, flags);
    3837:	}
    
    • $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(B 1$B%(%s%H%j$r(B handle_pte_fault() $B$G:n$k!#(B

    $B"!(Bhandle_pte_fault()

    linux-3.12.6/mm/memory.c
    3689:	static int handle_pte_fault(struct mm_struct *mm,
    3690:	                     struct vm_area_struct *vma, unsigned long address,
    3691:	                     pte_t *pte, pmd_t *pmd, unsigned int flags)
    3692:	{
    3693:	        pte_t entry;
    ...
    3696:	        entry = *pte;
    ...
    3698:	                if (pte_none(entry)) {
    3699:	                        if (vma->vm_ops) {
    3700:	                                if (likely(vma->vm_ops->fault))
    3701:	                                        return do_linear_fault(mm, vma, address,
    3702:	                                                pte, pmd, flags, entry);
    3703:	                        }
    3704:	                        return do_anonymous_page(mm, vma, address,
    3705:	                                                 pte, pmd, flags);
    3706:	                }
    3707:	                if (pte_file(entry))
    3708:	                        return do_nonlinear_fault(mm, vma, address,
    3709:	                                        pte, pmd, flags, entry);
    3710:	                return do_swap_page(mm, vma, address,
    3711:	                                        pte, pmd, flags, entry);
    ...
    3743:	}
    
    • 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"!@V9uLZ(B(red-black tree (rbtree))

    $B@V9uLZ(B(red-black tree) $B$O!"J?9UFsJ,C5:wLZ(B(self-balancing binary search tree)$B$N0l

    $BFsJ,C5:wLZ$H$O!"
  • $B3F@a$K%-!<$,$"$k!#(B
  • $B:8$NItJ,LZ$O!":,$h$j$b>.$5$$%-!<$@$1$r$b$DFsJ,C5:wLZ!#(B
  • $B:8$NItJ,LZ$O!":,$h$j$b>.$5$$%-!<$@$1$r$b$DFsJ,C5:wLZ!#(B $BJ?9ULZ(B(balanced tree)$B!"$^$?$O!"9b$5J?9ULZ(B(height-balanced tree)$B$O!"G$0U(B $B$N@a$G:81&$N9b$5$N:9$,0lDj0J2

    Linux $B$G$O!"@V9uLZ$r%=!<%H$5$l$?MWAG$,JB$V%j%9%H$r$B"!(BLinux red-black tree$B$N4pK\A`:n(B $B7?Dj5A$G!"3FMWAG$K
  • struct rb_node node (rb_right, rb_left, rb_parent_color)
  • $B%-!<$K$J$k%U%#!<%k%I(B $B8!:w(B
    1. $B8=:_$N%N!<%I$H%-!<$rHf3S(B
    2. $BEy$7$$$J$i8+$D$+$C$?(B
    3. $B%-!<$,>.$5$$$J$i:8$N;^$X(B
    4. $B%-!<$,Bg$-$$$J$i1&$N;^$X(B
    5. $B;^$,$J$1$l$P%-!<$OB8:_$7$J$$(B
    $BA^F~(B
    1. $B$^$:8!:w$9$k!#8=:_$N%N!<%I$HA^F~$7$?$$%G!<%?$N%-!<$rHf3S$9$k!#(B
    2. $B%-!<$,>.$5$$$J$i:8$N;^$r!V?F!W$K$7$F8!:w$rB3$1$k!#(B
    3. $B%-!<$,Bg$-$$$J$i1&$N;^$r!V?F!W$K$7$F8!:w$rB3$1$k!#(B
    4. $B%-!<$,Ey$7$$$J$i%(%i!<(B($B%(%i!<$K$;$:!"=EJ#$r5v$9$3$H$b$"$k(B)
    5. $B;R6!$,$$$J$$!V?F!W$,8+$D$+$k!#(B
    6. $B!V?F!W$+$iA^F~$7$?$$%G!<%?$X$N%j%s%/$r:n@.$9$k(B(rb_link_node())
    7. $BJ?9U$K$J$k$h$&$K$9$k(B(rebalancing, recoloring, rb_insert_color())

    $B"#2]Bj(B2 $B%a%b%j4IM}(B

    $B!zLdBj(B(201) struct page

    struct page$B$NBg$-$5$O!"%"!<%-%F%/%A%c$d%3%s%Q%$%k;~$N%*%W%7%g%s$K$h$C$F(B $B0[$J$k!#$"$k%7%9%F%`$G!"(Bstruct page$B$NBg$-$5$,(B 40 $B%P%$%H$G$"$C$?$H$9$k!#(B $B$=$N%7%9%F%`$K!"(B1GB $B$N%a%b%j$,Ek:\$5$l$F$$$?;~!"(Bstruct page$B$N$?$a$K!"2?(B MB$B$N%a%b%j$,;H$o$l$k$+!#%Z!<%8%5%$%:$O!"(B4KB$B$H$9$k!#(B

    $B!zLdBj(B(202) kmalloc()$B$H(Bkfree()

    $B0J2<$O!"%f!<%66u4V$G%a%b%j$r3dEv$F!"MxMQ$7!"3+J|$9$k%W%m%0%i%`$N0lIt$G$"$k!#(B
    struct s1 {
       /* $B>JN,(B */
    };
    $BMxMQ(B
       struct s1 *p;
       p = malloc( sizeof(struct s1) );
       use( p );
       free( p );
    
    $B$3$N%W%m%0%i%`$r!"%+!<%M%kFb$GF0$+$9$3$H$rA[Dj$7$F(Bkmalloc() $B$H(B kfree() $B$r;H$C$F=q$-49$($J$5$$!#$?$@$7!"(Bgfp $B$N%U%i%0$H$7$F$O!"(BGFP_KERNEL $B$r;H$$$J$5$$!#(B
    $BMxMQ(B
       struct s1 *p;
       /*$B2sEz(B*/
       use( p );
       /*$B2sEz(B*/
    

    $B!zLdBj(B(203) $B%9%i%V%"%m%1!<%?(B

    $BLdBj(B(202) $B$N%W%m%0%i%`$r!"%9%i%V%"%m%1!<%?$r;H$C$F=q$-49(B $B$($J$5$$!#$9$J$o$A!"(Bkmem_cache_create()$B!"(Bkmem_cache_alloc()$B!"$*$h$S!"(B kmem_cache_free()$B$r;H$C$F=q$-49$($J$5$$!#$?$@$7!"(Bkmem_cache_create() $B$N(B $BBh(B3$B0z?t$N(Balign $B$H$7$F$O!"(B0$B$r!"Bh(B4$B0z?t$N(Bflags$B$H$7$F$O!"(BSLAB_PANIC$B!"Bh(B5$B0z(B $B?t$N%3%s%9%H%i%/%?$H$7$F$O!"(BNULL $B$r;XDj$7$J$5$$!#(B
    $B=i4|2=(B
       /*$B2sEz(B*/
    
    $BMxMQ(B
       struct s1 *p;
       /*$B2sEz(B*/
       use( p );
       /*$B2sEz(B*/
    

    $B!zLdBj(B(204) 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(B $B$rMQ$$$F$$$?>l9g!"%Z!<%8%F!<%V%k$N7A$HFbMF$O$I$&$J$k$+!#4JC1$K?^$G=q$-$J$5$$!#(B $B$^$?!"(B $B%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(205) 2$BCJ$N%Z!<%8%F!<%V%k(B

    $BLdBj(B(204) $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>l9g!"%Z!<%8%F!<%V%k$N7A$HFbMF$O$I$&$J$k$+!#4JC1$K?^$G=q$-$J$5$$!#(B $B$^$?!"%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: 2014/01/31 17:18:37
    Yasushi Shinjo / <yas@cs.tsukuba.ac.jp>