Subversion Repositories HelenOS-doc

Rev

Rev 67 | Rev 69 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 67 Rev 68
Line 220... Line 220...
220
 
220
 
221
        <para>The slab allocator is closely modelled after OpenSolaris slab
221
        <para>The slab allocator is closely modelled after OpenSolaris slab
222
        allocator by Jeff Bonwick and Jonathan Adams with the following
222
        allocator by Jeff Bonwick and Jonathan Adams with the following
223
        exceptions:<itemizedlist>
223
        exceptions:<itemizedlist>
224
            <listitem>
224
            <listitem>
225
              empty slabs are immediately deallocated
225
               empty slabs are immediately deallocated
226
            </listitem>
226
            </listitem>
227
 
227
 
228
            <listitem>
228
            <listitem>
229
              <para>empty magazines are deallocated when not needed</para>
229
              <para>empty magazines are deallocated when not needed</para>
230
            </listitem>
230
            </listitem>
Line 363... Line 363...
363
          </listitem>
363
          </listitem>
364
        </itemizedlist></para>
364
        </itemizedlist></para>
365
 
365
 
366
      <para><!--
366
      <para><!--
367
 
367
 
368
                TLB shootdown ASID/ASID:PAGE/ALL.
-
 
369
                TLB shootdown requests can come in asynchroniously
-
 
370
                so there is a cache of TLB shootdown requests. Upon cache overflow TLB shootdown ALL is executed
-
 
371
 
-
 
372
 
-
 
373
                <para>
368
                <para>
374
                        Address spaces. Address space area (B+ tree). Only for uspace. Set of syscalls (shrink/extend etc).
369
                        Address spaces. Address space area (B+ tree). Only for uspace. Set of syscalls (shrink/extend etc).
375
                        Special address space area type - device - prohibits shrink/extend syscalls to call on it.
370
                        Special address space area type - device - prohibits shrink/extend syscalls to call on it.
376
                        Address space has link to mapping tables (hierarchical - per Address space, hash - global tables).
371
                        Address space has link to mapping tables (hierarchical - per Address space, hash - global tables).
377
                </para>
372
                </para>
378
 
373
 
379
--></para>
374
--></para>
380
    </section>
375
    </section>
381
 
376
 
382
    <section>
377
    <section>
383
      <title>Paging</title>
-
 
384
 
-
 
385
      <para>Virtual memory is usually using paged memory model, where virtual
-
 
386
      memory address space is divided into the <emphasis>pages</emphasis>
-
 
387
      (usually having size 4096 bytes) and physical memory is divided into the
-
 
388
      frames (same sized as a page, of course). Each page may be mapped to
-
 
389
      some frame and then, upon memory access to the virtual address, CPU
-
 
390
      performs <emphasis>address translation</emphasis> during the instruction
-
 
391
      execution. Non-existing mapping generates page fault exception, calling
-
 
392
      kernel exception handler, thus allowing kernel to manipulate rules of
-
 
393
      memory access. Information for pages mapping is stored by kernel in the
-
 
394
      <link linkend="page_tables">page tables</link></para>
-
 
395
 
-
 
396
      <para>The majority of the architectures use multi-level page tables,
-
 
397
      which means need to access physical memory several times before getting
-
 
398
      physical address. This fact would make serios performance overhead in
-
 
399
      virtual memory management. To avoid this <link linkend="tlb">Traslation
-
 
400
      Lookaside Buffer (TLB)</link> is used.</para>
-
 
401
    </section>
-
 
402
 
-
 
403
    <section>
-
 
404
      <title>Address spaces</title>
378
      <title>Address spaces</title>
405
 
379
 
406
      <section>
380
      <section>
407
        <title>Address space areas</title>
381
        <title>Address space areas</title>
408
 
382
 
Line 481... Line 455...
481
    </section>
455
    </section>
482
 
456
 
483
    <section>
457
    <section>
484
      <title>Virtual address translation</title>
458
      <title>Virtual address translation</title>
485
 
459
 
486
      <section id="page_tables">
460
      <section id="paging">
487
        <title>Page tables</title>
461
        <title>Paging</title>
488
 
462
 
489
        <para>HelenOS kernel has two different approaches to the paging
-
 
490
        implementation: <emphasis>4 level page tables</emphasis> and
-
 
491
        <emphasis>global hash tables</emphasis>, which are accessible via
-
 
492
        generic paging abstraction layer. Such different functionality was
-
 
493
        caused by the major architectural differences between supported
-
 
494
        platforms. This abstraction is implemented with help of the global
-
 
495
        structure of pointers to basic mapping functions
-
 
496
        <emphasis>page_mapping_operations</emphasis>. To achieve different
-
 
497
        functionality of page tables, corresponding layer must implement
-
 
498
        functions, declared in
463
        <section>
499
        <emphasis>page_mapping_operations</emphasis></para>
464
          <title>Introduction</title>
500
 
465
 
-
 
466
          <para>Virtual memory is usually using paged memory model, where
-
 
467
          virtual memory address space is divided into the
-
 
468
          <emphasis>pages</emphasis> (usually having size 4096 bytes) and
-
 
469
          physical memory is divided into the frames (same sized as a page, of
-
 
470
          course). Each page may be mapped to some frame and then, upon memory
-
 
471
          access to the virtual address, CPU performs <emphasis>address
-
 
472
          translation</emphasis> during the instruction execution.
-
 
473
          Non-existing mapping generates page fault exception, calling kernel
-
 
474
          exception handler, thus allowing kernel to manipulate rules of
-
 
475
          memory access. Information for pages mapping is stored by kernel in
-
 
476
          the <link linkend="page_tables">page tables</link></para>
-
 
477
 
-
 
478
          <para>The majority of the architectures use multi-level page tables,
-
 
479
          which means need to access physical memory several times before
-
 
480
          getting physical address. This fact would make serios performance
-
 
481
          overhead in virtual memory management. To avoid this <link
-
 
482
          linkend="tlb">Traslation Lookaside Buffer (TLB)</link> is
501
        <formalpara>
483
          used.</para>
-
 
484
 
-
 
485
          <para>HelenOS kernel has two different approaches to the paging
-
 
486
          implementation: <emphasis>4 level page tables</emphasis> and
-
 
487
          <emphasis>global hash table</emphasis>, which are accessible via
-
 
488
          generic paging abstraction layer. Such different functionality was
-
 
489
          caused by the major architectural differences between supported
-
 
490
          platforms. This abstraction is implemented with help of the global
-
 
491
          structure of pointers to basic mapping functions
-
 
492
          <emphasis>page_mapping_operations</emphasis>. To achieve different
-
 
493
          functionality of page tables, corresponding layer must implement
-
 
494
          functions, declared in
-
 
495
          <emphasis>page_mapping_operations</emphasis></para>
-
 
496
 
-
 
497
          <para>Thanks to the abstract paging interface, there was a place
-
 
498
          left for more paging implementations (besides already implemented
-
 
499
          hieararchical page tables and hash table), for example B-Tree based
-
 
500
          page tables.</para>
-
 
501
        </section>
-
 
502
 
-
 
503
        <section>
502
          <title>4-level page tables</title>
504
          <title>Hierarchical 4-level page tables</title>
503
 
505
 
504
          <para>4-level page tables are the generalization of the hardware
506
          <para>Hierarchical 4-level page tables are the generalization of the
-
 
507
          hardware capabilities of most architectures. Each address space has
505
          capabilities of several architectures.<itemizedlist>
508
          its own page tables.<itemizedlist>
506
              <listitem>
509
              <listitem>
507
                 ia32 uses 2-level page tables, with full hardware support.
510
                 ia32 uses 2-level page tables, with full hardware support.
508
              </listitem>
511
              </listitem>
509
 
512
 
510
              <listitem>
513
              <listitem>
Line 513... Line 516...
513
 
516
 
514
              <listitem>
517
              <listitem>
515
                 mips and ppc32 have 2-level tables, software simulated support.
518
                 mips and ppc32 have 2-level tables, software simulated support.
516
              </listitem>
519
              </listitem>
517
            </itemizedlist></para>
520
            </itemizedlist></para>
518
        </formalpara>
521
        </section>
-
 
522
 
-
 
523
        <section>
-
 
524
          <title>Global hash table</title>
519
 
525
 
-
 
526
          <para>Implementation of the global hash table was encouraged by the
-
 
527
          ia64 architecture support. One of the major differences between
-
 
528
          global hash table and hierarchical tables is that global hash table
-
 
529
          exists only once in the system and the hierarchical tables are
520
        <formalpara>
530
          maintained per address space.</para>
-
 
531
 
-
 
532
          <para>Thus, hash table contains information about all address spaces
-
 
533
          mappings in the system, so, the hash of an entry must contain
-
 
534
          information of both address space pointer or id and the virtual
-
 
535
          address of the page. Generic hash table implementation assumes that
-
 
536
          the addresses of the pointers to the address spaces are likely to be
-
 
537
          on the close addresses, so it uses least significant bits for hash;
-
 
538
          also it assumes that the virtual page addresses have roughly the
-
 
539
          same probability of occurring, so the least significant bits of VPN
521
          <title>Global hash tables</title>
540
          compose the hash index.</para>
522
 
541
 
523
          <para>- global page hash table: existuje jen jedna v celem systemu
-
 
524
          (vyuziva ji ia64), pozn. ia64 ma zatim vypnuty VHPT. Pouziva se
-
 
525
          genericke hash table s oddelenymi collision chains. ASID support is
-
 
526
          required to use global hash tables.</para>
542
          <para>Collision chains ...</para>
527
        </formalpara>
543
        </section>
528
 
-
 
529
        <para>Thanks to the abstract paging interface, there is possibility
-
 
530
        left have more paging implementations, for example B-Tree page
-
 
531
        tables.</para>
-
 
532
      </section>
544
      </section>
533
 
545
 
534
      <section id="tlb">
546
      <section id="tlb">
535
        <title>Translation Lookaside buffer</title>
547
        <title>Translation Lookaside buffer</title>
536
 
548
 
Line 544... Line 556...
544
 
556
 
545
          <para>Operating system is responsible for keeping TLB consistent by
557
          <para>Operating system is responsible for keeping TLB consistent by
546
          invalidating the contents of TLB, whenever there is some change in
558
          invalidating the contents of TLB, whenever there is some change in
547
          page tables. Those changes may occur when page or group of pages
559
          page tables. Those changes may occur when page or group of pages
548
          were unmapped, mapping is changed or system switching active address
560
          were unmapped, mapping is changed or system switching active address
549
          space to schedule a new system task (which is a batch unmap of all
561
          space to schedule a new system task. Moreover, this invalidation
550
          address space mappings). Moreover, this invalidation operation must
562
          operation must be done an all system CPUs because each CPU has its
551
          be done an all system CPUs because each CPU has its own independent
563
          own independent TLB cache. Thus maintaining TLB consistency on SMP
552
          TLB cache. Thus maintaining TLB consistency on SMP configuration as
564
          configuration as not as trivial task as it looks on the first
553
          not as trivial task as it looks at the first glance. Naive solution
565
          glance. Naive solution would assume that is the CPU which wants to
554
          would assume remote TLB invalidatation, which is not possible on the
566
          invalidate TLB will invalidate TLB caches on other CPUs. It is not
555
          most of the architectures, because of the simple fact - flushing TLB
567
          possible on the most of the architectures, because of the simple
556
          is allowed only on the local CPU and there is no possibility to
568
          fact - flushing TLB is allowed only on the local CPU and there is no
557
          access other CPUs' TLB caches.</para>
569
          possibility to access other CPUs' TLB caches, thus invalidate TLB
-
 
570
          remotely.</para>
558
 
571
 
559
          <para>Technique of remote invalidation of TLB entries is called "TLB
572
          <para>Technique of remote invalidation of TLB entries is called "TLB
560
          shootdown". HelenOS uses a variation of the algorithm described by
573
          shootdown". HelenOS uses a variation of the algorithm described by
561
          D. Black et al., "Translation Lookaside Buffer Consistency: A
574
          D. Black et al., "Translation Lookaside Buffer Consistency: A
562
          Software Approach," Proc. Third Int'l Conf. Architectural Support
575
          Software Approach," Proc. Third Int'l Conf. Architectural Support
Line 564... Line 577...
564
          113-122.</para>
577
          113-122.</para>
565
 
578
 
566
          <para>As the situation demands, you will want partitial invalidation
579
          <para>As the situation demands, you will want partitial invalidation
567
          of TLB caches. In case of simple memory mapping change it is
580
          of TLB caches. In case of simple memory mapping change it is
568
          necessary to invalidate only one or more adjacent pages. In case if
581
          necessary to invalidate only one or more adjacent pages. In case if
569
          the architecture is aware of ASIDs, during the address space
582
          the architecture is aware of ASIDs, when kernel needs to dump some
570
          switching, kernel invalidates only entries from this particular
583
          ASID to use by another task, it invalidates only entries from this
571
          address space. Final option of the TLB invalidation is the complete
584
          particular address space. Final option of the TLB invalidation is
572
          TLB cache invalidation, which is the operation that flushes all
585
          the complete TLB cache invalidation, which is the operation that
573
          entries in TLB.</para>
586
          flushes all entries in TLB.</para>
574
 
-
 
575
          <para>TLB shootdown is performed in two phases. First, the initiator
-
 
576
          process sends an IPI message indicating the TLB shootdown request to
-
 
577
          the rest of the CPUs. Then, it waits until all CPUs confirm TLB
-
 
578
          invalidating action execution.</para>
-
 
579
        </section>
-
 
580
      </section>
-
 
581
    </section>
-
 
582
 
587
 
583
    <section>
-
 
584
      <title>---</title>
588
          <para>TLB shootdown is performed in two phases.</para>
585
 
589
 
-
 
590
          <formalpara>
586
      <para>At the moment HelenOS does not support swapping.</para>
591
            <title>Phase 1.</title>
587
 
592
 
588
      <para>- pouzivame vypadky stranky k alokaci ramcu on-demand v ramci
593
            <para>First, initiator locks a global TLB spinlock, then request
-
 
594
            is being put to the local request cache of every other CPU in the
-
 
595
            system protected by its spinlock. In case the cache is full, all
589
      as_area - na architekturach, ktere to podporuji, podporujeme non-exec
596
            requests in the cache are replaced by one request, indicating
-
 
597
            global TLB flush. Then the initiator thread sends an IPI message
-
 
598
            indicating the TLB shootdown request to the rest of the CPUs and
-
 
599
            waits actively until all CPUs confirm TLB invalidating action
-
 
600
            execution by setting up a special flag. After setting this flag
-
 
601
            this thread is blocked on the TLB spinlock, held by the
-
 
602
            initiator.</para>
-
 
603
          </formalpara>
-
 
604
 
-
 
605
          <formalpara>
-
 
606
            <title>Phase 2.</title>
-
 
607
 
-
 
608
            <para>All CPUs are waiting on the TLB spinlock to execute TLB
-
 
609
            invalidation action and have indicated their intention to the
-
 
610
            initiator. Initiator continues, cleaning up its TLB and releasing
-
 
611
            the global TLB spinlock. After this all other CPUs gain and
-
 
612
            immidiately release TLB spinlock and perform TLB invalidation
590
      stranky</para>
613
            actions.</para>
-
 
614
          </formalpara>
-
 
615
        </section>
-
 
616
      </section>
591
    </section>
617
    </section>
592
  </section>
618
  </section>
593
</chapter>
619
</chapter>
594
620