Subversion Repositories HelenOS-doc

Rev

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

Rev 83 Rev 84
Line 532... Line 532...
532
      processor. Maintaining TLB consistency on multiprocessor configurations
532
      processor. Maintaining TLB consistency on multiprocessor configurations
533
      is not as trivial as it might look from the first glance.</para>
533
      is not as trivial as it might look from the first glance.</para>
534
 
534
 
535
      <para>The remote TLB invalidation is called TLB shootdown. HelenOS uses
535
      <para>The remote TLB invalidation is called TLB shootdown. HelenOS uses
536
      a simplified variant of the algorithm described in <xref
536
      a simplified variant of the algorithm described in <xref
537
      linkend="Black89" />. </para>
537
      linkend="Black89" />.</para>
538
 
538
 
539
      <para>TLB shootdown is performed in three phases.</para>
539
      <para>TLB shootdown is performed in three phases.</para>
540
 
540
 
541
      <formalpara>
541
      <formalpara>
542
        <title>Phase 1.</title>
542
        <title>Phase 1.</title>
Line 570... Line 570...
570
        TLB according to messages found in its TLB shootdown message queue. In
570
        TLB according to messages found in its TLB shootdown message queue. In
571
        the end, each processor sets its TLB flag and resumes its previous
571
        the end, each processor sets its TLB flag and resumes its previous
572
        operation.</para>
572
        operation.</para>
573
      </formalpara>
573
      </formalpara>
574
    </section>
574
    </section>
-
 
575
  </section>
-
 
576
 
-
 
577
  <section>
-
 
578
    <title>Address spaces</title>
-
 
579
 
-
 
580
    <para>last bits about address spaces</para>
575
 
581
 
576
    <section>
582
    <section>
-
 
583
      <indexterm>
-
 
584
        <primary>address space</primary>
-
 
585
 
-
 
586
        <secondary>- ASID</secondary>
-
 
587
      </indexterm>
-
 
588
 
577
      <title>Address spaces</title>
589
      <title>Address Space ID (ASID)</title>
578
 
590
 
579
      <section>
-
 
580
        <indexterm>
-
 
581
          <primary>address space</primary>
591
      <para>Modern processor architectures optimize TLB utilization by
582
 
-
 
583
          <secondary>- area</secondary>
592
      associating TLB entries with address spaces through assigning
584
        </indexterm>
-
 
585
 
-
 
586
        <title>Address space areas</title>
593
      identification numbers to them. In HelenOS, the term ASID, originally
587
 
-
 
588
        <para>Each address space consists of mutually disjunctive continuous
594
      taken from the mips32 terminology, is used to refer to the address space
589
        address space areas. Address space area is precisely defined by its
595
      identification number. The advantage of having ASIDs is that TLB does
590
        base address and the number of frames/pages is contains.</para>
596
      not have to be invalidated on thread context switch as long as ASIDs are
591
 
-
 
592
        <para>Address space area , that define behaviour and permissions on
597
      unique. Unfotunatelly, architectures supported by HelenOS use all
593
        the particular area. <itemizedlist>
598
      different widths of ASID numbers<footnote>
594
            <listitem><emphasis>AS_AREA_READ</emphasis> flag indicates reading
599
          <para>amd64 and ia32 don't use similar abstraction at all, mips32
595
            permission.</listitem>
-
 
596
 
-
 
597
            <listitem><emphasis>AS_AREA_WRITE</emphasis> flag indicates
600
          has 8-bit ASIDs and ia64 can have ASIDs between 18 to 24 bits
598
            writing permission.</listitem>
601
          wide.</para>
599
 
-
 
600
            <listitem><emphasis>AS_AREA_EXEC</emphasis> flag indicates code
602
        </footnote> out of which none is sufficient. The amd64 and ia32
601
            execution permission. Some architectures do not support execution
603
      architectures cannot make use of ASIDs as their TLB doesn't recognize
602
            persmission restriction. In this case this flag has no
604
      such an abstraction. Other architectures have support for ASIDs, but for
603
            effect.</listitem>
605
      instance ppc32 doesn't make use of them in the current version of
604
 
-
 
605
            <listitem><emphasis>AS_AREA_DEVICE</emphasis> marks area as mapped
606
      HelenOS. The rest of the architectures does use ASIDs. However, even on
606
            to the device memory.</listitem>
607
      the ia64 architecture, the minimal supported width of ASID<footnote>
607
          </itemizedlist></para>
608
          <para>RID in ia64 terminology.</para>
608
 
-
 
609
        <para>Kernel provides possibility tasks create/expand/shrink/share its
609
        </footnote> is insufficient to provide a unique integer identifier to
610
        address space via the set of syscalls.</para>
610
      all address spaces that might hypothetically coexist in the running
-
 
611
      system. The situation on mips32 is even worse: the architecture has only
611
      </section>
612
      256 unique identifiers.</para>
612
 
613
 
613
      <section>
-
 
614
        <indexterm>
614
      <indexterm>
615
          <primary>address space</primary>
615
        <primary>address space</primary>
616
 
616
 
617
          <secondary>- ASID</secondary>
617
        <secondary>- ASID stealing</secondary>
618
        </indexterm>
618
      </indexterm>
619
 
619
 
620
        <title>Address Space ID (ASID)</title>
620
      <para>To mitigate the shortage of ASIDs, HelenOS uses the following
621
 
-
 
622
        <para>Every task in the operating system has it's own view of the
621
      strategy. When the system initializes, a FIFO queue<footnote>
623
        virtual memory. When performing context switch between different
622
          <para>Note that architecture-specific measures are taken to avoid
624
        tasks, the kernel must switch the address space mapping as well. As
623
          too large FIFO queue. For instance, seven consecutive ia64 RIDs are
625
        modern processors perform very aggressive caching of virtual mappings,
624
          grouped to form one HelenOS ASID.</para>
626
        flushing the complete TLB on every context switch would be very
625
        </footnote> is created and filled with all available ASIDs. Moreover,
627
        inefficient. To avoid such performance penalty, some architectures
626
      every address space remembers the number of processors on which it is
628
        introduce an address space identifier, which allows storing several
627
      active. Address spaces that have a valid ASID and that are not active on
629
        different mappings inside TLB.</para>
-
 
630
 
-
 
631
        <para>HelenOS kernel can take advantage of this hardware support by
628
      any processor are appended to the list of inactive address spaces with
632
        having an ASID abstraction. I.e. on ia64 kernel ASID is derived from
629
      valid ASID. When an address space needs to be assigned a valid ASID, it
633
        RID (region identifier) and on the mips32 kernel ASID is actually the
630
      first checks the FIFO queue. If it contains at least one ASID, the ASID
634
        hardware identifier. As expected, this ASID information record is the
631
      is allocated. If the queue is empty, an ASID is simply stolen from the
635
        part of <emphasis>as_t</emphasis> structure.</para>
632
      first address space in the list. In that case, the address space that
636
 
-
 
637
        <para>Due to the hardware limitations, hardware ASID has limited
633
      loses the ASID in favor of another address space, is removed from the
638
        length from 8 bits on ia64 to 24 bits on mips32, which makes it
634
      list. After the new ASID is purged from all TLBs, it can be used by the
639
        impossible to use it as unique address space identifier for all tasks
635
      address space. Note that this approach works due to the fact that the
640
        running in the system. In such situations special ASID stealing
636
      number of ASIDs is greater than the maximal number of processors
641
        algoritm is used, which takes ASID from inactive task and assigns it
637
      supported by HelenOS and that there can be only one active address space
642
        to the active task.</para>
-
 
643
 
-
 
644
        <indexterm>
-
 
645
          <primary>address space</primary>
-
 
646
 
-
 
647
          <secondary>- ASID stealing</secondary>
638
      per processor. In other words, when the FIFO queue is empty, there must
648
        </indexterm>
-
 
649
 
-
 
650
        <para>
-
 
651
          <classname>ASID stealing algoritm here.</classname>
639
      be address spaces that are not active on any processor.</para>
652
        </para>
-
 
653
      </section>
-
 
654
    </section>
640
    </section>
655
  </section>
641
  </section>
656
</chapter>
642
</chapter>
657
643