Subversion Repositories HelenOS-doc

Rev

Rev 133 | Rev 146 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
122 jermar 1
<?xml version="1.0" encoding="UTF-8"?>
126 jermar 2
<appendix id="archspecs">
130 palkovsky 3
  <?dbhtml filename="arch.html"?>
4
 
133 jermar 5
  <title>Architecture Specific Notes</title>
122 jermar 6
 
7
  <section>
130 palkovsky 8
    <title>AMD64/Intel EM64T</title>
122 jermar 9
 
133 jermar 10
    <para>The amd64 architecture is a 64-bit extension of the older ia32
130 palkovsky 11
    architecture. Only 64-bit applications are supported. Creating this port
133 jermar 12
    was relatively easy, because it shares a lot of common code with ia32
130 palkovsky 13
    platform. However, the 64-bit extension has some specifics, which made the
14
    porting interesting.</para>
15
 
16
    <section>
17
      <title>Virtual Memory</title>
18
 
133 jermar 19
      <para>The amd64 architecture uses standard processor defined 4-level
130 palkovsky 20
      page mapping of 4KB pages. The NX(no-execute) flag on individual pages
21
      is fully supported.</para>
22
    </section>
23
 
24
    <section>
25
      <title>TLB-only Paging</title>
26
 
133 jermar 27
      <para>All memory on the amd64 architecture is memory mapped, if the
130 palkovsky 28
      kernel needs to access physical memory, a mapping must be created.
29
      During boot process the boot loader creates mapping for the first 20MB
30
      of physical memory. To correctly initialize the page mapping system, an
31
      identity mapping of whole physical memory must be created. However, to
32
      create the mapping it is unavoidable to allocate new - possibly unmapped
33
      - frames from frame allocator. The ia32 solves it by mapping first 2GB
34
      memory during boot process. The same solution on 64-bit platform becomes
35
      unfeasible because of the size of the possible address space.</para>
36
 
37
      <para>As soon as the exception routines are initialized, a special page
38
      fault exception handler is installed which provides a complete view of
39
      physical memory until the real page mapping system is initialized. It
40
      dynamically changes the page tables to always contain exactly the
41
      faulting address. The page then becomes cached in the TLB and on the
42
      next page fault the same tables can be utilized to handle another
43
      mapping.</para>
44
    </section>
45
 
46
    <section>
47
      <title>Mapping of Physical Memory</title>
48
 
133 jermar 49
      <para>The amd64 ABI document describes several modes of program layout.
130 palkovsky 50
      The operating system kernel should be compiled in a
51
      <emphasis>kernel</emphasis> mode - the kernel is located in the negative
52
      2 gigabytes (0xffffffff80000000-0xfffffffffffffffff) and can access data
53
      anywhere in the 64-bit space. This wouldn't allow kernel to see directly
54
      more than 2GB of physical memory. HelenOS duplicates the virtual mapping
55
      of the physical memory starting at 0xffff800000000000 and accesses all
56
      external references using this address range.</para>
57
    </section>
58
 
59
    <section>
60
      <title>Thread Local Storage</title>
61
 
62
      <para>The code accessing thread local storage uses a segment register FS
63
      as a base. The thread local storage is stored in the hidden 64-bit part
64
      of the FS register which must be written using priviledged machine
65
      specific instructions. Special syscall to change this register is
66
      provided to user applications. The TLS address for this platform is
137 palkovsky 67
      expected to point just after the end of the thread local data. The
68
      application sometimes need to get a real address of the thread local
69
      data in its address space but it is impossible to read the base of the
70
      FS segmentation register. The solution is to add the self-reference
71
      address to the end of thread local data, so that the application can
72
      read the address as %gs:0. </para>
73
 
74
      <figure float="1">
75
        <title>IA32 &amp; AMD64</title>
76
 
77
        <mediaobject id="tldia32">
78
          <imageobject role="pdf">
79
            <imagedata fileref="images/tld_ia32.pdf" format="PDF" />
80
          </imageobject>
81
 
82
          <imageobject role="html">
83
            <imagedata fileref="images/tld_ia32.png" format="PNG" />
84
          </imageobject>
85
 
86
          <imageobject role="fop">
87
            <imagedata fileref="images/tld_ia32.svg" format="SVG" />
88
          </imageobject>
89
        </mediaobject>
90
      </figure>
130 palkovsky 91
    </section>
92
 
93
    <section>
94
      <title>Fast SYSCALL/SYSRET Support</title>
95
 
96
      <para>The entry point for system calls was traditionally a speed problem
133 jermar 97
      on the ia32 architecture. The amd64 supports SYSCALL/SYSRET
98
      instructions. Upon encountering the SYSCALL instruction, the processor
99
      changes privilege mode and transfers control to an address stored in
100
      machine specific register. Unlike other similar instructions it does not
101
      change stack to a known kernel stack, which must be done by the syscall
102
      entry routine. A hidden part of a GS register is provided to support the
103
      entry routine with data needed for switching to kernel stack.</para>
130 palkovsky 104
    </section>
105
 
106
    <section>
107
      <title>Debugging Support</title>
108
 
109
      <para>To provide developers tools for finding bugs, hardware breakpoints
110
      and watchpoints are supported. The kernel also supports self-debugging -
111
      it sets watchpoints on certain data and upon every modification
112
      automatically checks whether a correct value was written. It is
113
      worthwhile to mention, that since this feature was implemented, the
114
      watchpoint was never fired.</para>
115
    </section>
122 jermar 116
  </section>
130 palkovsky 117
 
118
  <section>
133 jermar 119
    <title>Intel IA-32</title>
130 palkovsky 120
 
133 jermar 121
    <para>The ia32 architecture uses 4K pages and processor supported 2-level
122
    page tables. Along with amd64 It is one of the 2 architectures that fully
123
    supports SMP configurations. The architecture is mostly similar to amd64,
124
    it even shares a lot of code. The debugging support is the same as with
125
    amd64. The thread local storage uses GS register.</para>
130 palkovsky 126
  </section>
127
 
128
  <section>
133 jermar 129
    <title>32-bit MIPS</title>
130 palkovsky 130
 
131
    <para>Both little and big endian kernels are supported. In order to test
133 jermar 132
    different page sizes, the mips32 page size was set to 16K. The mips32
133
    architecture is TLB-only, the kernel simulates 2-level page tables. On
134
    processors that support it, lazy FPU context switching is
135
    implemented.</para>
130 palkovsky 136
 
137
    <section>
138
      <title>Thread Local Storage</title>
139
 
140
      <para>The thread local storage support in compilers is a relatively
133 jermar 141
      recent phenomena. The standardization of such support for the mips32
142
      platform is very new and even the newest versions of GCC cannot generate
143
      100% correct code. Because of some weird MIPS processor variants, it was
130 palkovsky 144
      decided, that the TLS pointer will be gathered not from some of the free
145
      registers, but a special instruction was devised and the kernel is
146
      supposed to emulate it. HelenOS expects that the TLS pointer is in the
147
      K1 register. Upon encountering the reserved instruction exception and
148
      checking that the application is requesting a TLS pointer, it returns
149
      the contents of the K1 register. The K1 register is expected to point
150
      0x7000 bytes after the beginning of the thread local data.</para>
137 palkovsky 151
 
152
      <figure float="1">
153
        <title>MIPS &amp; PPC</title>
154
 
155
        <mediaobject id="tldmips">
156
          <imageobject role="pdf">
157
            <imagedata fileref="images/tld_mips.pdf" format="PDF" />
158
          </imageobject>
159
 
160
          <imageobject role="html">
161
            <imagedata fileref="images/tld_mips.png" format="PNG" />
162
          </imageobject>
163
 
164
          <imageobject role="fop">
165
            <imagedata fileref="images/tld_mips.svg" format="SVG" />
166
          </imageobject>
167
        </mediaobject>
168
      </figure>
130 palkovsky 169
    </section>
170
  </section>
171
 
172
  <section>
173
    <title>Power PC</title>
174
 
175
    <para></para>
137 palkovsky 176
 
177
    <section>
178
      <title>Thread Local Storage</title>
179
 
180
      <para>The Power PC thread local storage uses R2 register to hold an
181
      address, that is 0x7000 bytes after the beginning of the thread local
182
      data. Overally it is the same as on the MIPS architecture.</para>
183
    </section>
130 palkovsky 184
  </section>
185
 
186
  <section>
187
    <title>IA-64</title>
188
 
189
    <para></para>
137 palkovsky 190
 
191
    <figure float="1">
192
      <title>IA64</title>
193
 
194
      <mediaobject id="tldia64">
195
        <imageobject role="pdf">
196
          <imagedata fileref="images/tld_ia64.pdf" format="PDF" />
197
        </imageobject>
198
 
199
        <imageobject role="html">
200
          <imagedata fileref="images/tld_ia64.png" format="PNG" />
201
        </imageobject>
202
 
203
        <imageobject role="fop">
204
          <imagedata fileref="images/tld_ia64.svg" format="SVG" />
205
        </imageobject>
206
      </mediaobject>
207
    </figure>
130 palkovsky 208
  </section>
122 jermar 209
</appendix>