{"componentChunkName":"component---src-templates-post-template-js","path":"/unix-xv6-010-kernel-main-07-en","result":{"data":{"markdownRemark":{"id":"8f9ed2e0-6abb-55e5-91e6-d1d7820e09ed","html":"<blockquote>\n<p>This page has been machine-translated from the <a href=\"/unix-xv6-010-kernel-main-07\">original page</a>.</p>\n</blockquote>\n<p>I’m reading <a href=\"https://github.com/mit-pdos/xv6-public\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">xv6 OS</a> inspired by <a href=\"https://amzn.to/3q8TU3K\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Your First OS Code Reading: Learning Kernel Internals with UNIX V6</a>.</p>\n<p>Because UNIX V6 itself does not run on x86 CPUs, I 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>, a fork of the <a href=\"https://github.com/mit-pdos/xv6-public\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">xv6 OS</a> repository that adapts UNIXv6 to run on the x86 architecture.</p>\n<p><a href=\"/unix-xv6-009-kernel-main-06-en\">Last time</a>, we looked at the <code class=\"language-text\">picinit</code> and <code class=\"language-text\">ioapicinit</code> functions executed from <code class=\"language-text\">main</code>.</p>\n<p>This time, I’ll follow the behavior of the <code class=\"language-text\">consoleinit</code> function.</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>\n<p><a href=\"#the-consoleinit-function\">The consoleinit function</a></p>\n<ul>\n<li><a href=\"#about-the-devsw-structure\">About the devsw structure</a></li>\n<li><a href=\"#what-is-an-inode\">What is an inode</a></li>\n<li><a href=\"#reading-the-consolewrite-function\">Reading the consolewrite function</a></li>\n<li><a href=\"#writing-to-video-memory\">Writing to video memory</a></li>\n<li><a href=\"#reading-the-consoleread-function\">Reading the consoleread function</a></li>\n</ul>\n</li>\n<li><a href=\"#summary\">Summary</a></li>\n<li><a href=\"#reference-books\">Reference books</a></li>\n</ul>\n<h2 id=\"the-consoleinit-function\" style=\"position:relative;\"><a href=\"#the-consoleinit-function\" aria-label=\"the consoleinit function permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>The consoleinit function</h2>\n<p>The <code class=\"language-text\">consoleinit</code> function is defined in <code class=\"language-text\">console.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 function\">consoleinit</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\">initlock</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>cons<span class=\"token punctuation\">.</span>lock<span class=\"token punctuation\">,</span> <span class=\"token string\">\"console\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  devsw<span class=\"token punctuation\">[</span>CONSOLE<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>write <span class=\"token operator\">=</span> consolewrite<span class=\"token punctuation\">;</span>\n  devsw<span class=\"token punctuation\">[</span>CONSOLE<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>read <span class=\"token operator\">=</span> consoleread<span class=\"token punctuation\">;</span>\n  cons<span class=\"token punctuation\">.</span>locking <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">ioapicenable</span><span class=\"token punctuation\">(</span>IRQ_KBD<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>First, <code class=\"language-text\">initlock(&amp;cons.lock, \"console\");</code> on the first line is the function that initializes the <code class=\"language-text\">spinlock</code> structure used for the memory lock we looked at in <a href=\"/unix-xv6-004-kernel-main-01\">the memory allocation and mutual exclusion article</a>.</p>\n<p>The <code class=\"language-text\">&amp;cons.lock</code> used here is defined as follows.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">static</span> <span class=\"token keyword\">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> locking<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> cons<span class=\"token punctuation\">;</span></code></pre></div>\n<p>Incidentally, <code class=\"language-text\">consoleinit</code> itself does not lock memory.</p>\n<p>Instead, memory locking is performed using <code class=\"language-text\">cons</code> when functions such as <code class=\"language-text\">consoleread</code> and <code class=\"language-text\">consolewrite</code> run.</p>\n<p>Next, let’s look at the following lines.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">devsw<span class=\"token punctuation\">[</span>CONSOLE<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>write <span class=\"token operator\">=</span> consolewrite<span class=\"token punctuation\">;</span>\ndevsw<span class=\"token punctuation\">[</span>CONSOLE<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>read <span class=\"token operator\">=</span> consoleread<span class=\"token punctuation\">;</span></code></pre></div>\n<p>The <code class=\"language-text\">devsw</code> referenced here is an array of <code class=\"language-text\">devsw</code> structures, and this array is defined in <code class=\"language-text\">file.c</code>.</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\">devsw</span> devsw<span class=\"token punctuation\">[</span>NDEV<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The <code class=\"language-text\">devsw</code> structure itself is defined in <code class=\"language-text\">file.h</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">// table mapping major device number to</span>\n<span class=\"token comment\">// device functions</span>\n<span class=\"token keyword\">struct</span> <span class=\"token class-name\">devsw</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">int</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">*</span>read<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">struct</span> <span class=\"token class-name\">inode</span><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 keyword\">int</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">int</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">*</span>write<span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">struct</span> <span class=\"token class-name\">inode</span><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 keyword\">int</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">extern</span> <span class=\"token keyword\">struct</span> <span class=\"token class-name\">devsw</span> devsw<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</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\">CONSOLE</span> <span class=\"token expression\"><span class=\"token number\">1</span></span></span></code></pre></div>\n<p>By the way, <code class=\"language-text\">NDEV</code> is defined as 10 in <code class=\"language-text\">param.h</code>.</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\">NDEV</span>         <span class=\"token expression\"><span class=\"token number\">10</span>  </span><span class=\"token comment\">// maximum major device number</span></span></code></pre></div>\n<h3 id=\"about-the-devsw-structure\" style=\"position:relative;\"><a href=\"#about-the-devsw-structure\" aria-label=\"about the devsw structure 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 the devsw structure</h3>\n<p>What I wanted to understand in more detail here was what exactly the <code class=\"language-text\">devsw</code> structure is.</p>\n<p>Looking at UNIX manuals and similar material, the <code class=\"language-text\">devsw</code> structure seems to be used when device drivers provide <code class=\"language-text\">character device interfaces</code>.</p>\n<p>Reference: <a href=\"https://man.netbsd.org/devsw.9\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">devsw(9) - NetBSD Manual Pages</a></p>\n<p>Also, based on the following page, I think <code class=\"language-text\">character device interfaces</code> correspond to I/O interfaces for devices where the system transfers data one character at a time.</p>\n<p>Reference: <a href=\"https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Device file - Wikipedia</a></p>\n<p>Looking at the definition of the <code class=\"language-text\">devsw</code> structure here, two kinds of function pointers are set: <code class=\"language-text\">read</code> and <code class=\"language-text\">write</code>.</p>\n<p>Arbitrary functions are assigned here, as in the <code class=\"language-text\">consoleinit</code> function.</p>\n<p>Both functions take an <code class=\"language-text\">inode</code> structure as an argument.</p>\n<p>Like the <code class=\"language-text\">devsw</code> structure, the <code class=\"language-text\">inode</code> structure is defined in <code class=\"language-text\">file.h</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">// in-memory copy of an inode</span>\n<span class=\"token keyword\">struct</span> <span class=\"token class-name\">inode</span> <span class=\"token punctuation\">{</span>\n  uint dev<span class=\"token punctuation\">;</span>           <span class=\"token comment\">// Device number</span>\n  uint inum<span class=\"token punctuation\">;</span>          <span class=\"token comment\">// Inode number</span>\n  <span class=\"token keyword\">int</span> ref<span class=\"token punctuation\">;</span>            <span class=\"token comment\">// Reference count</span>\n  <span class=\"token keyword\">struct</span> <span class=\"token class-name\">sleeplock</span> lock<span class=\"token punctuation\">;</span> <span class=\"token comment\">// protects everything below here</span>\n  <span class=\"token keyword\">int</span> valid<span class=\"token punctuation\">;</span>          <span class=\"token comment\">// inode has been read from disk?</span>\n\n  <span class=\"token keyword\">short</span> type<span class=\"token punctuation\">;</span>         <span class=\"token comment\">// copy of disk inode</span>\n  <span class=\"token keyword\">short</span> major<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">short</span> minor<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">short</span> nlink<span class=\"token punctuation\">;</span>\n  uint size<span class=\"token punctuation\">;</span>\n  uint addrs<span class=\"token punctuation\">[</span>NDIRECT<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"what-is-an-inode\" style=\"position:relative;\"><a href=\"#what-is-an-inode\" aria-label=\"what is an inode 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>What is an inode</h3>\n<p>Before going further, I’ll briefly touch on what an <code class=\"language-text\">inode</code> is.</p>\n<p>Roughly speaking, an <code class=\"language-text\">inode</code> is a structure that stores information about file system objects such as files and directories.</p>\n<p>The kinds of information an <code class=\"language-text\">inode</code> holds include the following.</p>\n<ul>\n<li>File size (number of bytes)</li>\n<li>The device ID of the device storing the file</li>\n<li>The owner and group IDs of the file</li>\n<li>The inode number used to identify the file within the file system</li>\n<li>Timestamps</li>\n</ul>\n<p>Reference: <a href=\"https://ja.wikipedia.org/wiki/Inode\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">inode - Wikipedia</a></p>\n<p>If you look at xv6OS’s <code class=\"language-text\">inode</code> structure, you can see that it stores similar information.</p>\n<p><code class=\"language-text\">inode</code>s are managed by unique IDs within the system (in xv6OS, <code class=\"language-text\">inum</code> probably fills that role).</p>\n<p>There is usually an upper limit on assignable <code class=\"language-text\">inode</code> numbers, and if the available <code class=\"language-text\">inode</code> numbers are exhausted, you can no longer create new files even if there is still free disk space on the storage device.</p>\n<p>On a typical Linux system, you can check each device’s inode limit with the <code class=\"language-text\">df -i</code> command.</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">$ <span class=\"token function\">df</span> -i\nFilesystem                         Inodes  IUsed   IFree IUse% Mounted on\nudev                              <span class=\"token number\">1007124</span>    <span class=\"token number\">449</span> <span class=\"token number\">1006675</span>    <span class=\"token number\">1</span>% /dev\ntmpfs                             <span class=\"token number\">1019154</span>    <span class=\"token number\">919</span> <span class=\"token number\">1018235</span>    <span class=\"token number\">1</span>% /run\n/dev/mapper/ubuntu--vg-ubuntu--lv <span class=\"token number\">1310720</span> <span class=\"token number\">380878</span>  <span class=\"token number\">929842</span>   <span class=\"token number\">30</span>% /\ntmpfs                             <span class=\"token number\">1019154</span>      <span class=\"token number\">1</span> <span class=\"token number\">1019153</span>    <span class=\"token number\">1</span>% /dev/shm\ntmpfs                             <span class=\"token number\">1019154</span>      <span class=\"token number\">5</span> <span class=\"token number\">1019149</span>    <span class=\"token number\">1</span>% /run/lock\ntmpfs                             <span class=\"token number\">1019154</span>     <span class=\"token number\">18</span> <span class=\"token number\">1019136</span>    <span class=\"token number\">1</span>% /sys/fs/cgroup\n/dev/loop0                             <span class=\"token number\">29</span>     <span class=\"token number\">29</span>       <span class=\"token number\">0</span>  <span class=\"token number\">100</span>% /snap/bare/5\n/dev/loop2                          <span class=\"token number\">10847</span>  <span class=\"token number\">10847</span>       <span class=\"token number\">0</span>  <span class=\"token number\">100</span>% /snap/core18/2284\n/dev/loop1                          <span class=\"token number\">10836</span>  <span class=\"token number\">10836</span>       <span class=\"token number\">0</span>  <span class=\"token number\">100</span>% /snap/core18/2253\n/dev/loop3                          <span class=\"token number\">11776</span>  <span class=\"token number\">11776</span>       <span class=\"token number\">0</span>  <span class=\"token number\">100</span>% /snap/core20/1270\n/dev/loop5                          <span class=\"token number\">18500</span>  <span class=\"token number\">18500</span>       <span class=\"token number\">0</span>  <span class=\"token number\">100</span>% /snap/gnome-3-34-1804/72\n/dev/loop4                          <span class=\"token number\">11777</span>  <span class=\"token number\">11777</span>       <span class=\"token number\">0</span>  <span class=\"token number\">100</span>% /snap/core20/1328\n/dev/loop6                          <span class=\"token number\">18500</span>  <span class=\"token number\">18500</span>       <span class=\"token number\">0</span>  <span class=\"token number\">100</span>% /snap/gnome-3-34-1804/77\n/dev/loop7                          <span class=\"token number\">65095</span>  <span class=\"token number\">65095</span>       <span class=\"token number\">0</span>  <span class=\"token number\">100</span>% /snap/gtk-common-themes/1519\n/dev/loop8                            <span class=\"token number\">796</span>    <span class=\"token number\">796</span>       <span class=\"token number\">0</span>  <span class=\"token number\">100</span>% /snap/lxd/21835\n/dev/loop9                          <span class=\"token number\">64986</span>  <span class=\"token number\">64986</span>       <span class=\"token number\">0</span>  <span class=\"token number\">100</span>% /snap/gtk-common-themes/1515\n/dev/loop10                           <span class=\"token number\">796</span>    <span class=\"token number\">796</span>       <span class=\"token number\">0</span>  <span class=\"token number\">100</span>% /snap/lxd/21545\n/dev/loop11                           <span class=\"token number\">479</span>    <span class=\"token number\">479</span>       <span class=\"token number\">0</span>  <span class=\"token number\">100</span>% /snap/snapd/14295\n/dev/loop12                           <span class=\"token number\">482</span>    <span class=\"token number\">482</span>       <span class=\"token number\">0</span>  <span class=\"token number\">100</span>% /snap/snapd/14549\n/dev/sda2                           <span class=\"token number\">65536</span>    <span class=\"token number\">320</span>   <span class=\"token number\">65216</span>    <span class=\"token number\">1</span>% /boot\ntmpfs                             <span class=\"token number\">1019154</span>     <span class=\"token number\">45</span> <span class=\"token number\">1019109</span>    <span class=\"token number\">1</span>% /run/user/121\ntmpfs                             <span class=\"token number\">1019154</span>     <span class=\"token number\">83</span> <span class=\"token number\">1019071</span>    <span class=\"token number\">1</span>% /run/user/1000</code></pre></div>\n<p>Reference: <a href=\"https://kazmax.zpp.jp/linux_beginner/inode.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">What Is an i-node (inode)?</a></p>\n<h3 id=\"reading-the-consolewrite-function\" style=\"position:relative;\"><a href=\"#reading-the-consolewrite-function\" aria-label=\"reading the consolewrite 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>Reading the consolewrite function</h3>\n<p>At this point, we still are not creating files using <code class=\"language-text\">inode</code>, so for now let’s return to xv6OS’s code.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">devsw<span class=\"token punctuation\">[</span>CONSOLE<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>write <span class=\"token operator\">=</span> consolewrite<span class=\"token punctuation\">;</span>\ndevsw<span class=\"token punctuation\">[</span>CONSOLE<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>read <span class=\"token operator\">=</span> consoleread<span class=\"token punctuation\">;</span></code></pre></div>\n<p>The <code class=\"language-text\">write</code> and <code class=\"language-text\">read</code> fields of the <code class=\"language-text\">CONSOLE = 1</code> element in the <code class=\"language-text\">devsw</code> array are assigned the functions defined in <code class=\"language-text\">console.c</code>.</p>\n<p>First, let’s read the <code class=\"language-text\">consolewrite</code> function.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">int</span> <span class=\"token function\">consolewrite</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">struct</span> <span class=\"token class-name\">inode</span> <span class=\"token operator\">*</span>ip<span class=\"token punctuation\">,</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>buf<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> n<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\n  <span class=\"token function\">iunlock</span><span class=\"token punctuation\">(</span>ip<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">acquire</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>cons<span class=\"token punctuation\">.</span>lock<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> n<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token function\">consputc</span><span class=\"token punctuation\">(</span>buf<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0xff</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">release</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>cons<span class=\"token punctuation\">.</span>lock<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">ilock</span><span class=\"token punctuation\">(</span>ip<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> n<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The <code class=\"language-text\">consolewrite</code> function takes a pointer to the target <code class=\"language-text\">inode</code> structure variable, along with the characters to pass to <code class=\"language-text\">consputc</code> and their length.</p>\n<p>First is the <code class=\"language-text\">iunlock</code> function, which is defined in <code class=\"language-text\">fs.c</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">// Unlock the given inode.</span>\n<span class=\"token keyword\">void</span> <span class=\"token function\">iunlock</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">struct</span> <span class=\"token class-name\">inode</span> <span class=\"token operator\">*</span>ip<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>ip <span class=\"token operator\">==</span> <span class=\"token number\">0</span> <span class=\"token operator\">||</span> <span class=\"token operator\">!</span><span class=\"token function\">holdingsleep</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>ip<span class=\"token operator\">-></span>lock<span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span> ip<span class=\"token operator\">-></span>ref <span class=\"token operator\">&lt;</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token function\">panic</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"iunlock\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">releasesleep</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>ip<span class=\"token operator\">-></span>lock<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>I’ll look at this function in more detail when I get to the file system, but it releases the lock by manipulating the <code class=\"language-text\">sleeplock</code> structure held by the passed <code class=\"language-text\">inode</code>.</p>\n<p>Next, after acquiring the lock with <code class=\"language-text\">acquire</code>, it feeds the passed string into <code class=\"language-text\">consputc</code> one character at a time.</p>\n<p>At this point, the supplied string is ANDed with <code class=\"language-text\">0xFF</code>, so only the lower 8 bits are passed along.</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\">consputc</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> c<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>panicked<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\">for</span><span class=\"token punctuation\">(</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\n  <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>c <span class=\"token operator\">==</span> BACKSPACE<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    <span class=\"token function\">uartputc</span><span class=\"token punctuation\">(</span><span class=\"token char\">'\\b'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token function\">uartputc</span><span class=\"token punctuation\">(</span><span class=\"token char\">' '</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token function\">uartputc</span><span class=\"token punctuation\">(</span><span class=\"token char\">'\\b'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span><span class=\"token punctuation\">{</span>\n      <span class=\"token function\">uartputc</span><span class=\"token punctuation\">(</span>c<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token function\">cgaputc</span><span class=\"token punctuation\">(</span>c<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\">uartputc</code> is called with the supplied value as its argument.</p>\n<p>The <code class=\"language-text\">uartputc</code> function is defined in <code class=\"language-text\">uart.c</code>, and it writes to the serial port (UART).</p>\n<p>Here, it writes the received value to <code class=\"language-text\">COM1</code> (I/O port <code class=\"language-text\">0x3f8</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\">uartputc</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> c<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\n  <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>uart<span class=\"token punctuation\">)</span> <span class=\"token keyword\">return</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\">128</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token operator\">!</span><span class=\"token punctuation\">(</span><span class=\"token function\">inb</span><span class=\"token punctuation\">(</span>COM1<span class=\"token operator\">+</span><span class=\"token number\">5</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;</span> <span class=\"token number\">0x20</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token function\">microdelay</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">outb</span><span class=\"token punctuation\">(</span>COM1<span class=\"token operator\">+</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> c<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\">COM1+0</code> is the data register, and writing a value here writes it to the transmit buffer.</p>\n<p>The previous line, <code class=\"language-text\">inb(COM1+5)</code>, reads the value of the line status register.</p>\n<p>The sixth bit of the line status register is called <code class=\"language-text\">THRE</code>, and when this bit is set, it means the transmit buffer is empty and ready to send new data.</p>\n<p>Reference: <a href=\"https://wiki.osdev.org/Serial_Ports\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Serial Ports - OSDev Wiki</a></p>\n<p>In other words, the line <code class=\"language-text\">!(inb(COM1+5) &amp; 0x20)</code> checks the <code class=\"language-text\">THRE</code> bit in the line status register, and if the transmit buffer is not available, it delays processing with the <code class=\"language-text\">microdelay</code> function.</p>\n<p>By the way, when <code class=\"language-text\">BACKSPACE</code> is entered, the sequence <code class=\"language-text\">uartputc('\\b'); uartputc(' '); uartputc('\\b');</code> seems to mean: move the cursor back one position, overwrite that position with a space, and then move the cursor back once more to the position before the write.</p>\n<h3 id=\"writing-to-video-memory\" style=\"position:relative;\"><a href=\"#writing-to-video-memory\" aria-label=\"writing to video memory 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>Writing to video memory</h3>\n<p>Once writing to the serial port is done, the <code class=\"language-text\">cgaputc</code> function is called at the end.</p>\n<p><code class=\"language-text\">cgaputc</code> writes the input value to video memory and displays it.</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\">cgaputc</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> c<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">int</span> pos<span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// Cursor position: col + 80*row.</span>\n  <span class=\"token function\">outb</span><span class=\"token punctuation\">(</span>CRTPORT<span class=\"token punctuation\">,</span> <span class=\"token number\">14</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  pos <span class=\"token operator\">=</span> <span class=\"token function\">inb</span><span class=\"token punctuation\">(</span>CRTPORT<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">8</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">outb</span><span class=\"token punctuation\">(</span>CRTPORT<span class=\"token punctuation\">,</span> <span class=\"token number\">15</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  pos <span class=\"token operator\">|=</span> <span class=\"token function\">inb</span><span class=\"token punctuation\">(</span>CRTPORT<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>c <span class=\"token operator\">==</span> <span class=\"token char\">'\\n'</span><span class=\"token punctuation\">)</span> pos <span class=\"token operator\">+=</span> <span class=\"token number\">80</span> <span class=\"token operator\">-</span> pos<span class=\"token operator\">%</span><span class=\"token number\">80</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>c <span class=\"token operator\">==</span> BACKSPACE<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>pos <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">--</span>pos<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span><span class=\"token punctuation\">{</span>\n    crt<span class=\"token punctuation\">[</span>pos<span class=\"token operator\">++</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>c<span class=\"token operator\">&amp;</span><span class=\"token number\">0xff</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">|</span> <span class=\"token number\">0x0700</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">// black on white</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>pos <span class=\"token operator\">&lt;</span> <span class=\"token number\">0</span> <span class=\"token operator\">||</span> pos <span class=\"token operator\">></span> <span class=\"token number\">25</span><span class=\"token operator\">*</span><span class=\"token number\">80</span><span class=\"token punctuation\">)</span> <span class=\"token function\">panic</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"pos under/overflow\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>pos<span class=\"token operator\">/</span><span class=\"token number\">80</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">>=</span> <span class=\"token number\">24</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>  <span class=\"token comment\">// Scroll up.</span>\n    <span class=\"token function\">memmove</span><span class=\"token punctuation\">(</span>crt<span class=\"token punctuation\">,</span> crt<span class=\"token operator\">+</span><span class=\"token number\">80</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">sizeof</span><span class=\"token punctuation\">(</span>crt<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token number\">23</span><span class=\"token operator\">*</span><span class=\"token number\">80</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    pos <span class=\"token operator\">-=</span> <span class=\"token number\">80</span><span class=\"token punctuation\">;</span>\n    <span class=\"token function\">memset</span><span class=\"token punctuation\">(</span>crt<span class=\"token operator\">+</span>pos<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">sizeof</span><span class=\"token punctuation\">(</span>crt<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token punctuation\">(</span><span class=\"token number\">24</span><span class=\"token operator\">*</span><span class=\"token number\">80</span> <span class=\"token operator\">-</span> pos<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">outb</span><span class=\"token punctuation\">(</span>CRTPORT<span class=\"token punctuation\">,</span> <span class=\"token number\">14</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">outb</span><span class=\"token punctuation\">(</span>CRTPORT<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> pos<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 function\">outb</span><span class=\"token punctuation\">(</span>CRTPORT<span class=\"token punctuation\">,</span> <span class=\"token number\">15</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">outb</span><span class=\"token punctuation\">(</span>CRTPORT<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> pos<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  crt<span class=\"token punctuation\">[</span>pos<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token char\">' '</span> <span class=\"token operator\">|</span> <span class=\"token number\">0x0700</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The <code class=\"language-text\">crt</code> destination used here points to the region at address <code class=\"language-text\">0xb8000</code>.</p>\n<p>This region is called the frame buffer.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token comment\">//PAGEBREAK: 50</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\">BACKSPACE</span> <span class=\"token expression\"><span class=\"token number\">0x100</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\">CRTPORT</span> <span class=\"token expression\"><span class=\"token number\">0x3d4</span></span></span>\n<span class=\"token keyword\">static</span> ushort <span class=\"token operator\">*</span>crt <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>ushort<span class=\"token operator\">*</span><span class=\"token punctuation\">)</span><span class=\"token function\">P2V</span><span class=\"token punctuation\">(</span><span class=\"token number\">0xb8000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">// CGA memory</span></code></pre></div>\n<p>Reference: <a href=\"https://e-words.jp/w/%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%90%E3%83%83%E3%83%95%E3%82%A1.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">What Is a Frame Buffer? - e-Words IT Dictionary</a></p>\n<p>Reference: <a href=\"http://www.jamesmolloy.co.uk/tutorial_html/3.-The%20Screen.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">3.-The Screen</a></p>\n<p>First, <code class=\"language-text\">CRTPORT</code> points to <code class=\"language-text\">0x3D4</code>, the register of the <code class=\"language-text\">CRT Controller</code>.</p>\n<p>This is a control register, and the data register area corresponding to <code class=\"language-text\">0x3D4</code> is <code class=\"language-text\">0x3D5</code>.</p>\n<p>Using these two regions, you can control the cursor position on the console.</p>\n<p>Setting 14 in <code class=\"language-text\">0x3D4</code> selects control of the upper 8 bits of the 16-bit cursor value.</p>\n<p>Setting 15 selects control of the lower 8 bits of the cursor value.</p>\n<p>In other words, the following lines store the current 16-bit cursor position in the variable <code class=\"language-text\">pos</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token function\">outb</span><span class=\"token punctuation\">(</span>CRTPORT<span class=\"token punctuation\">,</span> <span class=\"token number\">14</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\npos <span class=\"token operator\">=</span> <span class=\"token function\">inb</span><span class=\"token punctuation\">(</span>CRTPORT<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">8</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">outb</span><span class=\"token punctuation\">(</span>CRTPORT<span class=\"token punctuation\">,</span> <span class=\"token number\">15</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\npos <span class=\"token operator\">|=</span> <span class=\"token function\">inb</span><span class=\"token punctuation\">(</span>CRTPORT<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The relationship between the upper and lower bits of the cursor value obtained here is shown below.</p>\n<p>The upper 8 bits indicate the cursor’s row position, and the lower 8 bits indicate the column position.</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/ac478630360bb1e1ebc49d50bbf1a5cd/0b533/image-37.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: 81.25%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAARlAAAEZQAGA43XUAAAB4ElEQVQ4y52UiW7aQBCGjd1KTQQ4QRBzBFVRpUqN2kp9/xcBQgLGBzZHEoPNYhvzZ2eJjQNJmnalj/UMs/9eMyv5qxBRvEEY7Yg3CbcT0aeQnSeNzUMaAYsghVGMfDMMA67rotfrodvpoN+/gWVZ0HUd+nAI0zTxVluHMST6obbdbjkAY2tEUQQ/CLBYLLBcLuH7PgJuU88YQ8xXkyRbTiKgsa8KHs24ZpmfrVYY2zafYPHxFdLMs/kDJtM5prN7OO40+x47EximDXvsihjyEbP5PT/nzaHgbhUjw8SP6584r1SgaXVcEBcaahz61uoN4U/tarWG9tcr9G8HYvyKhZDYOsq2NRiOoJ6dQ5KkD6Mon9Hp3uwFKQ3SNtRHYmYKlGUFhUJBkBdIfbIsC/vktMgzor8XpHPwPC8TrNa0bGAqUiqVoKoqisXi0Qq/nJyi28utkA444OnwniAJVfi5lsvlvwu+uWXlP7d8dCnq2T9diqx8enkpL9PGwq/ff0RatC7baLYuBY0m71Oefa1WG/VGE1ffvuP2bnAouEtsKrmx48KyHdgc6xnHnYjEJqycP40J+bgssQ8fh1dLipeg5z2K/t04Ejx8vmiCMNxBAfQflR+V3cOjJ2zyi7iM/fP1BEPRt77flC1tAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/ac478630360bb1e1ebc49d50bbf1a5cd/8ac56/image-37.webp 240w,\n/static/ac478630360bb1e1ebc49d50bbf1a5cd/d3be9/image-37.webp 480w,\n/static/ac478630360bb1e1ebc49d50bbf1a5cd/b0a15/image-37.webp 500w\"\n              sizes=\"(max-width: 500px) 100vw, 500px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/ac478630360bb1e1ebc49d50bbf1a5cd/8ff5a/image-37.png 240w,\n/static/ac478630360bb1e1ebc49d50bbf1a5cd/e85cb/image-37.png 480w,\n/static/ac478630360bb1e1ebc49d50bbf1a5cd/0b533/image-37.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/ac478630360bb1e1ebc49d50bbf1a5cd/0b533/image-37.png\"\n            alt=\"2022/02/image-37.png\"\n            title=\"2022/02/image-37.png\"\n            loading=\"lazy\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>The following line defines the behavior when a newline character is passed.</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>c <span class=\"token operator\">==</span> <span class=\"token char\">'\\n'</span><span class=\"token punctuation\">)</span> pos <span class=\"token operator\">+=</span> <span class=\"token number\">80</span> <span class=\"token operator\">-</span> pos<span class=\"token operator\">%</span><span class=\"token number\">80</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>It increments <code class=\"language-text\">pos</code> so that the cursor moves to the leftmost position of the next line.</p>\n<p>If <code class=\"language-text\">BACKSPACE</code> is given, the cursor position is moved back by one.</p>\n<p>When ordinary character input is given, 16-bit character data is stored.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>c <span class=\"token operator\">==</span> BACKSPACE<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>pos <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">--</span>pos<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span><span class=\"token punctuation\">{</span>\n  crt<span class=\"token punctuation\">[</span>pos<span class=\"token operator\">++</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>c<span class=\"token operator\">&amp;</span><span class=\"token number\">0xff</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">|</span> <span class=\"token number\">0x0700</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">// black on white</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>The upper 8 bits of this character data hold the background and text color information.</p>\n<p>The lower 8 bits specify the character to display.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 311px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/9119764dfbb86dac586e9a998536c1a0/ffa0f/image-35.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: 30.41666666666667%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAAAsTAAALEwEAmpwYAAABP0lEQVQY012RiWrjQBBE/f9/tRByrCzbClkfso7IOmZG10iWJcvOwstIgRDS8KhqKHp66EVXDaReQaMuhp4iaZBRRZWd516LjjzWVGmLliYj+1l/+sZQJi0izFlkQcnLg013vnDtb4T+O7a1RqSKcbjR1C3u/kgcJeiqoe+uDJeJkf48fPWGoxuwszwW4T7m6fEZa/mX9Xo1s91tefv3xnJp4TibGSEFt9s46+kUERmkEsRJjFKSrr/w+rydBqZUuWa/P7DZOOhaUxuapsWylnieP29flRVTCSHx/QDXPSIySeCHSKm4f/zHeTIDRVSYdSOC9xjPjwij1LyekcmCUyxIzNcnHyfSaIkqaoqymZl8XmpUXpOazNEJWahQYf+xOTgHdvaO1cMKEQg+2jujHr+or996NUf8zWC4m7x0JZ/C87uCiI7abQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/9119764dfbb86dac586e9a998536c1a0/8ac56/image-35.webp 240w,\n/static/9119764dfbb86dac586e9a998536c1a0/c6a73/image-35.webp 311w\"\n              sizes=\"(max-width: 311px) 100vw, 311px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/9119764dfbb86dac586e9a998536c1a0/8ff5a/image-35.png 240w,\n/static/9119764dfbb86dac586e9a998536c1a0/ffa0f/image-35.png 311w\"\n            sizes=\"(max-width: 311px) 100vw, 311px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/9119764dfbb86dac586e9a998536c1a0/ffa0f/image-35.png\"\n            alt=\"2022/02/image-35.png\"\n            title=\"2022/02/image-35.png\"\n            loading=\"lazy\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>Reference image: <a href=\"http://www.jamesmolloy.co.uk/tutorial_html/3.-The%20Screen.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">3.-The Screen</a></p>\n<p>If you check it in the debugger, you can confirm that this processing actually displays characters on the console.</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/287bd96654e766d4a3f99968fe97efa7/0b533/image-34.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: 55.833333333333336%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAARlAAAEZQAGA43XUAAACYklEQVQoz4WTy08TURSHp6R2Wlpo7HTamekLSukLKO20tNPHTB8gJYSSkOhCE1cu1CiPugGi6MYYFz7+AxNXrvRf/Lwd0I0kLr7cc29yf/d37jlHGms1Buomo0STfmyTgbbOMNHC0arY2gZOrEYzVPyLJagHihym8/ya5vj+tMIbR+XtQOGqH0GykyadqIktLvbjJj2lSnNxjWaw6NIKzkRKWAtld20vlDDlAkdLeX68MPl51ubrJMPHHYX32ypSK1XFiln09CYHhSH7OQcrfC3YEiJmKE81tEI1eIOIzXCZw2yOd3sZvj1Z48tRkquRyrtBDMlKV7C0jki3Ri/VpCdSnaXZiazTWCzxYHzEyekxp8cnvJpOXS7Oz7m8OOdMnJ8dP2d6+pKpOL989hipn6pzb6nLji7STtZp3S0yjK3hRFdpR1bJaxk0Q0fTNBLJBOl0mriIo9Eoum64GIJoXCOrK0iT4pD7tTGT8ohJYSCclbD1IqOkEI2UMYIKXtmHX5bxeDxIkvQPnptVCcwh7S53OCgO2Mv2GC93sZUK20aD3eSWqH6NnJoRr6vE1BjzgXlkIez3+11kn4zP5yMgYskzRyx0Rwjm+myJP7SNJs4MIdIVlbZENdvhDSLexVtd3eYwPhPcK4wwDZtOfAs749BPtumKittag77WRPUrN5c8twrNmPNc77UFIbgj0mxH61jCmRUXzSx6sT3rxfC625OqP/Jfh39Q5r1Iw/j1pGynWgx0MTF6haHewIlvupNiRgqsyDo52XBZ9RsseQ2cRIIPkxSfH2X59NDkYr/M691lfgMT9j+/578oxQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/287bd96654e766d4a3f99968fe97efa7/8ac56/image-34.webp 240w,\n/static/287bd96654e766d4a3f99968fe97efa7/d3be9/image-34.webp 480w,\n/static/287bd96654e766d4a3f99968fe97efa7/b0a15/image-34.webp 500w\"\n              sizes=\"(max-width: 500px) 100vw, 500px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/287bd96654e766d4a3f99968fe97efa7/8ff5a/image-34.png 240w,\n/static/287bd96654e766d4a3f99968fe97efa7/e85cb/image-34.png 480w,\n/static/287bd96654e766d4a3f99968fe97efa7/0b533/image-34.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/287bd96654e766d4a3f99968fe97efa7/0b533/image-34.png\"\n            alt=\"2022/02/image-34.png\"\n            title=\"2022/02/image-34.png\"\n            loading=\"lazy\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>The next processing is very simple: if the output exceeds the maximum of 24 lines, it removes the first line, scrolls up, and makes the last line blank.</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>pos<span class=\"token operator\">/</span><span class=\"token number\">80</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">>=</span> <span class=\"token number\">24</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>  <span class=\"token comment\">// Scroll up.</span>\n  <span class=\"token function\">memmove</span><span class=\"token punctuation\">(</span>crt<span class=\"token punctuation\">,</span> crt<span class=\"token operator\">+</span><span class=\"token number\">80</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">sizeof</span><span class=\"token punctuation\">(</span>crt<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token number\">23</span><span class=\"token operator\">*</span><span class=\"token number\">80</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  pos <span class=\"token operator\">-=</span> <span class=\"token number\">80</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">memset</span><span class=\"token punctuation\">(</span>crt<span class=\"token operator\">+</span>pos<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">sizeof</span><span class=\"token punctuation\">(</span>crt<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token operator\">*</span><span class=\"token punctuation\">(</span><span class=\"token number\">24</span><span class=\"token operator\">*</span><span class=\"token number\">80</span> <span class=\"token operator\">-</span> pos<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>Finally, the current cursor position is saved to <code class=\"language-text\">CRTPORT</code> and <code class=\"language-text\">CRTPORT+1</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token function\">outb</span><span class=\"token punctuation\">(</span>CRTPORT<span class=\"token punctuation\">,</span> <span class=\"token number\">14</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">outb</span><span class=\"token punctuation\">(</span>CRTPORT<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> pos<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 function\">outb</span><span class=\"token punctuation\">(</span>CRTPORT<span class=\"token punctuation\">,</span> <span class=\"token number\">15</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">outb</span><span class=\"token punctuation\">(</span>CRTPORT<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> pos<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\ncrt<span class=\"token punctuation\">[</span>pos<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token char\">' '</span> <span class=\"token operator\">|</span> <span class=\"token number\">0x0700</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>With that, writing to the console via the <code class=\"language-text\">consputc</code> function is complete.</p>\n<p>After returning to <code class=\"language-text\">consolewrite</code>, it releases the memory lock and locks the <code class=\"language-text\">inode</code>, then finishes.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token function\">release</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>cons<span class=\"token punctuation\">.</span>lock<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">ilock</span><span class=\"token punctuation\">(</span>ip<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"reading-the-consoleread-function\" style=\"position:relative;\"><a href=\"#reading-the-consoleread-function\" aria-label=\"reading the consoleread 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>Reading the consoleread function</h3>\n<p>Next, I’ll read the <code class=\"language-text\">consoleread</code> function.</p>\n<p>The <code class=\"language-text\">consoleread</code> function takes an <code class=\"language-text\">inode</code>, a pointer to the read destination, and the buffer size to read as arguments.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token keyword\">int</span> <span class=\"token function\">consoleread</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">struct</span> <span class=\"token class-name\">inode</span> <span class=\"token operator\">*</span>ip<span class=\"token punctuation\">,</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>dst<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n  uint target<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">int</span> c<span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">iunlock</span><span class=\"token punctuation\">(</span>ip<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  target <span class=\"token operator\">=</span> n<span class=\"token punctuation\">;</span>\n  <span class=\"token function\">acquire</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>cons<span class=\"token punctuation\">.</span>lock<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">while</span><span class=\"token punctuation\">(</span>n <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">while</span><span class=\"token punctuation\">(</span>input<span class=\"token punctuation\">.</span>r <span class=\"token operator\">==</span> input<span class=\"token punctuation\">.</span>w<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\">myproc</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">-></span>killed<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token function\">release</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>cons<span class=\"token punctuation\">.</span>lock<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">ilock</span><span class=\"token punctuation\">(</span>ip<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">return</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n      <span class=\"token function\">sleep</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>input<span class=\"token punctuation\">.</span>r<span class=\"token punctuation\">,</span> <span class=\"token operator\">&amp;</span>cons<span class=\"token punctuation\">.</span>lock<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    c <span class=\"token operator\">=</span> input<span class=\"token punctuation\">.</span>buf<span class=\"token punctuation\">[</span>input<span class=\"token punctuation\">.</span>r<span class=\"token operator\">++</span> <span class=\"token operator\">%</span> INPUT_BUF<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>c <span class=\"token operator\">==</span> <span class=\"token function\">C</span><span class=\"token punctuation\">(</span><span class=\"token char\">'D'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>  <span class=\"token comment\">// EOF</span>\n      <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>n <span class=\"token operator\">&lt;</span> target<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// Save ^D for next time, to make sure</span>\n        <span class=\"token comment\">// caller gets a 0-byte result.</span>\n        input<span class=\"token punctuation\">.</span>r<span class=\"token operator\">--</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n      <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token operator\">*</span>dst<span class=\"token operator\">++</span> <span class=\"token operator\">=</span> c<span class=\"token punctuation\">;</span>\n    <span class=\"token operator\">--</span>n<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>c <span class=\"token operator\">==</span> <span class=\"token char\">'\\n'</span><span class=\"token punctuation\">)</span>\n      <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token function\">release</span><span class=\"token punctuation\">(</span><span class=\"token operator\">&amp;</span>cons<span class=\"token punctuation\">.</span>lock<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">ilock</span><span class=\"token punctuation\">(</span>ip<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> target <span class=\"token operator\">-</span> n<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>As with <code class=\"language-text\">consolewrite</code>, after releasing the memory lock and the <code class=\"language-text\">inode</code> lock, it performs the following processing inside a loop over the specified buffer size.</p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\">c <span class=\"token operator\">=</span> input<span class=\"token punctuation\">.</span>buf<span class=\"token punctuation\">[</span>input<span class=\"token punctuation\">.</span>r<span class=\"token operator\">++</span> <span class=\"token operator\">%</span> INPUT_BUF<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>c <span class=\"token operator\">==</span> <span class=\"token function\">C</span><span class=\"token punctuation\">(</span><span class=\"token char\">'D'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>  <span class=\"token comment\">// EOF</span>\n  <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>n <span class=\"token operator\">&lt;</span> target<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Save ^D for next time, to make sure</span>\n    <span class=\"token comment\">// caller gets a 0-byte result.</span>\n    input<span class=\"token punctuation\">.</span>r<span class=\"token operator\">--</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token operator\">*</span>dst<span class=\"token operator\">++</span> <span class=\"token operator\">=</span> c<span class=\"token punctuation\">;</span>\n<span class=\"token operator\">--</span>n<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>c <span class=\"token operator\">==</span> <span class=\"token char\">'\\n'</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The <code class=\"language-text\">input</code> structure is the following structure.</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\">INPUT_BUF</span> <span class=\"token expression\"><span class=\"token number\">128</span></span></span>\n<span class=\"token keyword\">struct</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">char</span> buf<span class=\"token punctuation\">[</span>INPUT_BUF<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  uint r<span class=\"token punctuation\">;</span>  <span class=\"token comment\">// Read index</span>\n  uint w<span class=\"token punctuation\">;</span>  <span class=\"token comment\">// Write index</span>\n  uint e<span class=\"token punctuation\">;</span>  <span class=\"token comment\">// Edit index</span>\n<span class=\"token punctuation\">}</span> input<span class=\"token punctuation\">;</span></code></pre></div>\n<p>It seems to read out the values stored in this <code class=\"language-text\">input</code> structure one character at a time.</p>\n<p>In practice, this processing is not called until after the OS has finished booting.</p>\n<p>More specifically, it is used when reading characters entered into the shell.</p>\n<p>The following image shows what I observed in the debugger when I typed the character <code class=\"language-text\">l</code> into the console.</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/43ea7f9468b2523fc26c4779efb0ac06/0b533/image-38.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: 54.166666666666664%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAARlAAAEZQAGA43XUAAACZklEQVQoz4VTSW/TQBidNnYIzerETtokbaqozeY6e7xNHGfpRkq6QVNa2v4DRCUoJy69IBDiwoUrFyQucOAvIH7X44svwIUensbfjPX0lhm2uVSHk6hBD5VhhMvQZ4hptFa8vb9hRCowI/QdLKMvl/HpSsP3F028m6zjdiDjdpgEG+Zb6M0IFwowggX6uejBCJVo/rPO9hpCHvX5VWhsFWZgGW+3Uvj2TMeXpyv4sBnCGzcMZi830UnZsJUGnGUOLtdhxuukRoUeJaXRDRgEXapibIxwNBzjeDTB6fZDXD/ZwfvrKT7eTPHqag8vz7fBeJYsr3ThpmpwF1twlmoYJKsw4mVYCbKYIKsxUkoWjw4OMD079XB2cY7p+QX2H51i7/AxJkeE4xOwcaGHSWmA3TzHeN1BTyF1MRU8VYWba4AvbhBUGIkSfGwOjLH/Y18d4qS5S6R9HKojDEilFVrHMFnCg1wR/UwZo1wFbqaCbDKNTDYDRVEQCATg9/v/gSiKYKNVG+4Kh5vuoJe1wJUmHMqzSxk6URU2Nc4pPyuuIRVXEJNiCAWD8Pl8HoEoiN4qCIK3x7bWXDQzLiylhXbagZXS4WQ5OlHKUW6gQwVxugVtSYN/Trzb8mbe8YhMuQk9zT3iWUk2Ec/U6rEqTFLZoqZFJtxNOMySogQ1vdTyirCTbXTlKnrUqhEtkdUquqTQlFRE/AtkcR73BMpsXkB8QYASEaGE/UiE7kOimfWlCrrUqiPXKCsNFuVlSxuwo3RV6FWYdDabLcqzHS6gFV5DnR5BTyni62URP29U/HrN8eN5H58vNfwGvBdC44No/BYAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/43ea7f9468b2523fc26c4779efb0ac06/8ac56/image-38.webp 240w,\n/static/43ea7f9468b2523fc26c4779efb0ac06/d3be9/image-38.webp 480w,\n/static/43ea7f9468b2523fc26c4779efb0ac06/b0a15/image-38.webp 500w\"\n              sizes=\"(max-width: 500px) 100vw, 500px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/43ea7f9468b2523fc26c4779efb0ac06/8ff5a/image-38.png 240w,\n/static/43ea7f9468b2523fc26c4779efb0ac06/e85cb/image-38.png 480w,\n/static/43ea7f9468b2523fc26c4779efb0ac06/0b533/image-38.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/43ea7f9468b2523fc26c4779efb0ac06/0b533/image-38.png\"\n            alt=\"2022/02/image-38.png\"\n            title=\"2022/02/image-38.png\"\n            loading=\"lazy\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p>As for how user input is stored in <code class=\"language-text\">input.buf</code>, I’d like to trace that in more detail once the shell is actually usable.</p>\n<p>Finally, <code class=\"language-text\">ioapicenable(IRQ_KBD, 0);</code> enables interrupts, and the <code class=\"language-text\">consoleinit</code> function ends.</p>\n<h2 id=\"summary\" style=\"position:relative;\"><a href=\"#summary\" aria-label=\"summary permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Summary</h2>\n<p>This time, I initialized the console.</p>\n<p>It was very interesting to learn how the input/output interface works.</p>\n<p>Next time, I’d like to start from the <code class=\"language-text\">uartinit</code> function that initializes the serial port.</p>\n<h2 id=\"reference-books\" style=\"position:relative;\"><a href=\"#reference-books\" aria-label=\"reference books permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Reference books</h2>\n<ul>\n<li><a href=\"https://amzn.to/3qZSCY7\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">OS Development in 30 Days!</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\">Your First OS Code Reading: Learning Kernel Internals with UNIX V6</a></li>\n<li><a href=\"https://amzn.to/3I6fkVt\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Understanding the Linux Kernel</a></li>\n<li><a href=\"https://amzn.to/3JRUdI2\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Build to Understand an OS: Theory and Implementation for Running x86 Computers</a></li>\n</ul>","fields":{"slug":"/unix-xv6-010-kernel-main-07-en","tagSlugs":["/tag/unix-en/","/tag/xv-6-en/","/tag/kernel-en/","/tag/os-en/","/tag/english/"]},"frontmatter":{"date":"2022-02-11","description":"I'm reading the source code of the educational OS xv6OS to learn how its kernel works. In this article, I trace through the behavior of the xv6OS kernel's main function.","tags":["Unix (en)","xv6 (en)","Kernel (en)","OS (en)","English"],"title":"Reading xv6OS Seriously to Fully Understand the Kernel - Screen Rendering","socialImage":{"publicURL":"/static/2bbbff90b6d0181ef10d1cabaa04b22e/unix-xv6-010-kernel-main-07.png"}}}},"pageContext":{"slug":"/unix-xv6-010-kernel-main-07-en"}},"staticQueryHashes":["251939775","401334301","825871152"]}