From 350b5c41c369d41b92c3e1965666e863166111e1 Mon Sep 17 00:00:00 2001 From: Mathieu Maret Date: Sat, 30 Jul 2022 15:59:50 +0200 Subject: [PATCH] Add diagram to doc --- docs/3_virtual_mem.md | 53 +++++++++++++++++++++++++++++++++--------- docs/slab_diag.asiio | Bin 0 -> 26278 bytes 2 files changed, 42 insertions(+), 11 deletions(-) create mode 100644 docs/slab_diag.asiio diff --git a/docs/3_virtual_mem.md b/docs/3_virtual_mem.md index 1825fa7..33e6355 100644 --- a/docs/3_virtual_mem.md +++ b/docs/3_virtual_mem.md @@ -27,12 +27,13 @@ A given entry N in the PD point to the PD (this is possible because PDE very loo Then, accessing N * 4Mo + I * 4Ko is accessing the PT of the Ieme entry in the PD (as MMU take the PD pointed by the PDE number N like a PT). More particularly, accessing N * 4Mo + N * 4ko is accessing the PD. -PD is at Vaddr N * 4Mo and take 4ko. Each PT are allocated dynamically. -Just make sure that N have not been used by identity mapping +PD is at Vaddr N * 4Mo and take 4ko. Each PT is allocated dynamically. +Just make sure that N have not been used by identity mapping. ## Virtual memory allocators -We will setup 2 different virtual memory allocator: +We will setup 2 different virtual memory allocators: + * `allocArea` for large memory area of several PAGE_SIZE size * `alloc` for object of any size @@ -44,10 +45,11 @@ An area is represented by `struct memArea` and basically consist of a virtual me This is a simple allocator keeping 2 linked list of used/free area. Allocating a new area (thanks to `areaAlloc()`) consist of: -1. finding an area big enough in the free list. -2. split it if the found area is too large. -3. put the found area in the user area list. -4. optionally map the area to physical page + +1. Finding an area big enough in the free list. +2. Split it if the found area is too large. +3. Put the found area in the user area list. +4. Optionally map the area to physical pages. Freeing an area (thank to `areaFree()`) consist of trying to find adjacent free area and merge them with this one or just adding the area to the free one. @@ -57,9 +59,38 @@ Freeing an area (thank to `areaFree()`) consist of trying to find adjacent free For large object allocation ( > PAGE_SIZE), this a basically a call to `areaAlloc()`. For smaller object, this is a more complex allocator based on the concept of slab. -The allocator is configured at startup to maintain slab for allocating object of a given size. -So a slab is a linked list of `struct slabEntry` having each of the entries pointing to one or several memory area that is divided in chunk of the slab configured size. -It's a linked list so it is each to add a new `struct slabEntry` when one is full. -Inside a `struct slabEntry` the `freeEl` attribute point to the next free chunk (of the slab configured size) in the allocated page(s). At this address is also a pointer to the next free area in this area. +The allocator is configured at startup to maintain a collection of slabs, each of them configured for allocating object of a given size. +So a slab is described by `struct slabDesc` and contains a linked list of `struct slabEntry`. +Each of the `struct slabEntry` entry point to a memory area that is divided in chunk of the slab configured size. +It's a linked list so it is easy to add a new `struct slabEntry` when one is full. +Inside a `struct slabEntry` the `freeEl` attribute point to the next free chunk (of the slab configured size) in the allocated page(s). At this address is also a pointer to the next free area in this area. + .-----------------------------. + | struct slabEntry { | + | vaddr_t page; |-------------------->.---------------------. + | void *freeEl; |-------------. |.------------------. | + | size_t size; | | || allocated chunk | | + | bool_t full; | | |.-------------------.| + | struct slabEntry *next; || -------->| addr of next free |----. + | struct slabEntry *prev; || |.------------------.'| | + | }; || || allocated chunk | | | + '-----------------------------'| |.------------------. | | + .------------------------------' || NULL |<----' + '-->.-----------------------------. |.------------------. | + | struct slabEntry { | || allocated chunk | | + | vaddr_t page; | |'------------------' | + | void *freeEl; | '---------------------' + | size_t size; | + | bool_t full; | + | struct slabEntry *next; || + | struct slabEntry *prev; || + | }; || + '-----------------------------'| + .----------------------------------' + '-->.-----. + | ... | + '-----' + +So there is one slab for object of 4B, one for 126B ... +The linked-list containing all the slab (`struct slabDesc`) is called the slub. diff --git a/docs/slab_diag.asiio b/docs/slab_diag.asiio new file mode 100644 index 0000000000000000000000000000000000000000..3247950bedc3e96129bc5490faaaad3f0c2d0463 GIT binary patch literal 26278 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

Y(;f;nNVOyxV{ zvZlG@Pb5w{x5ldvq!zl^Ca`zp1Nw3vA}WuX!m{E)9#I@G42TfD;&AodC)6hauOUgB z@nrP?49sxY8o)&E%chir-uy$jnwA1X5{q2tmdjiNb{v~^m>=1_V-+)wen9~S?fUJs zm$Wt2IveI7_U7s;gX>8uDmmUAVXv*tU3K5~lGKJI7crO0A#h`{w(uXS{k0*Hq%3_4 zrblk>Zi7FViwDr_&=A{?dGCQE=hb_@jm`jlANyZ7-3NHDo`lkhrH;%m-Z$jpe+wSN zY^N3VqwDc3h7x>gi?lykONpH0wTW(o3)@pztbB#i^D_5`=AKLjo;xJahCGIpa}Z_1 zJ9K`-`_sEUC~}IX9DmarH!A!xpfxn2x>a)@buF|XC+SSLUFUXFSCsv-GM zac&u5CY@pV;7uG?Ki|T{8X@8E8iKkp$$aF6W^vb{yIhheV0Mr~imGO9tUb%!>HNvF z2bl@uvl-e4{?I6SnluIH0T9hh7#4Yva^|m_;HNU{Lcy;v3H0PnEi#80L z`)UXeIARYYDTXHDM^nsyYi{$_?nO$nL9&cdR4)tnSh*v|^WD<%USwI6xyiaTUL#wu z%=jcuvkc7n!OKvi+nTMKk)IcISGWpOy7hIU5IFVAQ?1HOb#wrGXcob`XO`!zzB7kdvVI z^YgR*es8AvZfYPJ|9JEFCn9k=E=9NI0SDLidmi+4c*U&e?E7v;p@oyvste?x7?zM@hD_u_5a%<*|#NCwsQ_C?R*Z% zp(X>9y@@CorV>S-3~}DQ6s+VBPWg^I?O^mQ9?lAJVE*;0vop>3mG0`ZU9*0w6(uEw Io?w^%0WVKmRR910 literal 0 HcmV?d00001