Rev 45 | Rev 47 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 45 | Rev 46 | ||
---|---|---|---|
Line 58... | Line 58... | ||
58 | <para>The majority of the architectures use multi-level page tables, |
58 | <para>The majority of the architectures use multi-level page tables, |
59 | which means need to access physical memory several times before getting |
59 | which means need to access physical memory several times before getting |
60 | physical address. This fact would make serios performance overhead in |
60 | physical address. This fact would make serios performance overhead in |
61 | virtual memory management. To avoid this <link linkend="tlb">Traslation |
61 | virtual memory management. To avoid this <link linkend="tlb">Traslation |
62 | Lookaside Buffer (TLB)</link> is used.</para> |
62 | Lookaside Buffer (TLB)</link> is used.</para> |
63 | - | ||
64 | <para>At the moment HelenOS does not support swapping.</para> |
- | |
65 | - | ||
66 | <para>- pouzivame vypadky stranky k alokaci ramcu on-demand v ramci |
- | |
67 | as_area - na architekturach, ktere to podporuji, podporujeme non-exec |
- | |
68 | stranky</para> |
- | |
69 | </section> |
63 | </section> |
70 | 64 | ||
71 | <section> |
65 | <section> |
72 | <title>Address spaces</title> |
66 | <title>Address spaces</title> |
73 | 67 | ||
74 | <section> |
68 | <section> |
75 | <title>Address spaces and areas</title> |
69 | <title>Address space areas</title> |
- | 70 | ||
- | 71 | <para>Each address space consists of mutually disjunctive continuous |
|
- | 72 | address space areas. Address space area is precisely defined by its |
|
- | 73 | base address and the number of frames is contains.</para> |
|
- | 74 | ||
- | 75 | <para>Address space area also has special flags, that define behaviour |
|
- | 76 | and permissions on the particular area. <itemizedlist> |
|
- | 77 | <listitem> |
|
- | 78 | ||
- | 79 | ||
- | 80 | <emphasis>AS_AREA_READ</emphasis> |
|
- | 81 | ||
- | 82 | flag indicates reading permission. |
|
- | 83 | </listitem> |
|
- | 84 | ||
- | 85 | <listitem> |
|
- | 86 | ||
- | 87 | ||
- | 88 | <emphasis>AS_AREA_WRITE</emphasis> |
|
- | 89 | ||
- | 90 | flag indicates writing permission. |
|
- | 91 | </listitem> |
|
- | 92 | ||
- | 93 | <listitem> |
|
- | 94 | ||
- | 95 | ||
- | 96 | <emphasis>AS_AREA_EXEC</emphasis> |
|
76 | 97 | ||
77 | <para>- adresovy prostor se sklada z tzv. address space areas |
98 | flag indicates code execution permission. Some architectures do not support execution persmission restriction. In this case this flag has no effect. |
- | 99 | </listitem> |
|
- | 100 | ||
- | 101 | <listitem> |
|
- | 102 | ||
- | 103 | ||
78 | usporadanych v B+stromu; tyto areas popisuji vyuzivane casti |
104 | <emphasis>AS_AREA_DEVICE</emphasis> |
- | 105 | ||
79 | adresoveho prostoru patrici do user address space. Kazda cast je dana |
106 | marks area as mapped to the device memory. |
- | 107 | </listitem> |
|
80 | svoji bazovou adresou, velikosti a flagy (rwx/dd).</para> |
108 | </itemizedlist></para> |
81 | 109 | ||
82 | <para>- uzivatelske thready maji moznost manipulovat se svym adresovym |
110 | <para>Kernel provides possibility tasks create/expand/shrink/share its |
83 | prostorem (vytvaret/resizovat/sdilet) as_areas pomoci syscallu</para> |
111 | address space via the set of syscalls.</para> |
84 | </section> |
112 | </section> |
85 | 113 | ||
86 | <section> |
114 | <section> |
87 | <title>Address Space ID (ASID)</title> |
115 | <title>Address Space ID (ASID)</title> |
88 | 116 | ||
89 | <para>- nektery hardware umoznuje rozlisit ruzne adresove prostory od |
117 | <para>When switching to the different task, kernel also require to |
90 | sebe (cilem je maximalizovat vyuziti TLB); dela to tak, ze s kazdou |
118 | switch mappings to the different address space. In case TLB cannot |
91 | polozkou TLB/strankovacich tabulek sdruzi identifikator adresoveho |
119 | distinguish address space mappings, all mappings from the old address |
92 | prostoru (ASID, RID, ppc32 ???). Tyto id mivaji ruznou sirku: 8-bitu |
120 | space should be flushed, which can create certain uncessary |
93 | az 24-bitu (kolik ma ppc32?)</para> |
121 | overhead.</para> |
94 | 122 | ||
95 | <para>- kernel tomu rozumi a sam pouziva abstrakci ASIDu (na ia64 to |
123 | <para>To avoid this, some architectures have capability to segregate |
96 | je napr. cislo odvozene od RIDu, na mips32 to je ASID samotny); |
124 | different address spaces on HW level introducing the ASID (address |
- | 125 | space ID). On those architectures each TLB record contains an address |
|
97 | existence ASIDu je nutnou podminkou pouziti _global_ page hash table |
126 | space identifier, that tells to which address space this record is |
98 | mechanismu.</para> |
127 | applicable.</para> |
99 | 128 | ||
100 | <para>- na vsech arch. plati, ze asidu je mnohem mene, nez teoreticky |
129 | <para>HelenOS kernel can take advantage of this hardware supported |
101 | pocet soucasne bezicich tasku ~ adresovych prostoru, takze je |
130 | identifier by having an ASID abstraction which is connected to the |
102 | implementovan mechanismus, ktery umoznuje jednomu adresovemu prostoru |
131 | corresponding architecture identifier. I.e. on ia64 kernel ASID is |
- | 132 | built from RID (region identifier) and on the mips32 kernel ASID is |
|
103 | ASID odebrat a pridelit ho jinemu</para> |
133 | actually the hardware identifier.</para> |
104 | 134 | ||
105 | <para>- vztah task ~ adresovy prostor: teoreticky existuje moznost, ze |
135 | <para>Due to the hardware limitations ASID has limited length from 8 |
- | 136 | bits on ia64 to 24 bits on mips32, which makes it impossible to use as |
|
106 | je adresovy prostor sdilen vice tasky, avsak tuto moznost nepouzivame |
137 | unique address space identifier for all tasks running in the system. |
107 | a neni ani nijak osetrena. Tim padem plati, ze kazdy task ma vlastni |
138 | In such situations special ASID stealing algoritm is used, which takes |
108 | adresovy prostor</para> |
139 | ASID from inactive task and assigns it to the active task.</para> |
109 | </section> |
140 | </section> |
110 | </section> |
141 | </section> |
111 | 142 | ||
112 | <section> |
143 | <section> |
113 | <title>Virtual address translation</title> |
144 | <title>Virtual address translation</title> |
Line 143... | Line 174... | ||
143 | <formalpara> |
174 | <formalpara> |
144 | <title>Global hash tables</title> |
175 | <title>Global hash tables</title> |
145 | 176 | ||
146 | <para>- global page hash table: existuje jen jedna v celem systemu |
177 | <para>- global page hash table: existuje jen jedna v celem systemu |
147 | (vyuziva ji ia64), pozn. ia64 ma zatim vypnuty VHPT. Pouziva se |
178 | (vyuziva ji ia64), pozn. ia64 ma zatim vypnuty VHPT. Pouziva se |
148 | genericke hash table s oddelenymi collision chains</para> |
179 | genericke hash table s oddelenymi collision chains. ASID support is |
- | 180 | required to use global hash tables.</para> |
|
149 | </formalpara> |
181 | </formalpara> |
150 | 182 | ||
151 | <para>Thanks to the abstract paging interface, there is possibility |
183 | <para>Thanks to the abstract paging interface, there is possibility |
152 | left have more paging implementations, for example B-Tree page |
184 | left have more paging implementations, for example B-Tree page |
153 | tables.</para> |
185 | tables.</para> |
154 | </section> |
186 | </section> |
155 | 187 | ||
156 | <section id="tlb"> |
188 | <section id="tlb"> |
157 | <title>Translation Lookaside buffer</title> |
189 | <title>Translation Lookaside Buffer</title> |
158 | 190 | ||
159 | <para>- TLB cachuji informace ve strankovacich tabulkach; alternativne |
191 | <para>- TLB cachuji informace ve strankovacich tabulkach; alternativne |
160 | se lze na strankovaci tabulky (ci ruzne hw rozsireni [e.g. VHPT, ppc32 |
192 | se lze na strankovaci tabulky (ci ruzne hw rozsireni [e.g. VHPT, ppc32 |
161 | hw hash table]) divat jako na velke TLB</para> |
193 | hw hash table]) divat jako na velke TLB</para> |
162 | 194 | ||
Line 167... | Line 199... | ||
167 | Black et al., "Translation Lookaside Buffer Consistency: A Software |
199 | Black et al., "Translation Lookaside Buffer Consistency: A Software |
168 | Approach," Proc. Third Int'l Conf. Architectural Support for |
200 | Approach," Proc. Third Int'l Conf. Architectural Support for |
169 | Programming Languages and Operating Systems, 1989, pp. 113-122.</para> |
201 | Programming Languages and Operating Systems, 1989, pp. 113-122.</para> |
170 | 202 | ||
171 | <para>- nutno poznamenat, ze existuji odlehcenejsi verze TLB shootdown |
203 | <para>- nutno poznamenat, ze existuji odlehcenejsi verze TLB shootdown |
172 | algoritmu</para> |
204 | algoritm</para> |
173 | </section> |
205 | </section> |
174 | </section> |
206 | </section> |
- | 207 | ||
- | 208 | <section> |
|
- | 209 | <title>---</title> |
|
- | 210 | ||
- | 211 | <para>At the moment HelenOS does not support swapping.</para> |
|
- | 212 | ||
- | 213 | <para>- pouzivame vypadky stranky k alokaci ramcu on-demand v ramci |
|
- | 214 | as_area - na architekturach, ktere to podporuji, podporujeme non-exec |
|
- | 215 | stranky</para> |
|
- | 216 | </section> |
|
175 | </section> |
217 | </section> |
176 | 218 | ||
177 | <!-- End of VM --> |
219 | <!-- End of VM --> |
178 | 220 | ||
179 | <section> |
221 | <section> |
Line 274... | Line 316... | ||
274 | power-of-two sized naturally aligned blocks. These blocks are |
316 | power-of-two sized naturally aligned blocks. These blocks are |
275 | organized in an array of lists, in which the list with index i |
317 | organized in an array of lists, in which the list with index i |
276 | contains all unallocated blocks of size |
318 | contains all unallocated blocks of size |
277 | <mathphrase>2<superscript>i</superscript></mathphrase>. The index i is |
319 | <mathphrase>2<superscript>i</superscript></mathphrase>. The index i is |
278 | called the order of block. Should there be two adjacent equally sized |
320 | called the order of block. Should there be two adjacent equally sized |
279 | blocks in the list i<mathphrase> </mathphrase>(i.e. buddies), the |
321 | blocks in the list i<mathphrase />(i.e. buddies), the buddy allocator |
280 | buddy allocator would coalesce them and put the resulting block in |
322 | would coalesce them and put the resulting block in list <mathphrase>i |
281 | list <mathphrase>i + 1</mathphrase>, provided that the resulting block |
323 | + 1</mathphrase>, provided that the resulting block would be naturally |
282 | would be naturally aligned. Similarily, when the allocator is asked to |
324 | aligned. Similarily, when the allocator is asked to allocate a block |
283 | allocate a block of size |
- | |
284 | <mathphrase>2<superscript>i</superscript></mathphrase>, it first tries |
325 | of size <mathphrase>2<superscript>i</superscript></mathphrase>, it |
285 | to satisfy the request from the list with index i. If the request |
326 | first tries to satisfy the request from the list with index i. If the |
286 | cannot be satisfied (i.e. the list i is empty), the buddy allocator |
327 | request cannot be satisfied (i.e. the list i is empty), the buddy |
287 | will try to allocate and split a larger block from the list with index |
328 | allocator will try to allocate and split a larger block from the list |
288 | i + 1. Both of these algorithms are recursive. The recursion ends |
329 | with index i + 1. Both of these algorithms are recursive. The |
289 | either when there are no blocks to coalesce in the former case or when |
330 | recursion ends either when there are no blocks to coalesce in the |
290 | there are no blocks that can be split in the latter case.</para> |
331 | former case or when there are no blocks that can be split in the |
- | 332 | latter case.</para> |
|
291 | 333 | ||
292 | <!--graphic fileref="images/mm1.png" format="EPS" /--> |
334 | <!--graphic fileref="images/mm1.png" format="EPS" /--> |
293 | 335 | ||
294 | <para>This approach greatly reduces external fragmentation of memory |
336 | <para>This approach greatly reduces external fragmentation of memory |
295 | and helps in allocating bigger continuous blocks of memory aligned to |
337 | and helps in allocating bigger continuous blocks of memory aligned to |
Line 459... | Line 501... | ||
459 | CPU-bound magazine is actually a pair of magazines to avoid |
501 | CPU-bound magazine is actually a pair of magazines to avoid |
460 | thrashing when during allocation/deallocatiion of 1 item at the |
502 | thrashing when during allocation/deallocatiion of 1 item at the |
461 | magazine size boundary. LIFO order is enforced, which should avoid |
503 | magazine size boundary. LIFO order is enforced, which should avoid |
462 | fragmentation as much as possible.</para> |
504 | fragmentation as much as possible.</para> |
463 | 505 | ||
464 | <para>Another important entity of magazine layer is a full magazine |
506 | <para>Another important entity of magazine layer is the common full |
- | 507 | magazine list (also called a depot), that stores full magazines that |
|
465 | depot, that stores full magazines which are used by any of the CPU |
508 | may be used by any of the CPU magazine caches to reload active CPU |
466 | magazine caches to reload active CPU magazine. Magazine depot can be |
509 | magazine. This list of magazines can be pre-filled with full |
467 | pre-filled with full magazines during initialization, but in current |
510 | magazines during initialization, but in current implementation it is |
468 | implementation it is filled during object deallocation, when CPU |
511 | filled during object deallocation, when CPU magazine becomes |
469 | magazine becomes full.</para> |
512 | full.</para> |
470 | 513 | ||
471 | <para>Slab allocator control structures are allocated from special |
514 | <para>Slab allocator control structures are allocated from special |
472 | slabs, that are marked by special flag, indicating that it should |
515 | slabs, that are marked by special flag, indicating that it should |
473 | not be used for slab magazine layer. This is done to avoid possible |
516 | not be used for slab magazine layer. This is done to avoid possible |
474 | infinite recursions and deadlock during conventional slab allocaiton |
517 | infinite recursions and deadlock during conventional slab allocaiton |