{"componentChunkName":"component---src-templates-post-template-js","path":"/unix-xv6-009-kernel-main-06-en","result":{"data":{"markdownRemark":{"id":"8c8ff4b3-24ec-5dbc-a702-c06ff7441db9","html":"<blockquote>\n<p>This page has been machine-translated from the <a href=\"/unix-xv6-009-kernel-main-06\">original page</a>.</p>\n</blockquote>\n<p>Inspired by <a href=\"https://amzn.to/3q8TU3K\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">An Introduction to OS Code Reading: Learning Kernel Internals with UNIX V6</a>, I’m reading <a href=\"https://github.com/mit-pdos/xv6-public\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">xv6 OS</a>.</p>\n<p>Because UNIX V6 itself does not run on x86 CPUs, I decided to read the source of <a href=\"https://github.com/kash1064/xv6-public\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">kash1064/xv6-public: xv6 OS</a>, a fork of the <a href=\"https://github.com/mit-pdos/xv6-public\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">xv6 OS</a> repository that makes UNIX V6 run on the x86 architecture.</p>\n<p>In the <a href=\"/unix-xv6-008-kernel-main-05-en\">previous article</a>, I looked at the <code class=\"language-text\">seginit</code> function executed from <code class=\"language-text\">main</code>.</p>\n<p>This time, I will trace the behavior of <code class=\"language-text\">picinit</code> and <code class=\"language-text\">ioapicinit</code>.</p>\n<!-- omit in toc -->\n<h2 id=\"table-of-contents\" style=\"position:relative;\"><a href=\"#table-of-contents\" aria-label=\"table of contents permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Table of Contents</h2>\n<ul>\n<li><a href=\"#the-picinit-function\">The <code class=\"language-text\">picinit</code> function</a></li>\n<li>\n<p><a href=\"#the-ioapicinit-function\">The <code class=\"language-text\">ioapicinit</code> function</a></p>\n<ul>\n<li><a href=\"#accessing-the-memory-mapped-ioapic-register-region\">Accessing the memory-mapped IOAPIC register region</a></li>\n<li><a href=\"#reading-and-writing-data-via-the-data-register\">Reading and writing data via the Data register</a></li>\n<li><a href=\"#initializing-the-redirection-table\">Initializing the Redirection Table</a></li>\n</ul>\n</li>\n<li><a href=\"#summary\">Summary</a></li>\n<li><a href=\"#reference-books\">Reference Books</a></li>\n</ul>\n<h2 id=\"the-picinit-function\" style=\"position:relative;\"><a href=\"#the-picinit-function\" aria-label=\"the picinit function permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>The <code class=\"language-text\">picinit</code> function</h2>\n<p>The <code class=\"language-text\">picinit</code> function is defined in <code class=\"language-text\">picirq.c</code>.</p>\n<p>It is a very small function, as shown below.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">\"types.h\"</span></span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">\"x86.h\"</span></span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">\"traps.h\"</span></span>\n\n<span class=\"token comment\">// I/O Addresses of the two programmable interrupt controllers</span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">define</span> <span class=\"token macro-name\">IO_PIC1</span>         <span class=\"token expression\"><span class=\"token number\">0x20</span>    </span><span class=\"token comment\">// Master (IRQs 0-7)</span></span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">define</span> <span class=\"token macro-name\">IO_PIC2</span>         <span class=\"token expression\"><span class=\"token number\">0xA0</span>    </span><span class=\"token comment\">// Slave (IRQs 8-15)</span></span>\n\n<span class=\"token comment\">// Don't use the 8259A interrupt controllers.  Xv6 assumes SMP hardware.</span>\n<span class=\"token keyword\">void</span> <span class=\"token function\">picinit</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">void</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// mask all interrupts</span>\n  <span class=\"token function\">outb</span><span class=\"token punctuation\">(</span>IO_PIC1<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0xFF</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">outb</span><span class=\"token punctuation\">(</span>IO_PIC2<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0xFF</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">//PAGEBREAK!</span>\n<span class=\"token comment\">// Blank page.</span></code></pre></div>\n<p><code class=\"language-text\">outb</code> is the following function defined in <code class=\"language-text\">x86.h</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">static</span> <span class=\"token keyword\">inline</span> <span class=\"token keyword\">void</span> <span class=\"token function\">outb</span><span class=\"token punctuation\">(</span>ushort port<span class=\"token punctuation\">,</span> uchar data<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">asm</span> <span class=\"token keyword\">volatile</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"out %0,%1\"</span> <span class=\"token operator\">:</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"a\"</span> <span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"d\"</span> <span class=\"token punctuation\">(</span>port<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>It emits assembly that sends data to an arbitrary port.</p>\n<p>Reference: <a href=\"https://stackoverflow.com/questions/8365746/what-does-outb-in-att-asm-mean\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">assembly - what does “outb” in AT&#x26;T asm mean? - Stack Overflow</a></p>\n<p>Here it masks the ports <code class=\"language-text\">0x21</code> and <code class=\"language-text\">0xA1</code>, which are related to the <code class=\"language-text\">8259 PIC</code>.</p>\n<p>The <code class=\"language-text\">8259 PIC</code> is an interrupt controller that accepts interrupt requests and sends them to the CPU, but xv6OS assumes SMP hardware and implements interrupts with APICs, so it has to be disabled.</p>\n<p>Here, both <code class=\"language-text\">0x21</code> and <code class=\"language-text\">0xA1</code> are data ports of the <code class=\"language-text\">8259 PIC</code>.</p>\n<p>As described in the OSDev wiki below, when interrupts are implemented with the local APIC and IOAPIC, the <code class=\"language-text\">8259 PIC</code> is disabled by writing <code class=\"language-text\">0xFF</code> to these data ports.</p>\n<p>Reference: <a href=\"https://wiki.osdev.org/PIC\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">8259 PIC - OSDev Wiki</a></p>\n<p>Reference: <a href=\"https://stackoverflow.com/questions/62329557/i-o-port-addressing\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">assembly - I/O Port Addressing - Stack Overflow</a></p>\n<h2 id=\"the-ioapicinit-function\" style=\"position:relative;\"><a href=\"#the-ioapicinit-function\" aria-label=\"the ioapicinit function permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>The <code class=\"language-text\">ioapicinit</code> function</h2>\n<p>The processing in <code class=\"language-text\">picinit</code> is now complete, and the PIC has been disabled.</p>\n<p>Next, <code class=\"language-text\">ioapicinit</code>, which is defined in <code class=\"language-text\">ioapic.c</code>, is called from <code class=\"language-text\">main</code>.</p>\n<p>This function initializes the IOAPIC.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">void</span> <span class=\"token function\">ioapicinit</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">void</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">int</span> i<span class=\"token punctuation\">,</span> id<span class=\"token punctuation\">,</span> maxintr<span class=\"token punctuation\">;</span>\n\n  ioapic <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">volatile</span> <span class=\"token keyword\">struct</span> <span class=\"token class-name\">ioapic</span><span class=\"token operator\">*</span><span class=\"token punctuation\">)</span>IOAPIC<span class=\"token punctuation\">;</span>\n  maxintr <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token function\">ioapicread</span><span class=\"token punctuation\">(</span>REG_VER<span class=\"token punctuation\">)</span> <span class=\"token operator\">>></span> <span class=\"token number\">16</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0xFF</span><span class=\"token punctuation\">;</span>\n  id <span class=\"token operator\">=</span> <span class=\"token function\">ioapicread</span><span class=\"token punctuation\">(</span>REG_ID<span class=\"token punctuation\">)</span> <span class=\"token operator\">>></span> <span class=\"token number\">24</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>id <span class=\"token operator\">!=</span> ioapicid<span class=\"token punctuation\">)</span> <span class=\"token function\">cprintf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"ioapicinit: id isn't equal to ioapicid; not a MP\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// Mark all interrupts edge-triggered, active high, disabled,</span>\n  <span class=\"token comment\">// and not routed to any CPUs.</span>\n  <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span>i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;=</span> maxintr<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    <span class=\"token function\">ioapicwrite</span><span class=\"token punctuation\">(</span>REG_TABLE<span class=\"token operator\">+</span><span class=\"token number\">2</span><span class=\"token operator\">*</span>i<span class=\"token punctuation\">,</span> INT_DISABLED <span class=\"token operator\">|</span> <span class=\"token punctuation\">(</span>T_IRQ0 <span class=\"token operator\">+</span> i<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">ioapicwrite</span><span class=\"token punctuation\">(</span>REG_TABLE<span class=\"token operator\">+</span><span class=\"token number\">2</span><span class=\"token operator\">*</span>i<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Let’s look through the code in order.</p>\n<h3 id=\"accessing-the-memory-mapped-ioapic-register-region\" style=\"position:relative;\"><a href=\"#accessing-the-memory-mapped-ioapic-register-region\" aria-label=\"accessing the memory mapped ioapic register region permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Accessing the memory-mapped IOAPIC register region</h3>\n<p>In the line <code class=\"language-text\">ioapic = (volatile struct ioapic*)IOAPIC;</code>, the variable <code class=\"language-text\">ioapic</code> is set to point to an <code class=\"language-text\">ioapic</code> structure.</p>\n<p><code class=\"language-text\">IOAPIC</code> is defined as <code class=\"language-text\">0xFEC00000</code> in <code class=\"language-text\">ioapic.c</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">// ioapic.c</span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">define</span> <span class=\"token macro-name\">IOAPIC</span>  <span class=\"token expression\"><span class=\"token number\">0xFEC00000</span>   </span><span class=\"token comment\">// Default physical address of IO APIC</span></span></code></pre></div>\n<p>Because the default IOAPIC address is guaranteed to be <code class=\"language-text\">0xFEC00000</code>, this address is specified as a fixed value.</p>\n<p>Reference: <a href=\"https://stackoverflow.com/questions/24828186/about-the-io-apic-82093aa\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">x86 - About the IO-APIC 82093AA - Stack Overflow</a></p>\n<p>The <code class=\"language-text\">ioapic</code> structure itself is very simple:</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">// IO APIC MMIO structure: write reg, then read or write data.</span>\n<span class=\"token keyword\">struct</span> <span class=\"token class-name\">ioapic</span> <span class=\"token punctuation\">{</span>\n  uint reg<span class=\"token punctuation\">;</span>\n  uint pad<span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  uint data<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Reference: <a href=\"http://web.archive.org/web/20161130153145/http://download.intel.com/design/chipsets/datashts/29056601.pdf\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Memory Mapped Registers for Accessing IOAPIC Registers</a></p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 500px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/45b8bf0613c0fee518900e712948f7c0/0b533/image-6.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 17.916666666666668%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAARlAAAEZQAGA43XUAAAA4klEQVQY0y2O6W6DMBCE8/6PVvVX2uYCwhpiDJgz2E5KVX11aVdazcweo9kp6zCj51B07KXlTSwvl5rXtKGbFh4hMC+euwuEyBf3qwNTnIXwwHnP4v93EXfE+v5amYaep1+4mYaPrGToe9xyR+uKw1VzzDXGGKSy7JOS90xj+xFRJRfRtE3DOeJm+Hx+0nU90zyjRDgfj4gonHPYtsXoG6aKT5E/gkfyjLY2W3rJc86nE000lPz6Z7iuK9Za+phKKUWSJBRlyTiOW6qiKGKXGx+GARW1MfW2lxggTVOqqtrufgDVECrAWoI6dQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/45b8bf0613c0fee518900e712948f7c0/8ac56/image-6.webp 240w,\n/static/45b8bf0613c0fee518900e712948f7c0/d3be9/image-6.webp 480w,\n/static/45b8bf0613c0fee518900e712948f7c0/b0a15/image-6.webp 500w\"\n              sizes=\"(max-width: 500px) 100vw, 500px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/45b8bf0613c0fee518900e712948f7c0/8ff5a/image-6.png 240w,\n/static/45b8bf0613c0fee518900e712948f7c0/e85cb/image-6.png 480w,\n/static/45b8bf0613c0fee518900e712948f7c0/0b533/image-6.png 500w\"\n            sizes=\"(max-width: 500px) 100vw, 500px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/45b8bf0613c0fee518900e712948f7c0/0b533/image-6.png\"\n            alt=\"2022/02/image-6.png\"\n            title=\"2022/02/image-6.png\"\n            loading=\"lazy\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>Reference image: <a href=\"https://www.intel.com/content/dam/www/public/us/en/documents/datasheets/9-series-chipset-pch-datasheet.pdf\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Intel 9 Series Chipset Platform Controller Hub Datasheet</a></p>\n<p>The first member, <code class=\"language-text\">reg</code>, is used as an index, and data is then read or written through the <code class=\"language-text\">data</code> area.</p>\n<p>I was curious about what values were actually stored in the <code class=\"language-text\">ioapic</code> region at boot, so I checked it in the debugger.</p>\n<p>I looked at 20 bytes starting at <code class=\"language-text\">0xFEC00000</code>, and at this point everything was zero.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">$ x/5wx 0xfec00000\n0xfec00000:0x000000000x000000000x000000000x00000000\n0xfec00010:0x00000000</code></pre></div>\n<h3 id=\"reading-and-writing-data-via-the-data-register\" style=\"position:relative;\"><a href=\"#reading-and-writing-data-via-the-data-register\" aria-label=\"reading and writing data via the data register permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Reading and writing data via the Data register</h3>\n<p>Next, look at the following code.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">maxintr <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token function\">ioapicread</span><span class=\"token punctuation\">(</span>REG_VER<span class=\"token punctuation\">)</span> <span class=\"token operator\">>></span> <span class=\"token number\">16</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0xFF</span><span class=\"token punctuation\">;</span>\nid <span class=\"token operator\">=</span> <span class=\"token function\">ioapicread</span><span class=\"token punctuation\">(</span>REG_ID<span class=\"token punctuation\">)</span> <span class=\"token operator\">>></span> <span class=\"token number\">24</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>id <span class=\"token operator\">!=</span> ioapicid<span class=\"token punctuation\">)</span> <span class=\"token function\">cprintf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"ioapicinit: id isn't equal to ioapicid; not a MP\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The <code class=\"language-text\">ioapicread</code> function writes the received value to <code class=\"language-text\">ioapic->reg</code>, then reads and returns the value of <code class=\"language-text\">data</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">static</span> uint <span class=\"token function\">ioapicread</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> reg<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  ioapic<span class=\"token operator\">-></span>reg <span class=\"token operator\">=</span> reg<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> ioapic<span class=\"token operator\">-></span>data<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>In the IOAPIC, <code class=\"language-text\">ioapic->reg</code> is used as an index register, so data can be read and written indirectly.</p>\n<p>The correspondence between index values and registers is as follows.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 500px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/0f8fc332e216b95790c9d23b8ce7a518/0b533/image-5.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 32.08333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAARlAAAEZQAGA43XUAAABI0lEQVQY00VR226EIBD1/3/PPjTqpl5BEbnsimB1PR2IbUnICTDnMkMmrMdkA8waUDGFYlBoRo2PRqJkGtvmcRwHVsLZrFBPh80HfO87nNvwdB5+22DXDSEEZLjX+zwgpQSbJNzLouMCPZ/BOUfb1OjYSEYKvVAw9pVEGL19Vl+JVzU9tDHI3teVBEPYwRgDpz1NAmqRWOSMuq5RliWstVjJ6GkNjNbQ2qR6NvQYxxEjZ3SnkV234HmeEEKg6zoiWVRVhaZtk2Ce56geD4h5xk6teu8TxvqWaiIWZGpiwusvYaBkE2YiTeTYk3DX9RiGIRF+MSaNxIgp4d1VxGVZ/gXj4AUJDvSglEptRIOYoCgKcDpLIjianXP0MYTJ/A4RO4tGP9vhxMmussmZAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/0f8fc332e216b95790c9d23b8ce7a518/8ac56/image-5.webp 240w,\n/static/0f8fc332e216b95790c9d23b8ce7a518/d3be9/image-5.webp 480w,\n/static/0f8fc332e216b95790c9d23b8ce7a518/b0a15/image-5.webp 500w\"\n              sizes=\"(max-width: 500px) 100vw, 500px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/0f8fc332e216b95790c9d23b8ce7a518/8ff5a/image-5.png 240w,\n/static/0f8fc332e216b95790c9d23b8ce7a518/e85cb/image-5.png 480w,\n/static/0f8fc332e216b95790c9d23b8ce7a518/0b533/image-5.png 500w\"\n            sizes=\"(max-width: 500px) 100vw, 500px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/0f8fc332e216b95790c9d23b8ce7a518/0b533/image-5.png\"\n            alt=\"2022/02/image-5.png\"\n            title=\"2022/02/image-5.png\"\n            loading=\"lazy\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>Reference image: <a href=\"https://www.intel.com/content/dam/www/public/us/en/documents/datasheets/9-series-chipset-pch-datasheet.pdf\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Intel 9 Series Chipset Platform Controller Hub Datasheet</a></p>\n<p>Reference: <a href=\"https://mmi.hatenablog.com/entry/2017/04/09/132708\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">I/O APICについて - 睡分不足</a></p>\n<p>The line <code class=\"language-text\">maxintr = (ioapicread(REG_VER) >> 16) &amp; 0xFF;</code> gets version information by setting the index register to 1.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">$ x/5wx 0xfec00000\n0xfec00000:0x000000010x000000000x000000000x00000000\n0xfec00010:0x00170020</code></pre></div>\n<p><code class=\"language-text\">maxintr</code> becomes <code class=\"language-text\">0x17</code>.</p>\n<p>This seems to be retrieving the MRE field in bits 23:16 of the version register.</p>\n<p>It looks like this value is the number of interrupt input pins minus one. (Perhaps this corresponds to the maximum number of interrupts that can be defined?)</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 500px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/32a6e216be2c56ffd4c31ca9ea42dd60/0b533/image-7.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 61.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAARlAAAEZQAGA43XUAAAB/klEQVQoz21T246qQBDk/z/Kl3UTox6NsnIVkIuACgLe1wdru1o9l+RM0umZpma6qmYwpn4ONy5hrUp4eQsn2WGRNTDTBvXxBo7H46HBcbvd0LYtrterRtd1OJ1Ov3FG4HsIlr7G9XJGliYoixzn0xH/G3VVYbkM9OCyLOC6Lo7HP1gjTRIkSYogCJCt1wJeIpZaGEaI41gjTVNEUaSxFgxrnK9WK81t2+FyuWgTYz6fySE+fN+H53lwHEdAK3jSmd19qUVhqBuXgmFjz3MVxzkzSXBvUZYiOQjRds8O9ONwOKgEBtfM/F43HZr2oN/fGGb6+V7zDCPJt0jXJQ5q7llpvw1n3L+/UbdHeFmFqNjrpr+DmHfe7/cwfLkU27bxazyGaZoqkfIpg5Isy1LP1lmGIs/VT/rInEkt0TuQixS5lVyYQVlVtcN0OpGYYj6bYT439XDbtjCZTNRL79XIlgb0lyToH2vOa14U4uH9flcPXNdRJqTdNC222y02m42ACux2O2WQC0PWy3KjazLl9+1GsLJm3ajqWumPRyN89Pv4/Oyj1+thMBhgJLXhcKiZDMjashZYLBY6Z5Ad17SGFhh8S/SKRW4iS8pg91qaMehN0zTK/qmg+SfeNSoxEn3Eofpnfn3pY6UMNf5l+POBPxtzTgz3xJI5pzX8/dj8B//bc+BEHWN+AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/32a6e216be2c56ffd4c31ca9ea42dd60/8ac56/image-7.webp 240w,\n/static/32a6e216be2c56ffd4c31ca9ea42dd60/d3be9/image-7.webp 480w,\n/static/32a6e216be2c56ffd4c31ca9ea42dd60/b0a15/image-7.webp 500w\"\n              sizes=\"(max-width: 500px) 100vw, 500px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/32a6e216be2c56ffd4c31ca9ea42dd60/8ff5a/image-7.png 240w,\n/static/32a6e216be2c56ffd4c31ca9ea42dd60/e85cb/image-7.png 480w,\n/static/32a6e216be2c56ffd4c31ca9ea42dd60/0b533/image-7.png 500w\"\n            sizes=\"(max-width: 500px) 100vw, 500px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/32a6e216be2c56ffd4c31ca9ea42dd60/0b533/image-7.png\"\n            alt=\"2022/02/image-7.png\"\n            title=\"2022/02/image-7.png\"\n            loading=\"lazy\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>Reference image: <a href=\"https://www.intel.com/content/dam/www/public/us/en/documents/datasheets/9-series-chipset-pch-datasheet.pdf\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Intel 9 Series Chipset Platform Controller Hub Datasheet</a></p>\n<p>In the next line, <code class=\"language-text\">id</code> was read as <code class=\"language-text\">0x0</code>.</p>\n<p>This is the value in bits 27:24 of the ID register, which represents the APIC ID. (Since the first one is 0, maybe the value is 0 on the first run?)</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 500px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/f20954147f64329fe787e7a1456b66e2/0b533/image-8.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 42.91666666666667%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAARlAAAEZQAGA43XUAAABZUlEQVQoz5VS126DQBC8//+xSFHiJrkCphsw1TgugOzJzspO5Ic85KTRnrbM7A2YVVzhfZPgwynw6ewx2hawsi+M3BJvmz3srAXP7XbXOAwDLpcL+r5H110lf9P8/X5XGMuysFou0dQVDk0N27ZRliX+Ommaas8w9AiDAHlRvNQNi57nIQxDJEkC3/fhui52ux3yPFdkWYY4jkWokr7gcS8RRSF8mWW9EOK6rmE8GSaZ4ziqHIgqCdfrtUZXBhzbgr1ZI0sT8EUkfPZzGd6jKMLpdIYJ0lKZr9frK7pOYy8+JWWLjXgd5Y341qmHrJ3P5x8wx03NYrnCeDzGdDIRNV/VuTEjVWOBH4Swtz48icxp/vFsPpWoqkq3Ne52q2TT6fRBGCkhPWTkMO8k3qnIb65tW8XhcMDxeFQRw4+wmM8xm83UHyqxyKbnwF+gVU+wn/6bWJTUfAGf0EqhaRpt+A8owF/qG1VGoTvNDXmCAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/f20954147f64329fe787e7a1456b66e2/8ac56/image-8.webp 240w,\n/static/f20954147f64329fe787e7a1456b66e2/d3be9/image-8.webp 480w,\n/static/f20954147f64329fe787e7a1456b66e2/b0a15/image-8.webp 500w\"\n              sizes=\"(max-width: 500px) 100vw, 500px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/f20954147f64329fe787e7a1456b66e2/8ff5a/image-8.png 240w,\n/static/f20954147f64329fe787e7a1456b66e2/e85cb/image-8.png 480w,\n/static/f20954147f64329fe787e7a1456b66e2/0b533/image-8.png 500w\"\n            sizes=\"(max-width: 500px) 100vw, 500px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/f20954147f64329fe787e7a1456b66e2/0b533/image-8.png\"\n            alt=\"2022/02/image-8.png\"\n            title=\"2022/02/image-8.png\"\n            loading=\"lazy\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>Reference image: <a href=\"https://www.intel.com/content/dam/www/public/us/en/documents/datasheets/9-series-chipset-pch-datasheet.pdf\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Intel 9 Series Chipset Platform Controller Hub Datasheet</a></p>\n<p>It then checks whether this value matches <code class=\"language-text\">ioapicid</code>.</p>\n<p>As I saw in the <a href=\"/unix-xv6-006-kernel-main-03-en\">multiprocessor article</a>, <code class=\"language-text\">ioapicid</code> is the APIC number obtained from the MP configuration table.</p>\n<h3 id=\"initializing-the-redirection-table\" style=\"position:relative;\"><a href=\"#initializing-the-redirection-table\" aria-label=\"initializing the redirection table permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Initializing the Redirection Table</h3>\n<p>Finally, <code class=\"language-text\">ioapicwrite</code> is used to disable all entries in the <code class=\"language-text\">Redirection Table</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">// Mark all interrupts edge-triggered, active high, disabled,</span>\n<span class=\"token comment\">// and not routed to any CPUs.</span>\n<span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span>i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;=</span> maxintr<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n  <span class=\"token function\">ioapicwrite</span><span class=\"token punctuation\">(</span>REG_TABLE<span class=\"token operator\">+</span><span class=\"token number\">2</span><span class=\"token operator\">*</span>i<span class=\"token punctuation\">,</span> INT_DISABLED <span class=\"token operator\">|</span> <span class=\"token punctuation\">(</span>T_IRQ0 <span class=\"token operator\">+</span> i<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">ioapicwrite</span><span class=\"token punctuation\">(</span>REG_TABLE<span class=\"token operator\">+</span><span class=\"token number\">2</span><span class=\"token operator\">*</span>i<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The <code class=\"language-text\">ioapicwrite</code> function writes data using the index and write value as follows.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">static</span> <span class=\"token keyword\">void</span> <span class=\"token function\">ioapicwrite</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> reg<span class=\"token punctuation\">,</span> uint data<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  ioapic<span class=\"token operator\">-></span>reg <span class=\"token operator\">=</span> reg<span class=\"token punctuation\">;</span>\n  ioapic<span class=\"token operator\">-></span>data <span class=\"token operator\">=</span> data<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><code class=\"language-text\">INT_DISABLED</code> is defined as <code class=\"language-text\">0x00010000</code>.</p>\n<p>This sets bit 17 to 1.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 500px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/fd74530a7bc6d1dd7ea4a28d709cede8/0b533/image-9.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 19.166666666666664%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAARlAAAEZQAGA43XUAAAAvElEQVQY0z1PXQ9EMBD0/38aolRFwmm158VXEF6Z2y3uYTI7M91mJ5inCUmSoCgKaK0xzzOGYcBEPmfMrMdx9PPL7xvWDNa8G5znScEIpRTiOIYxBoY+dtbBti1agnPOe6wt+Vo3/8zD3LyuK4LrurDvO6SUiKIIKs+RCgHxIGedpjQnDwvP7yxlhizLEIYhvl2H4DgOf7K1FnVd+9p8ZVVV0E1zg7wPZd7T1MBolGWJvu+xbRuWZfF1+cIfeiEh/Dp95tgAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/fd74530a7bc6d1dd7ea4a28d709cede8/8ac56/image-9.webp 240w,\n/static/fd74530a7bc6d1dd7ea4a28d709cede8/d3be9/image-9.webp 480w,\n/static/fd74530a7bc6d1dd7ea4a28d709cede8/b0a15/image-9.webp 500w\"\n              sizes=\"(max-width: 500px) 100vw, 500px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/fd74530a7bc6d1dd7ea4a28d709cede8/8ff5a/image-9.png 240w,\n/static/fd74530a7bc6d1dd7ea4a28d709cede8/e85cb/image-9.png 480w,\n/static/fd74530a7bc6d1dd7ea4a28d709cede8/0b533/image-9.png 500w\"\n            sizes=\"(max-width: 500px) 100vw, 500px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/fd74530a7bc6d1dd7ea4a28d709cede8/0b533/image-9.png\"\n            alt=\"2022/02/image-9.png\"\n            title=\"2022/02/image-9.png\"\n            loading=\"lazy\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>Reference image: <a href=\"https://www.intel.com/content/dam/www/public/us/en/documents/datasheets/9-series-chipset-pch-datasheet.pdf\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Intel 9 Series Chipset Platform Controller Hub Datasheet</a></p>\n<p>This bit is the mask flag, and once it is set, interrupts are no longer delivered.</p>\n<p>The value written in the low 8 bits is the interrupt vector.</p>\n<p>I wonder why it disables them during initialization.</p>\n<p>I assume it will become clear once I read more of the code, so I’ll keep going.</p>\n<h2 id=\"summary\" style=\"position:relative;\"><a href=\"#summary\" aria-label=\"summary permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Summary</h2>\n<p>This time I read through <code class=\"language-text\">picinit</code> and <code class=\"language-text\">ioapicinit</code>.</p>\n<p>Only ten functions executed from <code class=\"language-text\">main</code> remain unread, so the series is starting to hit the halfway point.</p>\n<p>Next time I will read the <code class=\"language-text\">consoleinit</code> function.</p>\n<h2 id=\"reference-books\" style=\"position:relative;\"><a href=\"#reference-books\" aria-label=\"reference books permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Reference Books</h2>\n<ul>\n<li><a href=\"https://amzn.to/3qZSCY7\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Build an OS in 30 Days!</a></li>\n<li><a href=\"https://amzn.to/3qXYsZX\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Introduction to OS Development from Zero</a></li>\n<li><a href=\"https://amzn.to/3q8TU3K\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">An Introduction to OS Code Reading: Learning Kernel Internals with UNIX V6</a></li>\n<li><a href=\"https://amzn.to/3I6fkVt\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Detailed Linux Kernel</a></li>\n<li><a href=\"https://amzn.to/3JRUdI2\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Build and Understand an OS: Theory and Implementation for Running x86 Computers</a></li>\n</ul>","fields":{"slug":"/unix-xv6-009-kernel-main-06-en","tagSlugs":["/tag/unix-en/","/tag/xv-6-en/","/tag/kernel-en/","/tag/os-en/","/tag/english/"]},"frontmatter":{"date":"2022-02-06","description":"I am learning about kernels by reading the source code of the educational OS xv6OS. In this article, I walk through the behavior of the xv6OS kernel's main function.","tags":["Unix (en)","xv6 (en)","Kernel (en)","OS (en)","English"],"title":"Reading xv6OS Thoroughly to Fully Understand the Kernel - IOAPIC Edition -","socialImage":{"publicURL":"/static/ce2728ae27ca5fabc09dfa2abcf668e6/unix-xv6-009-kernel-main-06.png"}}}},"pageContext":{"slug":"/unix-xv6-009-kernel-main-06-en"}},"staticQueryHashes":["251939775","401334301","825871152"]}