{"componentChunkName":"component---src-templates-post-template-js","path":"/unix-xv6-004-kernel-main-01-en","result":{"data":{"markdownRemark":{"id":"8f2c9006-0193-5885-8d71-95bdbb471c3d","html":"<blockquote>\n<p>This page has been machine-translated from the <a href=\"/unix-xv6-004-kernel-main-01\">original page</a>.</p>\n</blockquote>\n<p>Inspired by <a href=\"https://amzn.to/3q8TU3K\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Introduction to OS Code Reading ~Understanding the Kernel Mechanisms 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>Since UNIX V6 itself does not run on x86 CPUs, I’ve decided to read the source code of <a href=\"https://github.com/kash1064/xv6-public\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">kash1064/xv6-public: xv6 OS</a>, which is a fork of the <a href=\"https://github.com/mit-pdos/xv6-public\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">xv6 OS</a> repository that has adapted UNIXv6 to run on the X86 architecture.</p>\n<p><a href=\"/unix-xv6-002-load-kernel-en\">Previously</a>, we read through the build and startup process of xv6 OS.</p>\n<p>Now we’re going to proceed with reading the kernel.</p>\n<p>First, let’s start reading from <code class=\"language-text\">main.c</code>.</p>\n<p>Basically, we’ll read the C source code and trace the processing flow by performing gdb debugging while referencing <code class=\"language-text\">kernel.asm</code> and <code class=\"language-text\">kernel.sym</code> as needed.</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=\"#main-function\">main function</a></li>\n<li>\n<p><a href=\"#kinit1-function\">kinit1 function</a></p>\n<ul>\n<li><a href=\"#arguments-of-kinit1-function\">Arguments of kinit1 function</a></li>\n<li><a href=\"#initlock-function\">initlock function</a></li>\n<li><a href=\"#freerange-function\">freerange function</a></li>\n<li><a href=\"#kfree-function\">kfree function</a></li>\n</ul>\n</li>\n<li><a href=\"#kinit2-function\">kinit2 function</a></li>\n<li>\n<p><a href=\"#about-locks-in-xv6\">About locks in xv6</a></p>\n<ul>\n<li><a href=\"#acquire-function\">acquire function</a></li>\n<li><a href=\"#release-function\">release function</a></li>\n</ul>\n</li>\n<li><a href=\"#bonus-calling-the-panic-function-with-the-debugger\">Bonus: Calling the panic function with the debugger</a></li>\n<li><a href=\"#bonus-about-memset\">Bonus: About memset</a></li>\n<li><a href=\"#summary\">Summary</a></li>\n<li><a href=\"#references\">References</a></li>\n</ul>\n<h2 id=\"main-function\" style=\"position:relative;\"><a href=\"#main-function\" aria-label=\"main 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>main function</h2>\n<p>In the <a href=\"/unix-xv6-002-load-kernel-en\">previous</a> article, we saw up to calling the main function in <code class=\"language-text\">main.c</code>.</p>\n<p>From here, we’ll look at the behavior of the kernel itself.</p>\n<p>First, I’ve extracted only the lines of the main function from <code class=\"language-text\">main.c</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\">void</span> <span class=\"token function\">startothers</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">void</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">static</span> <span class=\"token keyword\">void</span> <span class=\"token function\">mpmain</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">void</span><span class=\"token punctuation\">)</span>  <span class=\"token keyword\">__attribute__</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>noreturn<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">extern</span> <span class=\"token class-name\">pde_t</span> <span class=\"token operator\">*</span>kpgdir<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">extern</span> <span class=\"token keyword\">char</span> end<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// first address after kernel loaded from ELF file</span>\n\n<span class=\"token comment\">// Bootstrap processor starts running C code here.</span>\n<span class=\"token comment\">// Allocate a real stack and switch to it, first</span>\n<span class=\"token comment\">// doing some setup required for memory allocator to work.</span>\n<span class=\"token keyword\">int</span>\n<span class=\"token function\">main</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 function\">kinit1</span><span class=\"token punctuation\">(</span>end<span class=\"token punctuation\">,</span> <span class=\"token function\">P2V</span><span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token operator\">*</span><span class=\"token number\">1024</span><span class=\"token operator\">*</span><span class=\"token number\">1024</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// phys page allocator</span>\n  <span class=\"token function\">kvmalloc</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>      <span class=\"token comment\">// kernel page table</span>\n  <span class=\"token function\">mpinit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>        <span class=\"token comment\">// detect other processors</span>\n  <span class=\"token function\">lapicinit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>     <span class=\"token comment\">// interrupt controller</span>\n  <span class=\"token function\">seginit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>       <span class=\"token comment\">// segment descriptors</span>\n  <span class=\"token function\">picinit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>       <span class=\"token comment\">// disable pic</span>\n  <span class=\"token function\">ioapicinit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>    <span class=\"token comment\">// another interrupt controller</span>\n  <span class=\"token function\">consoleinit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>   <span class=\"token comment\">// console hardware</span>\n  <span class=\"token function\">uartinit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>      <span class=\"token comment\">// serial port</span>\n  <span class=\"token function\">pinit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>         <span class=\"token comment\">// process table</span>\n  <span class=\"token function\">tvinit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>        <span class=\"token comment\">// trap vectors</span>\n  <span class=\"token function\">binit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>         <span class=\"token comment\">// buffer cache</span>\n  <span class=\"token function\">fileinit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>      <span class=\"token comment\">// file table</span>\n  <span class=\"token function\">ideinit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>       <span class=\"token comment\">// disk </span>\n  <span class=\"token function\">startothers</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>   <span class=\"token comment\">// start other processors</span>\n  <span class=\"token function\">kinit2</span><span class=\"token punctuation\">(</span><span class=\"token function\">P2V</span><span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token operator\">*</span><span class=\"token number\">1024</span><span class=\"token operator\">*</span><span class=\"token number\">1024</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">P2V</span><span class=\"token punctuation\">(</span>PHYSTOP<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// must come after startothers()</span>\n  <span class=\"token function\">userinit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>      <span class=\"token comment\">// first user process</span>\n  <span class=\"token function\">mpmain</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>        <span class=\"token comment\">// finish this processor's setup</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Functions are lined up and executed in order from top to bottom.</p>\n<p>In this article, we’ll look at the <code class=\"language-text\">kinit1</code> and <code class=\"language-text\">kinit2</code> functions.</p>\n<h2 id=\"kinit1-function\" style=\"position:relative;\"><a href=\"#kinit1-function\" aria-label=\"kinit1 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>kinit1 function</h2>\n<p>The kinit1 function that is executed first is a function defined in <code class=\"language-text\">kalloc.c</code>.</p>\n<p>The xv6 kernel initializes the memory allocator by calling <code class=\"language-text\">kinit1</code> and <code class=\"language-text\">kinit2</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">// Initialization happens in two phases.</span>\n<span class=\"token comment\">// 1. main() calls kinit1() while still using entrypgdir to place just</span>\n<span class=\"token comment\">// the pages mapped by entrypgdir on free list.</span>\n<span class=\"token comment\">// 2. main() calls kinit2() with the rest of the physical pages</span>\n<span class=\"token comment\">// after installing a full page table that maps them on all cores.</span>\n<span class=\"token keyword\">void</span>\n<span class=\"token function\">kinit1</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">void</span> <span class=\"token operator\">*</span>vstart<span class=\"token punctuation\">,</span> <span class=\"token keyword\">void</span> <span class=\"token operator\">*</span>vend<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token function\">initlock</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>kmem<span class=\"token punctuation\">.</span>lock<span class=\"token punctuation\">,</span> <span class=\"token string\">\"kmem\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  kmem<span class=\"token punctuation\">.</span>use_lock <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">freerange</span><span class=\"token punctuation\">(</span>vstart<span class=\"token punctuation\">,</span> vend<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">void</span>\n<span class=\"token function\">kinit2</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">void</span> <span class=\"token operator\">*</span>vstart<span class=\"token punctuation\">,</span> <span class=\"token keyword\">void</span> <span class=\"token operator\">*</span>vend<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token function\">freerange</span><span class=\"token punctuation\">(</span>vstart<span class=\"token punctuation\">,</span> vend<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  kmem<span class=\"token punctuation\">.</span>use_lock <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>At runtime, the kernel needs to allocate and free physical memory regions for page tables, processes, user memory, kernel stacks, pipe buffers, and so on.</p>\n<p>In the case of xv6 OS, the physical memory from the end of the address where the kernel itself is stored up to <code class=\"language-text\">PHYSTOP</code> is used as the allocation region.</p>\n<p><code class=\"language-text\">PHYSTOP</code> is defined in <code class=\"language-text\">memlayout.h</code> as follows:</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\">define</span> <span class=\"token macro-name\">EXTMEM</span>  <span class=\"token expression\"><span class=\"token number\">0x100000</span>            </span><span class=\"token comment\">// Start of extended memory</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\">PHYSTOP</span> <span class=\"token expression\"><span class=\"token number\">0xE000000</span>           </span><span class=\"token comment\">// Top physical memory</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\">DEVSPACE</span> <span class=\"token expression\"><span class=\"token number\">0xFE000000</span>         </span><span class=\"token comment\">// Other devices are at high addresses</span></span></code></pre></div>\n<p>The allocation and deallocation of this memory region is done on a page-by-page basis.</p>\n<p>The kernel maintains freed pages as a linked list, and when allocating, it removes that page from the list.</p>\n<p>Reference: <a href=\"https://pdos.csail.mit.edu/6.828/2018/xv6/book-rev11.pdf\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">xv6 - DRAFT as of September 4, 2018 P32-33</a></p>\n<p>Reference: <a href=\"http://www.coins.tsukuba.ac.jp/~yas/coins/os2-2011/2012-01-24/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Memory Management, Address Space, Page Tables</a></p>\n<h3 id=\"arguments-of-kinit1-function\" style=\"position:relative;\"><a href=\"#arguments-of-kinit1-function\" aria-label=\"arguments of kinit1 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>Arguments of kinit1 function</h3>\n<p>In <code class=\"language-text\">kinit1</code>, the allocator is initialized to make the region from the kernel’s end address received as an argument up to 4MiB available “without locks”.</p>\n<p>From here until the <code class=\"language-text\">kinit2</code> function is called, it operates in a state where addresses from the kernel end to 4MiB can be allocated without locks.</p>\n<p>This appears to be because most of the processing called within the <code class=\"language-text\">main</code> function cannot use locks or memory regions larger than 4MiB.</p>\n<p>The <code class=\"language-text\">kinit1</code> function is given <code class=\"language-text\">vstart</code> and <code class=\"language-text\">vend</code> as arguments.</p>\n<p>First, the argument corresponding to the first argument <code class=\"language-text\">vstart</code> is the following variable declared in <code class=\"language-text\">main.c</code>.</p>\n<p>It has an <code class=\"language-text\">extern</code> declaration and acquires <code class=\"language-text\">PROVIDE(end = .);</code> defined in <code class=\"language-text\">kernel.ld</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">extern</span> <span class=\"token keyword\">char</span> end<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// first address after kernel loaded from ELF file</span></code></pre></div>\n<p>Also, <code class=\"language-text\">P2V(4*1024*1024)</code> is given to <code class=\"language-text\">vend</code>.</p>\n<p><code class=\"language-text\">P2V</code> is a macro defined in <code class=\"language-text\">memlayout.h</code> that simply converts a physical address to a virtual address (= simply adds KERNBASE).</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\">define</span> <span class=\"token macro-name function\">V2P</span><span class=\"token expression\"><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>uint<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> KERNBASE<span class=\"token punctuation\">)</span></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 function\">P2V</span><span class=\"token expression\"><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">void</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> KERNBASE<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></span></span></code></pre></div>\n<p>When called, <code class=\"language-text\">0x80400000</code> is given, which is <code class=\"language-text\">4*1024*1024</code> (=4MiB) plus KERNBASE.</p>\n<p>When I actually checked the arguments at the time of calling <code class=\"language-text\">kinit1</code> with gdb, it looked like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">kinit1 <span class=\"token punctuation\">(</span>vstart<span class=\"token operator\">=</span>0x801154a8, <span class=\"token assign-left variable\">vend</span><span class=\"token operator\">=</span>0x80400000<span class=\"token punctuation\">)</span></code></pre></div>\n<p>The order is reversed, but in <code class=\"language-text\">kinit1</code>, these two values are given as arguments to the <code class=\"language-text\">freerange</code> function to secure the memory region.</p>\n<p>Since I want to read the source code in order from the top, I’ll check the <code class=\"language-text\">initlock</code> function first.</p>\n<h3 id=\"initlock-function\" style=\"position:relative;\"><a href=\"#initlock-function\" aria-label=\"initlock 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>initlock function</h3>\n<p>The <code class=\"language-text\">initlock</code> function is a function defined in <code class=\"language-text\">spinlock.c</code> that initializes the <code class=\"language-text\">spinlock</code> structure inside the <code class=\"language-text\">kmem</code> structure.</p>\n<p>The <code class=\"language-text\">kmem</code> structure is defined in <code class=\"language-text\">kalloc.c</code> as follows:</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">struct</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">struct</span> <span class=\"token class-name\">spinlock</span> lock<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">int</span> use_lock<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">struct</span> <span class=\"token class-name\">run</span> <span class=\"token operator\">*</span>freelist<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> kmem<span class=\"token punctuation\">;</span></code></pre></div>\n<p>Also, the <code class=\"language-text\">spinlock</code> structure is the following structure defined in <code class=\"language-text\">spinlock.h</code>.</p>\n<p>The comment says mutual exclusion, and it seems to be used when performing locks.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">// Mutual exclusion lock.</span>\n<span class=\"token keyword\">struct</span> <span class=\"token class-name\">spinlock</span> <span class=\"token punctuation\">{</span>\n  uint locked<span class=\"token punctuation\">;</span>       <span class=\"token comment\">// Is the lock held?</span>\n\n  <span class=\"token comment\">// For debugging:</span>\n  <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>name<span class=\"token punctuation\">;</span>        <span class=\"token comment\">// Name of lock.</span>\n  <span class=\"token keyword\">struct</span> <span class=\"token class-name\">cpu</span> <span class=\"token operator\">*</span>cpu<span class=\"token punctuation\">;</span>   <span class=\"token comment\">// The cpu holding the lock.</span>\n  uint pcs<span class=\"token punctuation\">[</span><span class=\"token number\">10</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>      <span class=\"token comment\">// The call stack (an array of program counters)</span>\n                     <span class=\"token comment\">// that locked the lock.</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The <code class=\"language-text\">initlock</code> function receives a pointer to this <code class=\"language-text\">spinlock</code> structure and a name string to initialize it.</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\">initlock</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">struct</span> <span class=\"token class-name\">spinlock</span> <span class=\"token operator\">*</span>lk<span class=\"token punctuation\">,</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>name<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  lk<span class=\"token operator\">-></span>name <span class=\"token operator\">=</span> name<span class=\"token punctuation\">;</span>\n  lk<span class=\"token operator\">-></span>locked <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  lk<span class=\"token operator\">-></span>cpu <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>When calling this function from <code class=\"language-text\">kinit1</code>, we can see that it’s initialized with the name “kmem”.</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\">kinit1</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">void</span> <span class=\"token operator\">*</span>vstart<span class=\"token punctuation\">,</span> <span class=\"token keyword\">void</span> <span class=\"token operator\">*</span>vend<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token function\">initlock</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>kmem<span class=\"token punctuation\">.</span>lock<span class=\"token punctuation\">,</span> <span class=\"token string\">\"kmem\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  kmem<span class=\"token punctuation\">.</span>use_lock <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">freerange</span><span class=\"token punctuation\">(</span>vstart<span class=\"token punctuation\">,</span> vend<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The next line also initializes the <code class=\"language-text\">use_lock</code> value to 0.</p>\n<p>Here the lock is disabled.</p>\n<p>In <code class=\"language-text\">kinit2</code>, which is called after a while, <code class=\"language-text\">kmem.use_lock</code> is set to 1.</p>\n<p>Also, here we’ve only initialized <code class=\"language-text\">kmem</code> and no lock has been performed.</p>\n<p>To perform a lock using the structure initialized here, we need to call the <code class=\"language-text\">void acquire(struct spinlock *lk)</code> function defined in <code class=\"language-text\">spinlock.c</code>.</p>\n<p>We’ll check this function when it’s actually used.</p>\n<p>Reference: <a href=\"https://pdos.csail.mit.edu/6.828/2017/homework/xv6-lock.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Homework: xv6 locking</a></p>\n<h3 id=\"freerange-function\" style=\"position:relative;\"><a href=\"#freerange-function\" aria-label=\"freerange 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>freerange function</h3>\n<p>The <code class=\"language-text\">freerange</code> function is a function defined in <code class=\"language-text\">kalloc.c</code> that takes <code class=\"language-text\">vstart</code> and <code class=\"language-text\">vend</code> as arguments and frees the physical address region aligned using <code class=\"language-text\">PGROUNDUP</code>.</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\">freerange</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">void</span> <span class=\"token operator\">*</span>vstart<span class=\"token punctuation\">,</span> <span class=\"token keyword\">void</span> <span class=\"token operator\">*</span>vend<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>p<span class=\"token punctuation\">;</span>\n  p <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span><span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token function\">PGROUNDUP</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>uint<span class=\"token punctuation\">)</span>vstart<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">;</span> p <span class=\"token operator\">+</span> PGSIZE <span class=\"token operator\">&lt;=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span><span class=\"token operator\">*</span><span class=\"token punctuation\">)</span>vend<span class=\"token punctuation\">;</span> p <span class=\"token operator\">+=</span> PGSIZE<span class=\"token punctuation\">)</span>\n    <span class=\"token function\">kfree</span><span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><code class=\"language-text\">PGROUNDUP</code> is defined in <code class=\"language-text\">mmu.h</code> as follows:</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">// Page directory and page table constants.</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\">NPDENTRIES</span>      <span class=\"token expression\"><span class=\"token number\">1024</span>    </span><span class=\"token comment\">// # directory entries per page directory</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\">NPTENTRIES</span>      <span class=\"token expression\"><span class=\"token number\">1024</span>    </span><span class=\"token comment\">// # PTEs per page table</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\">PGSIZE</span>          <span class=\"token expression\"><span class=\"token number\">4096</span>    </span><span class=\"token comment\">// bytes mapped by a page</span></span>\n\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">define</span> <span class=\"token macro-name\">PTXSHIFT</span>        <span class=\"token expression\"><span class=\"token number\">12</span>      </span><span class=\"token comment\">// offset of PTX in a linear address</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\">PDXSHIFT</span>        <span class=\"token expression\"><span class=\"token number\">22</span>      </span><span class=\"token comment\">// offset of PDX in a linear address</span></span>\n\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">define</span> <span class=\"token macro-name function\">PGROUNDUP</span><span class=\"token expression\"><span class=\"token punctuation\">(</span>sz<span class=\"token punctuation\">)</span>  <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>sz<span class=\"token punctuation\">)</span><span class=\"token operator\">+</span>PGSIZE<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;</span> <span class=\"token operator\">~</span><span class=\"token punctuation\">(</span>PGSIZE<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></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 function\">PGROUNDDOWN</span><span class=\"token expression\"><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;</span> <span class=\"token operator\">~</span><span class=\"token punctuation\">(</span>PGSIZE<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></span></span></code></pre></div>\n<p><code class=\"language-text\">PGROUNDUP</code> is a macro that aligns the address received as an argument to a multiple of <code class=\"language-text\">PGSIZE</code>.</p>\n<p>This returns the smallest multiple of <code class=\"language-text\">PGSIZE</code> greater than or equal to argument <code class=\"language-text\">sz</code>.</p>\n<p><code class=\"language-text\">~</code> is the <code class=\"language-text\">Bitwise NOT</code> operator.</p>\n<p>Also, <code class=\"language-text\">(PGSIZE-1)</code> is the maximum remainder for <code class=\"language-text\">PGSIZE</code>, so by adding this and then taking the AND with the bit-inverted <code class=\"language-text\">(pgsize-1)</code>, we can round down the fraction below <code class=\"language-text\">PGSIZE</code> to perform alignment.</p>\n<p>Reference: <a href=\"https://stackoverflow.com/questions/43289022/what-do-pgroundup-and-pgrounddown-in-xv6-mean\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">c - What do PGROUNDUP and PGROUNDDOWN in xv6 mean? - Stack Overflow</a></p>\n<p>The calculation was a bit difficult to understand, so I created a reversed Python script.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">rev_PGROUNDUP</span><span class=\"token punctuation\">(</span>sz<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"***************rev_PGROUNDUP***************\"</span><span class=\"token punctuation\">)</span>\n    pgsize <span class=\"token operator\">=</span> <span class=\"token number\">4096</span>\n    num1 <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>sz<span class=\"token punctuation\">)</span><span class=\"token operator\">+</span><span class=\"token punctuation\">(</span>pgsize<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n    num2 <span class=\"token operator\">=</span> <span class=\"token operator\">~</span><span class=\"token punctuation\">(</span>pgsize<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n    result <span class=\"token operator\">=</span> num1 <span class=\"token operator\">&amp;</span> num2\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"pgsize               : {}\"</span><span class=\"token punctuation\">.</span><span class=\"token builtin\">format</span><span class=\"token punctuation\">(</span>pgsize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"pgsize[bin]          : {}\"</span><span class=\"token punctuation\">.</span><span class=\"token builtin\">format</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">bin</span><span class=\"token punctuation\">(</span>pgsize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"(sz)+(pgsize-1)      : {}\"</span><span class=\"token punctuation\">.</span><span class=\"token builtin\">format</span><span class=\"token punctuation\">(</span>num1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"(sz)+(pgsize-1)[bin] : {}\"</span><span class=\"token punctuation\">.</span><span class=\"token builtin\">format</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">bin</span><span class=\"token punctuation\">(</span>num1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"~(pgsize-1)          : {}\"</span><span class=\"token punctuation\">.</span><span class=\"token builtin\">format</span><span class=\"token punctuation\">(</span>num2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"~(pgsize-1)[bin]     : {}\"</span><span class=\"token punctuation\">.</span><span class=\"token builtin\">format</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">bin</span><span class=\"token punctuation\">(</span>num2<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"result               : {}\"</span><span class=\"token punctuation\">.</span><span class=\"token builtin\">format</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"result[bin]          : {}\"</span><span class=\"token punctuation\">.</span><span class=\"token builtin\">format</span><span class=\"token punctuation\">(</span><span class=\"token builtin\">bin</span><span class=\"token punctuation\">(</span>result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> result</code></pre></div>\n<p>When this is executed, it looks like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">rev_PGROUNDUP<span class=\"token punctuation\">(</span><span class=\"token number\">100</span><span class=\"token punctuation\">)</span>\n***************rev_PGROUNDUP***************\npgsize               <span class=\"token builtin class-name\">:</span> <span class=\"token number\">4096</span>\npgsize<span class=\"token punctuation\">[</span>bin<span class=\"token punctuation\">]</span>          <span class=\"token builtin class-name\">:</span> 0b1000000000000\n<span class=\"token punctuation\">(</span>sz<span class=\"token punctuation\">)</span>+<span class=\"token punctuation\">(</span>pgsize-1<span class=\"token punctuation\">)</span>      <span class=\"token builtin class-name\">:</span> <span class=\"token number\">4195</span>\n<span class=\"token punctuation\">(</span>sz<span class=\"token punctuation\">)</span>+<span class=\"token punctuation\">(</span>pgsize-1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span>bin<span class=\"token punctuation\">]</span> <span class=\"token builtin class-name\">:</span> 0b1000001100011\n~<span class=\"token punctuation\">(</span>pgsize-1<span class=\"token punctuation\">)</span>          <span class=\"token builtin class-name\">:</span> -4096\n~<span class=\"token punctuation\">(</span>pgsize-1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span>bin<span class=\"token punctuation\">]</span>     <span class=\"token builtin class-name\">:</span> -0b1000000000000\nresult               <span class=\"token builtin class-name\">:</span> <span class=\"token number\">4096</span>\nresult<span class=\"token punctuation\">[</span>bin<span class=\"token punctuation\">]</span>          <span class=\"token builtin class-name\">:</span> 0b1000000000000</code></pre></div>\n<p>When 100 is input as <code class=\"language-text\">sz</code>, it’s aligned and rounded up, resulting in a return value of 4096.</p>\n<p>Let’s go back to the <code class=\"language-text\">freerange</code> function.</p>\n<p><code class=\"language-text\">vstart</code> is given as the argument to <code class=\"language-text\">PGROUNDUP</code>, and the return value is stored in <code class=\"language-text\">p</code>.</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\">freerange</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">void</span> <span class=\"token operator\">*</span>vstart<span class=\"token punctuation\">,</span> <span class=\"token keyword\">void</span> <span class=\"token operator\">*</span>vend<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>p<span class=\"token punctuation\">;</span>\n  p <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span><span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token function\">PGROUNDUP</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>uint<span class=\"token punctuation\">)</span>vstart<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">;</span> p <span class=\"token operator\">+</span> PGSIZE <span class=\"token operator\">&lt;=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span><span class=\"token operator\">*</span><span class=\"token punctuation\">)</span>vend<span class=\"token punctuation\">;</span> p <span class=\"token operator\">+=</span> PGSIZE<span class=\"token punctuation\">)</span>\n    <span class=\"token function\">kfree</span><span class=\"token punctuation\">(</span>p<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Here, <code class=\"language-text\">p</code> becomes an address aligned by <code class=\"language-text\">PGSIZE</code>.</p>\n<p>From here until reaching the address of <code class=\"language-text\">vend</code>, physical addresses are freed by the <code class=\"language-text\">kfree</code> function every <code class=\"language-text\">PGSIZE</code> (every page), and the page list is initialized.</p>\n<h3 id=\"kfree-function\" style=\"position:relative;\"><a href=\"#kfree-function\" aria-label=\"kfree 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>kfree function</h3>\n<p>The <code class=\"language-text\">kfree</code> function frees memory and adds the freed page to the page list.</p>\n<p>It’s defined in <code class=\"language-text\">kalloc.c</code>.</p>\n<p>The starting address of the page to be freed is used as an argument.</p>\n<p>When called from the <code class=\"language-text\">kinit1</code> function, the value given as an argument is an address aligned by <code class=\"language-text\">PGSIZE</code>, so it’s guaranteed to be aligned on a 4096-byte boundary.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">//PAGEBREAK: 21</span>\n<span class=\"token comment\">// Free the page of physical memory pointed at by v,</span>\n<span class=\"token comment\">// which normally should have been returned by a</span>\n<span class=\"token comment\">// call to kalloc().  (The exception is when</span>\n<span class=\"token comment\">// initializing the allocator; see kinit above.)</span>\n<span class=\"token keyword\">void</span> <span class=\"token function\">kfree</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>v<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">struct</span> <span class=\"token class-name\">run</span> <span class=\"token operator\">*</span>r<span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>uint<span class=\"token punctuation\">)</span>v <span class=\"token operator\">%</span> PGSIZE <span class=\"token operator\">||</span> v <span class=\"token operator\">&lt;</span> end <span class=\"token operator\">||</span> <span class=\"token function\">V2P</span><span class=\"token punctuation\">(</span>v<span class=\"token punctuation\">)</span> <span class=\"token operator\">>=</span> PHYSTOP<span class=\"token punctuation\">)</span>\n    <span class=\"token function\">panic</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"kfree\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// Fill with junk to catch dangling refs.</span>\n  <span class=\"token function\">memset</span><span class=\"token punctuation\">(</span>v<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> PGSIZE<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>kmem<span class=\"token punctuation\">.</span>use_lock<span class=\"token punctuation\">)</span>\n    <span class=\"token function\">acquire</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>kmem<span class=\"token punctuation\">.</span>lock<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  r <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">struct</span> <span class=\"token class-name\">run</span><span class=\"token operator\">*</span><span class=\"token punctuation\">)</span>v<span class=\"token punctuation\">;</span>\n  r<span class=\"token operator\">-></span>next <span class=\"token operator\">=</span> kmem<span class=\"token punctuation\">.</span>freelist<span class=\"token punctuation\">;</span>\n  kmem<span class=\"token punctuation\">.</span>freelist <span class=\"token operator\">=</span> r<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>kmem<span class=\"token punctuation\">.</span>use_lock<span class=\"token punctuation\">)</span>\n    <span class=\"token function\">release</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>kmem<span class=\"token punctuation\">.</span>lock<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>When the function is called, it declares a <code class=\"language-text\">run</code> structure.</p>\n<p>The <code class=\"language-text\">run</code> structure is defined in <code class=\"language-text\">kalloc.c</code> and is a singly-linked list that only has a reference to the next <code class=\"language-text\">run</code> structure.</p>\n<p>It’s stored in <code class=\"language-text\">kmem</code> as a <code class=\"language-text\">freelist</code> that stores freed pages.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">struct</span> <span class=\"token class-name\">run</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">struct</span> <span class=\"token class-name\">run</span> <span class=\"token operator\">*</span>next<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">struct</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">struct</span> <span class=\"token class-name\">spinlock</span> lock<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">int</span> use_lock<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">struct</span> <span class=\"token class-name\">run</span> <span class=\"token operator\">*</span>freelist<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> kmem<span class=\"token punctuation\">;</span></code></pre></div>\n<p>The next line checks whether the address received as an argument is aligned by <code class=\"language-text\">PGSIZE</code> and that there is sufficient space for page size allocation.</p>\n<p>If this check fails, the <code class=\"language-text\">panic</code> function is called.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>uint<span class=\"token punctuation\">)</span>v <span class=\"token operator\">%</span> PGSIZE <span class=\"token operator\">||</span> v <span class=\"token operator\">&lt;</span> end <span class=\"token operator\">||</span> <span class=\"token function\">V2P</span><span class=\"token punctuation\">(</span>v<span class=\"token punctuation\">)</span> <span class=\"token operator\">>=</span> PHYSTOP<span class=\"token punctuation\">)</span> <span class=\"token function\">panic</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"kfree\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The <code class=\"language-text\">panic</code> function will be described later.</p>\n<p>The next line fills the address region for <code class=\"language-text\">PGSIZE</code> from the page start address <code class=\"language-text\">v</code> with 1.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">// Fill with junk to catch dangling refs.</span>\n<span class=\"token function\">memset</span><span class=\"token punctuation\">(</span>v<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> PGSIZE<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p><code class=\"language-text\">memset</code> will also be described later.</p>\n<p>After the memory region initialization by <code class=\"language-text\">memset</code> is completed, the following lines are executed:</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>kmem<span class=\"token punctuation\">.</span>use_lock<span class=\"token punctuation\">)</span> <span class=\"token function\">acquire</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>kmem<span class=\"token punctuation\">.</span>lock<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nr <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">struct</span> <span class=\"token class-name\">run</span><span class=\"token operator\">*</span><span class=\"token punctuation\">)</span>v<span class=\"token punctuation\">;</span>\nr<span class=\"token operator\">-></span>next <span class=\"token operator\">=</span> kmem<span class=\"token punctuation\">.</span>freelist<span class=\"token punctuation\">;</span>\nkmem<span class=\"token punctuation\">.</span>freelist <span class=\"token operator\">=</span> r<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>kmem<span class=\"token punctuation\">.</span>use_lock<span class=\"token punctuation\">)</span> <span class=\"token function\">release</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>kmem<span class=\"token punctuation\">.</span>lock<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>During the execution of <code class=\"language-text\">kinit1</code>, locks are disabled, so <code class=\"language-text\">acquire</code> and <code class=\"language-text\">release</code> are not called.</p>\n<p>Therefore, a new <code class=\"language-text\">run</code> structure for one page is added to the head of <code class=\"language-text\">kmem.freelist</code>, and the processing of <code class=\"language-text\">kfree</code> ends.</p>\n<p>This completes the processing of the <code class=\"language-text\">freerange</code> function, so the processing of <code class=\"language-text\">kinit1</code> also ends, and we proceed to execute the next function in <code class=\"language-text\">main.c</code>.</p>\n<h2 id=\"kinit2-function\" style=\"position:relative;\"><a href=\"#kinit2-function\" aria-label=\"kinit2 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>kinit2 function</h2>\n<p>After executing some kernel processing from <code class=\"language-text\">kinit1</code>, the <code class=\"language-text\">kinit2</code> function is called.</p>\n<p>The <code class=\"language-text\">kinit2</code> function enables locks and secures a larger memory region.</p>\n<p>The operation is almost the same as <code class=\"language-text\">kinit1</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token function\">kinit2</span><span class=\"token punctuation\">(</span><span class=\"token function\">P2V</span><span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token operator\">*</span><span class=\"token number\">1024</span><span class=\"token operator\">*</span><span class=\"token number\">1024</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">P2V</span><span class=\"token punctuation\">(</span>PHYSTOP<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// must come after startothers()</span></code></pre></div>\n<p>4MiB address is allocated to <code class=\"language-text\">vstart</code>, and <code class=\"language-text\">0xE000000</code>, which is set as the end of the address region, is given to <code class=\"language-text\">vend</code>.</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\">kinit2</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">void</span> <span class=\"token operator\">*</span>vstart<span class=\"token punctuation\">,</span> <span class=\"token keyword\">void</span> <span class=\"token operator\">*</span>vend<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token function\">freerange</span><span class=\"token punctuation\">(</span>vstart<span class=\"token punctuation\">,</span> vend<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  kmem<span class=\"token punctuation\">.</span>use_lock <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Except for the line <code class=\"language-text\">kmem.use_lock = 1;</code>, it’s the same as <code class=\"language-text\">kinit1</code>.</p>\n<p>After freeing the region from <code class=\"language-text\">vstart</code> to <code class=\"language-text\">vend</code> with <code class=\"language-text\">freerange</code> and adding it to the page list, locks are enabled and it ends.</p>\n<p>After this, since locks are enabled, the <code class=\"language-text\">acquire</code> and <code class=\"language-text\">release</code> functions will be called for memory allocation and deallocation.</p>\n<p>Both the <code class=\"language-text\">acquire</code> and <code class=\"language-text\">release</code> functions are defined in <code class=\"language-text\">spinlock.c</code>.</p>\n<h2 id=\"about-locks-in-xv6\" style=\"position:relative;\"><a href=\"#about-locks-in-xv6\" aria-label=\"about locks in xv6 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>About locks in xv6</h2>\n<p>Before reading the <code class=\"language-text\">acquire</code> and <code class=\"language-text\">release</code> functions, let’s check the lock specification in xv6.</p>\n<p>xv6 OS operates in a multiprocessor environment.</p>\n<p>In a multiprocessor environment, multiple CPUs share physical memory resources.</p>\n<p>Therefore, locks are a mechanism to prevent problems or conflicts caused by each CPU’s processing arbitrarily rewriting shared resources.</p>\n<p>By performing exclusive control of arbitrary memory regions through locks, we can make that memory region operable by only one CPU.</p>\n<p>Reference: <a href=\"https://pdos.csail.mit.edu/6.828/2018/xv6/book-rev11.pdf\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">xv6</a></p>\n<p>In xv6 OS, two types of locks are implemented: spin locks and sleep locks.</p>\n<p>The locks performed by the <code class=\"language-text\">acquire</code> and <code class=\"language-text\">release</code> functions are spin locks.</p>\n<p>Reference: <a href=\"https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%94%E3%83%B3%E3%83%AD%E3%83%83%E3%82%AF\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Spinlock - Wikipedia</a></p>\n<p>With spin locks, when a process tries to secure a memory resource, if the target is already locked, it loops and waits until the lock is released.</p>\n<h3 id=\"acquire-function\" style=\"position:relative;\"><a href=\"#acquire-function\" aria-label=\"acquire 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>acquire function</h3>\n<p>The <code class=\"language-text\">acquire</code> function takes a pointer to a <code class=\"language-text\">spinlock</code> structure as an argument and performs a lock.</p>\n<p>What we want to do here is simple: attempt to set 1 to <code class=\"language-text\">locked</code> in the <code class=\"language-text\">spinlock</code> structure, and loop the processing to wait until the lock can be secured.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">// Acquire the lock.</span>\n<span class=\"token comment\">// Loops (spins) until the lock is acquired.</span>\n<span class=\"token comment\">// Holding a lock for a long time may cause</span>\n<span class=\"token comment\">// other CPUs to waste time spinning to acquire it.</span>\n<span class=\"token keyword\">void</span> <span class=\"token function\">acquire</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">struct</span> <span class=\"token class-name\">spinlock</span> <span class=\"token operator\">*</span>lk<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token function\">pushcli</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// disable interrupts to avoid deadlock.</span>\n  <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token function\">holding</span><span class=\"token punctuation\">(</span>lk<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">panic</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"acquire\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// The xchg is atomic.</span>\n  <span class=\"token keyword\">while</span><span class=\"token punctuation\">(</span><span class=\"token function\">xchg</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>lk<span class=\"token operator\">-></span>locked<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">!=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// Tell the C compiler and the processor to not move loads or stores</span>\n  <span class=\"token comment\">// past this point, to ensure that the critical section's memory</span>\n  <span class=\"token comment\">// references happen after the lock is acquired.</span>\n  <span class=\"token function\">__sync_synchronize</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// Record info about lock acquisition for debugging.</span>\n  lk<span class=\"token operator\">-></span>cpu <span class=\"token operator\">=</span> <span class=\"token function\">mycpu</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">getcallerpcs</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>lk<span class=\"token punctuation\">,</span> lk<span class=\"token operator\">-></span>pcs<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Let me also repost the definition of the <code class=\"language-text\">spinlock</code> structure.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">// Mutual exclusion lock.</span>\n<span class=\"token keyword\">struct</span> <span class=\"token class-name\">spinlock</span> <span class=\"token punctuation\">{</span>\n  uint locked<span class=\"token punctuation\">;</span>       <span class=\"token comment\">// Is the lock held?</span>\n\n  <span class=\"token comment\">// For debugging:</span>\n  <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>name<span class=\"token punctuation\">;</span>        <span class=\"token comment\">// Name of lock.</span>\n  <span class=\"token keyword\">struct</span> <span class=\"token class-name\">cpu</span> <span class=\"token operator\">*</span>cpu<span class=\"token punctuation\">;</span>   <span class=\"token comment\">// The cpu holding the lock.</span>\n  uint pcs<span class=\"token punctuation\">[</span><span class=\"token number\">10</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>      <span class=\"token comment\">// The call stack (an array of program counters)</span>\n                     <span class=\"token comment\">// that locked the lock.</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Let’s look at the processing of the <code class=\"language-text\">acquire</code> function in order.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token function\">pushcli</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// disable interrupts to avoid deadlock.</span>\n<span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token function\">holding</span><span class=\"token punctuation\">(</span>lk<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token function\">panic</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"acquire\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The <code class=\"language-text\">pushcli</code> function is a function defined in <code class=\"language-text\">spinlock.c</code>.</p>\n<p>Like <code class=\"language-text\">cli</code>, it suppresses interrupts, but here it implements nested interrupt disable instructions using a stack.</p>\n<p>This processing prevents deadlocks that would occur if locks were held with interrupts enabled when securing locks with <code class=\"language-text\">xchg</code> later.</p>\n<p>To resume interrupts, call the <code class=\"language-text\">popcli</code> function.</p>\n<p>The <code class=\"language-text\">popcli</code> function is not called in the <code class=\"language-text\">acquire</code> function.</p>\n<p>The <code class=\"language-text\">popcli</code> function corresponding to the <code class=\"language-text\">pushcli</code> function executed in the <code class=\"language-text\">acquire</code> function is executed by the <code class=\"language-text\">release</code> function.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">// Pushcli/popcli are like cli/sti except that they are matched:</span>\n<span class=\"token comment\">// it takes two popcli to undo two pushcli.  Also, if interrupts</span>\n<span class=\"token comment\">// are off, then pushcli, popcli leaves them off.</span>\n<span class=\"token keyword\">void</span> <span class=\"token function\">pushcli</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> eflags<span class=\"token punctuation\">;</span>\n\n  eflags <span class=\"token operator\">=</span> <span class=\"token function\">readeflags</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">cli</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token function\">mycpu</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-></span>ncli <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token function\">mycpu</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-></span>intena <span class=\"token operator\">=</span> eflags <span class=\"token operator\">&amp;</span> FL_IF<span class=\"token punctuation\">;</span>\n  <span class=\"token function\">mycpu</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-></span>ncli <span class=\"token operator\">+=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">void</span> <span class=\"token function\">popcli</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\">if</span><span class=\"token punctuation\">(</span><span class=\"token function\">readeflags</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">&amp;</span>FL_IF<span class=\"token punctuation\">)</span>\n    <span class=\"token function\">panic</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"popcli - interruptible\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token operator\">--</span><span class=\"token function\">mycpu</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-></span>ncli <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">panic</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"popcli\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token function\">mycpu</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-></span>ncli <span class=\"token operator\">==</span> <span class=\"token number\">0</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token function\">mycpu</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-></span>intena<span class=\"token punctuation\">)</span>\n    <span class=\"token function\">sti</span><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>The next <code class=\"language-text\">holding</code> function checks whether the CPU is locked.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">// Check whether this cpu is holding the lock.</span>\n<span class=\"token keyword\">int</span> <span class=\"token function\">holding</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">struct</span> <span class=\"token class-name\">spinlock</span> <span class=\"token operator\">*</span>lock<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">int</span> r<span class=\"token punctuation\">;</span>\n  <span class=\"token function\">pushcli</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  r <span class=\"token operator\">=</span> lock<span class=\"token operator\">-></span>locked <span class=\"token operator\">&amp;&amp;</span> lock<span class=\"token operator\">-></span>cpu <span class=\"token operator\">==</span> <span class=\"token function\">mycpu</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">popcli</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> r<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><code class=\"language-text\">mycpu()</code> is a function defined in <code class=\"language-text\">proc.c</code>.</p>\n<p>xv6 OS manages a <code class=\"language-text\">cpu</code> structure for each CPU.</p>\n<p>The <code class=\"language-text\">cpu</code> structure is defined in <code class=\"language-text\">proc.h</code> as follows, and various information is stored, such as the process currently executing on that CPU and the number of nested spin locks.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">// Per-CPU state</span>\n<span class=\"token keyword\">struct</span> <span class=\"token class-name\">cpu</span> <span class=\"token punctuation\">{</span>\n  uchar apicid<span class=\"token punctuation\">;</span>                <span class=\"token comment\">// Local APIC ID</span>\n  <span class=\"token keyword\">struct</span> <span class=\"token class-name\">context</span> <span class=\"token operator\">*</span>scheduler<span class=\"token punctuation\">;</span>   <span class=\"token comment\">// swtch() here to enter scheduler</span>\n  <span class=\"token keyword\">struct</span> <span class=\"token class-name\">taskstate</span> ts<span class=\"token punctuation\">;</span>         <span class=\"token comment\">// Used by x86 to find stack for interrupt</span>\n  <span class=\"token keyword\">struct</span> <span class=\"token class-name\">segdesc</span> gdt<span class=\"token punctuation\">[</span>NSEGS<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>   <span class=\"token comment\">// x86 global descriptor table</span>\n  <span class=\"token keyword\">volatile</span> uint started<span class=\"token punctuation\">;</span>       <span class=\"token comment\">// Has the CPU started?</span>\n  <span class=\"token keyword\">int</span> ncli<span class=\"token punctuation\">;</span>                    <span class=\"token comment\">// Depth of pushcli nesting.</span>\n  <span class=\"token keyword\">int</span> intena<span class=\"token punctuation\">;</span>                  <span class=\"token comment\">// Were interrupts enabled before pushcli?</span>\n  <span class=\"token keyword\">struct</span> <span class=\"token class-name\">proc</span> <span class=\"token operator\">*</span>proc<span class=\"token punctuation\">;</span>           <span class=\"token comment\">// The process running on this cpu or null</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The <code class=\"language-text\">mycpu</code> function returns a pointer to reference the <code class=\"language-text\">cpu</code> structure of the current CPU.</p>\n<p>Interrupts must be disabled before calling.</p>\n<p>In other words, <code class=\"language-text\">if(holding(lk)) panic(\"acquire\");</code> references the <code class=\"language-text\">spinlock</code> structure in the argument and confirms that the CPU is locked.</p>\n<p>Next, let’s check the lock setting.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">// The xchg is atomic.</span>\n<span class=\"token keyword\">while</span><span class=\"token punctuation\">(</span><span class=\"token function\">xchg</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>lk<span class=\"token operator\">-></span>locked<span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">!=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Here, to prevent conflicts during lock operations, the operation needs to be atomic.</p>\n<p><code class=\"language-text\">xchg</code> is a special x86 instruction to achieve this.</p>\n<p>If a lock is set, <code class=\"language-text\">xchg(&amp;lk->locked, 1)</code> returns 1 and the loop continues.</p>\n<p>If the lock is released, a new lock is set by <code class=\"language-text\">xchg</code>.</p>\n<p>After that, the loop ends and the lock is secured.</p>\n<p>Reference: <a href=\"https://forum.osdev.org/viewtopic.php?f=1&#x26;t=33690\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">OSDev.org • View topic - How can xchg return a value?</a></p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">// Tell the C compiler and the processor to not move loads or stores</span>\n<span class=\"token comment\">// past this point, to ensure that the critical section's memory</span>\n<span class=\"token comment\">// references happen after the lock is acquired.</span>\n<span class=\"token function\">__sync_synchronize</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Record info about lock acquisition for debugging.</span>\nlk<span class=\"token operator\">-></span>cpu <span class=\"token operator\">=</span> <span class=\"token function\">mycpu</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">getcallerpcs</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>lk<span class=\"token punctuation\">,</span> lk<span class=\"token operator\">-></span>pcs<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Next, the <code class=\"language-text\">__sync_synchronize</code> function is a built-in function that performs a memory barrier.</p>\n<p>Reference: <a href=\"https://stackoverflow.com/questions/982129/what-does-sync-synchronize-do/982179\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">c++ - What does _<em>sync</em>synchronize do? - Stack Overflow</a></p>\n<p>Then, the <code class=\"language-text\">cpu</code> structure acquired by the <code class=\"language-text\">mycpu</code> function is stored in <code class=\"language-text\">lk->cpu</code>.</p>\n<p>Finally, the <code class=\"language-text\">getcallerpcs</code> function is called.</p>\n<p>This stores the call stack for debugging.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">// Record the current call stack in pcs[] by following the %ebp chain.</span>\n<span class=\"token keyword\">void</span> <span class=\"token function\">getcallerpcs</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">void</span> <span class=\"token operator\">*</span>v<span class=\"token punctuation\">,</span> uint pcs<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  uint <span class=\"token operator\">*</span>ebp<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">int</span> i<span class=\"token punctuation\">;</span>\n\n  ebp <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>uint<span class=\"token operator\">*</span><span class=\"token punctuation\">)</span>v <span class=\"token operator\">-</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</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> <span class=\"token number\">10</span><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 keyword\">if</span><span class=\"token punctuation\">(</span>ebp <span class=\"token operator\">==</span> <span class=\"token number\">0</span> <span class=\"token operator\">||</span> ebp <span class=\"token operator\">&lt;</span> <span class=\"token punctuation\">(</span>uint<span class=\"token operator\">*</span><span class=\"token punctuation\">)</span>KERNBASE <span class=\"token operator\">||</span> ebp <span class=\"token operator\">==</span> <span class=\"token punctuation\">(</span>uint<span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token number\">0xffffffff</span><span class=\"token punctuation\">)</span>\n      <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n    pcs<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> ebp<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>     <span class=\"token comment\">// saved %eip</span>\n    ebp <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>uint<span class=\"token operator\">*</span><span class=\"token punctuation\">)</span>ebp<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// saved %ebp</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> <span class=\"token number\">10</span><span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span>\n    pcs<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>It seems the information output when the <code class=\"language-text\">panic</code> function is called is stored here.</p>\n<h3 id=\"release-function\" style=\"position:relative;\"><a href=\"#release-function\" aria-label=\"release 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>release function</h3>\n<p>For the <code class=\"language-text\">release</code> function, there are no special points to note beyond what has been described so far, so I’ll omit the details.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">// Release the lock.</span>\n<span class=\"token keyword\">void</span> <span class=\"token function\">release</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">struct</span> <span class=\"token class-name\">spinlock</span> <span class=\"token operator\">*</span>lk<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token function\">holding</span><span class=\"token punctuation\">(</span>lk<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token function\">panic</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"release\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  lk<span class=\"token operator\">-></span>pcs<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  lk<span class=\"token operator\">-></span>cpu <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// Tell the C compiler and the processor to not move loads or stores</span>\n  <span class=\"token comment\">// past this point, to ensure that all the stores in the critical</span>\n  <span class=\"token comment\">// section are visible to other cores before the lock is released.</span>\n  <span class=\"token comment\">// Both the C compiler and the hardware may re-order loads and</span>\n  <span class=\"token comment\">// stores; __sync_synchronize() tells them both not to.</span>\n  <span class=\"token function\">__sync_synchronize</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// Release the lock, equivalent to lk->locked = 0.</span>\n  <span class=\"token comment\">// This code can't use a C assignment, since it might</span>\n  <span class=\"token comment\">// not be atomic. A real OS would use C atomics here.</span>\n  <span class=\"token keyword\">asm</span> <span class=\"token keyword\">volatile</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"movl $0, %0\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"+m\"</span> <span class=\"token punctuation\">(</span>lk<span class=\"token operator\">-></span>locked<span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">popcli</span><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>The last line <code class=\"language-text\">asm volatile(\"movl $0, %0\" : \"+m\" (lk->locked) : );</code> sets 0 to <code class=\"language-text\">locked</code> and releases the lock.</p>\n<h2 id=\"bonus-calling-the-panic-function-with-the-debugger\" style=\"position:relative;\"><a href=\"#bonus-calling-the-panic-function-with-the-debugger\" aria-label=\"bonus calling the panic function with the debugger 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>Bonus: Calling the panic function with the debugger</h2>\n<p>The <code class=\"language-text\">panic</code> function is defined in <code class=\"language-text\">console.c</code>.</p>\n<p>It seems to disable CPU interrupts and generate an infinite loop so that no further processing occurs.</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\">panic</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>s<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">int</span> i<span class=\"token punctuation\">;</span>\n  uint pcs<span class=\"token punctuation\">[</span><span class=\"token number\">10</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">cli</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  cons<span class=\"token punctuation\">.</span>locking <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// use lapiccpunum so that we can call panic from mycpu()</span>\n  <span class=\"token function\">cprintf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"lapicid %d: panic: \"</span><span class=\"token punctuation\">,</span> <span class=\"token function\">lapicid</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">cprintf</span><span class=\"token punctuation\">(</span>s<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">cprintf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"\\n\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">getcallerpcs</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>s<span class=\"token punctuation\">,</span> pcs<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</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><span class=\"token number\">10</span><span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span>\n    <span class=\"token function\">cprintf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\" %p\"</span><span class=\"token punctuation\">,</span> pcs<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  panicked <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// freeze other CPU</span>\n  <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">;</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>To see what’s actually output, I decided to trigger a <code class=\"language-text\">panic</code> with gdb.</p>\n<p>Execute the following commands in gdb in order:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># Connect to QEMU and set a breakpoint just before calling the panic function</span>\n$ target remote localhost:26000\n$ b *0x80102499\n$ <span class=\"token builtin class-name\">continue</span>\n\n<span class=\"token comment\"># Tamper with the flags register to call the panic function and execute</span>\n$ info registers eflags\neflags         0x93                <span class=\"token punctuation\">[</span> <span class=\"token assign-left variable\">IOPL</span><span class=\"token operator\">=</span><span class=\"token number\">0</span> SF AF CF <span class=\"token punctuation\">]</span>\n$ <span class=\"token builtin class-name\">set</span> <span class=\"token variable\">$CF</span> <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n$ <span class=\"token builtin class-name\">set</span> <span class=\"token variable\">$eflags</span> ^<span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token number\">1</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token variable\">$CF</span><span class=\"token punctuation\">)</span>\n$ info registers eflags\neflags         0x92                <span class=\"token punctuation\">[</span> <span class=\"token assign-left variable\">IOPL</span><span class=\"token operator\">=</span><span class=\"token number\">0</span> SF AF <span class=\"token punctuation\">]</span>\n$ <span class=\"token builtin class-name\">continue</span></code></pre></div>\n<p>When I checked the QEMU console, I could see that <code class=\"language-text\">panic</code> was called when the <code class=\"language-text\">kfree</code> function was called.</p>\n<p>The addresses displayed on the last line look like the return address stack.</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/9bc48ed77bce6b2d38a68302fb1be28e/0b533/image-19.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: 63.74999999999999%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAARlAAAEZQAGA43XUAAABYUlEQVQ4y62QuU7DQBRFx/vuOAUSxIkxW4NEAYiA4AdoKLIREiBiKyko6PiPJDjC8Z9e5nlJUiAESoqjuX4jn7kz7KbTRK/dQK/TQP+6OYfmfPZ438f72ysGvQ5uuy3cdds/0MLzwwBPl3Wwr2mCKIoQTSaI4xhJkmDKZ7TSd7E3Hn9iNBrnjBYyZzjEJE7w8dIG03QDqqJA0zTIspyi6zoMw0hnAmNgOYIgQCREMc0FNKP9gzUZTNXoZx2qqs4klmml2bZtWJaVYhomHMeB67rwPG+WMxwuFHC4oYMJogRJkqDwlgRlttDqPxxVDLCd3T34vo/trW0EQYAwDNMG1JjaEnTQb6LiWY5JqPOrGPmbFW9HVyRRIf2r8MQ3aWVYlkJYr1qZUFiR8LRmrbbhWWDPGy6DKGTCi9BeTcOCcxKu2zIqTo6rwOdUSxm1kprhZQQFZS2D501OyLPvqrjaL+MbS5xJroG2sO4AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/9bc48ed77bce6b2d38a68302fb1be28e/8ac56/image-19.webp 240w,\n/static/9bc48ed77bce6b2d38a68302fb1be28e/d3be9/image-19.webp 480w,\n/static/9bc48ed77bce6b2d38a68302fb1be28e/b0a15/image-19.webp 500w\"\n              sizes=\"(max-width: 500px) 100vw, 500px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/9bc48ed77bce6b2d38a68302fb1be28e/8ff5a/image-19.png 240w,\n/static/9bc48ed77bce6b2d38a68302fb1be28e/e85cb/image-19.png 480w,\n/static/9bc48ed77bce6b2d38a68302fb1be28e/0b533/image-19.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/9bc48ed77bce6b2d38a68302fb1be28e/0b533/image-19.png\"\n            alt=\"img\"\n            title=\"img\"\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<h2 id=\"bonus-about-memset\" style=\"position:relative;\"><a href=\"#bonus-about-memset\" aria-label=\"bonus about memset 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>Bonus: About memset</h2>\n<p><code class=\"language-text\">memset</code> is defined in <code class=\"language-text\">string.c</code> as follows:</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 operator\">*</span> <span class=\"token function\">memset</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">void</span> <span class=\"token operator\">*</span>dst<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> c<span class=\"token punctuation\">,</span> uint n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span>dst<span class=\"token operator\">%</span><span class=\"token number\">4</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span> <span class=\"token operator\">&amp;&amp;</span> n<span class=\"token operator\">%</span><span class=\"token number\">4</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    c <span class=\"token operator\">&amp;=</span> <span class=\"token number\">0xFF</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">stosl</span><span class=\"token punctuation\">(</span>dst<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span>c<span class=\"token operator\">&lt;&lt;</span><span class=\"token number\">24</span><span class=\"token punctuation\">)</span><span class=\"token operator\">|</span><span class=\"token punctuation\">(</span>c<span class=\"token operator\">&lt;&lt;</span><span class=\"token number\">16</span><span class=\"token punctuation\">)</span><span class=\"token operator\">|</span><span class=\"token punctuation\">(</span>c<span class=\"token operator\">&lt;&lt;</span><span class=\"token number\">8</span><span class=\"token punctuation\">)</span><span class=\"token operator\">|</span>c<span class=\"token punctuation\">,</span> n<span class=\"token operator\">/</span><span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span>\n    <span class=\"token function\">stosb</span><span class=\"token punctuation\">(</span>dst<span class=\"token punctuation\">,</span> c<span class=\"token punctuation\">,</span> n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> dst<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><code class=\"language-text\">memset</code> is a function that can write values to arbitrary memory regions, but it seems to have a different implementation from the following glibc <code class=\"language-text\">memset</code>.</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 operator\">*</span>\ninhibit_loop_to_libcall\n<span class=\"token function\">memset</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">void</span> <span class=\"token operator\">*</span>dstpp<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> c<span class=\"token punctuation\">,</span> <span class=\"token class-name\">size_t</span> len<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">long</span> <span class=\"token keyword\">int</span> dstp <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">long</span> <span class=\"token keyword\">int</span><span class=\"token punctuation\">)</span> dstpp<span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>len <span class=\"token operator\">>=</span> <span class=\"token number\">8</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n      <span class=\"token class-name\">size_t</span> xlen<span class=\"token punctuation\">;</span>\n      <span class=\"token class-name\">op_t</span> cccc<span class=\"token punctuation\">;</span>\n\n      cccc <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">unsigned</span> <span class=\"token keyword\">char</span><span class=\"token punctuation\">)</span> c<span class=\"token punctuation\">;</span>\n      cccc <span class=\"token operator\">|=</span> cccc <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">8</span><span class=\"token punctuation\">;</span>\n      cccc <span class=\"token operator\">|=</span> cccc <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">16</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>OPSIZ <span class=\"token operator\">></span> <span class=\"token number\">4</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\">/* Do the shift in two steps to avoid warning if long has 32 bits.  */</span>\ncccc <span class=\"token operator\">|=</span> <span class=\"token punctuation\">(</span>cccc <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">16</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">16</span><span class=\"token punctuation\">;</span>\n\n      <span class=\"token comment\">/* There are at least some bytes to set.\n No need to test for LEN == 0 in this alignment loop.  */</span>\n      <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>dstp <span class=\"token operator\">%</span> OPSIZ <span class=\"token operator\">!=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>byte <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span> dstp<span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> c<span class=\"token punctuation\">;</span>\n  dstp <span class=\"token operator\">+=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n  len <span class=\"token operator\">-=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n      <span class=\"token comment\">/* Write 8 `op_t' per iteration until less than 8 `op_t' remain.  */</span>\n      xlen <span class=\"token operator\">=</span> len <span class=\"token operator\">/</span> <span class=\"token punctuation\">(</span>OPSIZ <span class=\"token operator\">*</span> <span class=\"token number\">8</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>xlen <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">op_t</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span> dstp<span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> cccc<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">op_t</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span> dstp<span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> cccc<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">op_t</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span> dstp<span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">2</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> cccc<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">op_t</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span> dstp<span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">3</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> cccc<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">op_t</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span> dstp<span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">4</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> cccc<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">op_t</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span> dstp<span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">5</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> cccc<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">op_t</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span> dstp<span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">6</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> cccc<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">op_t</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span> dstp<span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">7</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> cccc<span class=\"token punctuation\">;</span>\n  dstp <span class=\"token operator\">+=</span> <span class=\"token number\">8</span> <span class=\"token operator\">*</span> OPSIZ<span class=\"token punctuation\">;</span>\n  xlen <span class=\"token operator\">-=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n      len <span class=\"token operator\">%=</span> OPSIZ <span class=\"token operator\">*</span> <span class=\"token number\">8</span><span class=\"token punctuation\">;</span>\n\n      <span class=\"token comment\">/* Write 1 `op_t' per iteration until less than OPSIZ bytes remain.  */</span>\n      xlen <span class=\"token operator\">=</span> len <span class=\"token operator\">/</span> OPSIZ<span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>xlen <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">op_t</span> <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span> dstp<span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> cccc<span class=\"token punctuation\">;</span>\n  dstp <span class=\"token operator\">+=</span> OPSIZ<span class=\"token punctuation\">;</span>\n  xlen <span class=\"token operator\">-=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n      len <span class=\"token operator\">%=</span> OPSIZ<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">/* Write the last few bytes.  */</span>\n  <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>len <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n      <span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>byte <span class=\"token operator\">*</span><span class=\"token punctuation\">)</span> dstp<span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> c<span class=\"token punctuation\">;</span>\n      dstp <span class=\"token operator\">+=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n      len <span class=\"token operator\">-=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n  <span class=\"token keyword\">return</span> dstpp<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Reference: <a href=\"https://github.com/lattera/glibc/blob/master/string/memset.c\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">glibc/memset.c at master · lattera/glibc</a></p>\n<p><code class=\"language-text\">memset</code> can write specific values to arbitrary address ranges at high speed, and is used for initialization, etc.</p>\n<p>It seems to be implemented to operate faster than a simple for loop implementation.</p>\n<p>Reference: <a href=\"https://stackoverflow.com/questions/13327155/memset-definition-and-use\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">c++ - Memset Definition and use - Stack Overflow</a></p>\n<p>The xv6 <code class=\"language-text\">memset</code> is a much simpler implementation than the glibc one, but it seems to be implemented to operate faster than a for loop by using the <code class=\"language-text\">stosb</code> and <code class=\"language-text\">stosl</code> instructions.</p>\n<p>Let’s actually check that memset is working using gdb.</p>\n<p>First, set a breakpoint just before executing <code class=\"language-text\">memset</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">$ target remote localhost:26000\n$ b memset\n$ <span class=\"token builtin class-name\">continue</span></code></pre></div>\n<p>Since we set a breakpoint, when I looked at the contents from the page start address for 0x1000 bytes, everything was 0.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># View the memory state just before executing memset</span>\n$ x/1000 0x80116000\n0x80116000:0x000000000x000000000x000000000x00000000\n<span class=\"token punctuation\">{</span> omitted <span class=\"token punctuation\">}</span>\n0x80116f90:0x000000000x000000000x000000000x00000000</code></pre></div>\n<p>Next, when I looked at the same memory region just after <code class=\"language-text\">memset</code> finished, I could confirm that all byte values were 1. (It’s hard to tell because the output is separated every 4 bytes.)</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token comment\"># View the memory state just after executing memset</span>\n$ finish\n$ $ x/1000 0x80116000\n0x80116000:0x010101010x010101010x010101010x01010101\n<span class=\"token punctuation\">{</span> omitted <span class=\"token punctuation\">}</span>\n0x80116f90:0x010101010x010101010x010101010x01010101</code></pre></div>\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>We’ve finally progressed to the kernel itself.</p>\n<p>However, reading just the first function of the <code class=\"language-text\">main</code> function has become quite voluminous, so I’ll compile the continuation in the next article.</p>\n<h2 id=\"references\" style=\"position:relative;\"><a href=\"#references\" aria-label=\"references 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>References</h2>\n<ul>\n<li><a href=\"https://amzn.to/3qZSCY7\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">30-Day OS Development Guide</a></li>\n<li><a href=\"https://amzn.to/3qXYsZX\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Introduction to OS Development from Scratch</a></li>\n<li><a href=\"https://amzn.to/3q8TU3K\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Introduction to OS Code Reading ~Understanding the Kernel Mechanisms with UNIX V6</a></li>\n<li><a href=\"https://amzn.to/3I6fkVt\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Understanding the Linux Kernel</a></li>\n<li><a href=\"https://amzn.to/3JRUdI2\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Understanding OS by Building: Theory and Implementation for Running x86 Computers</a></li>\n</ul>","fields":{"slug":"/unix-xv6-004-kernel-main-01-en","tagSlugs":["/tag/unix-en/","/tag/xv-6-en/","/tag/kernel-en/","/tag/os-en/","/tag/english/"]},"frontmatter":{"date":"2022-01-25","description":"Learning about the kernel by reading the source code of the educational OS xv6. This article explores the behavior of the main function in the xv6 OS kernel.","tags":["Unix (en)","xv6 (en)","Kernel (en)","OS (en)","English"],"title":"Reading xv6 OS in Depth to Completely Understand the Kernel - Memory Allocation and Mutual Exclusion -","socialImage":{"publicURL":"/static/9a7823be64a7e2f84c3e207689bb85a9/unix-xv6-004-kernel-main-01.png"}}}},"pageContext":{"slug":"/unix-xv6-004-kernel-main-01-en"}},"staticQueryHashes":["251939775","401334301","825871152"]}