<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>菜鸟成牛传</title>
  
  <subtitle>lx的技术博客</subtitle>
  <link href="http://example.com/atom.xml" rel="self"/>
  
  <link href="http://example.com/"/>
  <updated>2024-07-08T17:46:15.000Z</updated>
  <id>http://example.com/</id>
  
  <author>
    <name>lx</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>机器启动过程</title>
    <link href="http://example.com/2024/07/08/%E6%9C%BA%E5%99%A8%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B/"/>
    <id>http://example.com/2024/07/08/%E6%9C%BA%E5%99%A8%E5%90%AF%E5%8A%A8%E8%BF%87%E7%A8%8B/</id>
    <published>2024-07-08T17:46:15.000Z</published>
    <updated>2024-07-08T17:46:15.000Z</updated>
    
    <content type="html"><![CDATA[<p>机器的启动过程是嵌入式软件开发的基础知识之一，之前课上学过一些，但是有些混乱，一些x86的启动过程和arm的启动过程知识混在一起，现在重新梳理一下。有助于之后理解和开发qemu设备。</p><span id="more"></span><h1 id="x86架构启动过程"><a href="#x86架构启动过程" class="headerlink" title="x86架构启动过程"></a>x86架构启动过程</h1><p>x86架构机器的启动过程可以分为以下几个主要阶段：</p><ol><li><strong>上电和CPU初始化</strong>：<br>  当计算机加电时，CPU会进行自检并初始化寄存器。此时，CS寄存器被设置为0xF000，EIP寄存器被设置为0xFFF0，指向BIOS的入口地址0xFFFF0。<br>  在x86架构中，通常使用的是BIOS（Basic Input&#x2F;Output System）。BIOS是固化在主板上的一组程序，负责基本的硬件初始化和从非易失性存储中加载引导程序。在现代系统中，BIOS的功能逐渐被UEFI（Unified Extensible Firmware Interface）所取代。</li><li><strong>BIOS执行</strong>：<br>CPU从BIOS ROM中读取并执行第一条指令，通常是一个长跳转指令，跳转到BIOS的实际入口地址。<br>BIOS会进行一系列硬件初始化和自检（POST），包括检查RAM、键盘、显示器、硬盘等设备。</li><li><strong>引导设备选择</strong>：<br>BIOS根据用户设置的启动顺序（通常存储在CMOS中）选择引导设备，如硬盘、光盘或USB设备。</li><li><strong>加载主引导记录（MBR）</strong>：<br> BIOS从选定的引导设备的第一个扇区（MBR）读取512字节的数据到内存地址0x7C00。<br>MBR包含引导加载程序的初始代码和分区表信息。</li><li><strong>执行引导加载程序</strong>：<br>MBR中的引导加载程序代码开始执行，通常会加载并执行操作系统的引导加载程序（如GRUB或LILO）。<br>引导加载程序负责加载操作系统内核到内存中，并将控制权交给操作系统。</li><li><strong>操作系统启动</strong>：<br>操作系统内核开始执行，初始化硬件和软件资源，最终启动用户空间的应用程序。</li></ol><h1 id="arm架构启动过程"><a href="#arm架构启动过程" class="headerlink" title="arm架构启动过程"></a>arm架构启动过程</h1><p>ARM架构机器的启动过程可以分为以下几个主要阶段：</p><ol><li><p><strong>上电和初始引导</strong>：</p><ul><li>当ARM设备上电时，CPU会从一个固定的地址（通常是0x00000000或0xFFFF0000）开始执行代码。这段代码通常存储在片内ROM（iROM）中，由芯片制造商预先烧录。</li><li>iROM代码会进行基本的硬件初始化，并决定从哪个存储设备（如eMMC、SD卡、NAND Flash等）加载引导加载程序（Bootloader）。</li></ul></li><li><p><strong>引导加载程序（Bootloader）</strong>：</p><ul><li>引导加载程序通常分为多个阶段，如BL1、BL2和BL3。每个阶段负责不同的初始化任务。</li><li><strong>BL1</strong>：初始化系统时钟、UART、SDRAM等基本硬件，并加载BL2到内存中执行。</li><li><strong>BL2</strong>：进一步初始化硬件，并加载完整的引导加载程序（如U-Boot）到内存中执行。</li><li><strong>U-Boot</strong>：U-Boot是一个常用的引导加载程序，负责加载操作系统内核到内存中，并将控制权交给内核。</li></ul></li><li><p><strong>内核启动</strong>：</p><ul><li>内核开始执行，进行硬件探测和初始化。此时，内核会加载设备树（Device Tree）文件，以获取系统硬件配置的信息。</li><li>内核初始化完成后，会挂载初始的根文件系统（通常是initrd或initramfs），并执行初始化脚本。</li></ul></li><li><p><strong>挂载根文件系统</strong>：</p><ul><li>内核会卸载initrd，并挂载实际的根文件系统（如从eMMC或NAND Flash中）。</li><li>内核将控制权交给用户空间的第一个进程（通常是<code>/sbin/init</code>），继续系统启动过程。</li></ul></li><li><p><strong>用户空间初始化</strong>：</p><ul><li><code>init</code>进程开始执行，启动各种系统服务和守护进程，最终进入用户登录界面或启动应用程序。</li></ul></li></ol>]]></content>
    
    
    <summary type="html">&lt;p&gt;机器的启动过程是嵌入式软件开发的基础知识之一，之前课上学过一些，但是有些混乱，一些x86的启动过程和arm的启动过程知识混在一起，现在重新梳理一下。有助于之后理解和开发qemu设备。&lt;/p&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>QEMU PCI 设备学习笔记</title>
    <link href="http://example.com/2024/06/26/QEMU-PCI-%E8%AE%BE%E5%A4%87%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    <id>http://example.com/2024/06/26/QEMU-PCI-%E8%AE%BE%E5%A4%87%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
    <published>2024-06-26T11:31:05.000Z</published>
    <updated>2024-06-26T11:31:05.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="xio3130-upstream-设备初始化过程"><a href="#xio3130-upstream-设备初始化过程" class="headerlink" title="xio3130_upstream 设备初始化过程"></a>xio3130_upstream 设备初始化过程</h1><p>函数调用链： </p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">type_init(xio3130_upstream_register_types) -&gt; type_register_static(&amp;xio3130_upstream_info); -&gt; xio3130_upstream_class_init(ObjectClass *klass, <span class="type">void</span> *data)</span><br></pre></td></tr></table></figure><span id="more"></span><p>pci 设备主要有两个成员变量–DeviceClass、PCIDeviceClass</p><p>初始化这个两个成员变量的过程如下：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">static</span> <span class="type">void</span> <span class="title function_">xio3130_upstream_class_init</span><span class="params">(ObjectClass *klass, <span class="type">void</span> *data)</span></span><br><span class="line">&#123;</span><br><span class="line">    DeviceClass *dc = DEVICE_CLASS(klass);</span><br><span class="line">    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);</span><br><span class="line"></span><br><span class="line">    k-&gt;is_bridge = <span class="literal">true</span>;</span><br><span class="line">    k-&gt;config_write = xio3130_upstream_write_config;</span><br><span class="line">    k-&gt;realize = xio3130_upstream_realize;</span><br><span class="line">    k-&gt;<span class="built_in">exit</span> = xio3130_upstream_exitfn;</span><br><span class="line">    k-&gt;vendor_id = PCI_VENDOR_ID_TI;</span><br><span class="line">    k-&gt;device_id = PCI_DEVICE_ID_TI_XIO3130U;</span><br><span class="line">    k-&gt;revision = XIO3130_REVISION;</span><br><span class="line">    set_bit(DEVICE_CATEGORY_BRIDGE, dc-&gt;categories);</span><br><span class="line">    dc-&gt;desc = <span class="string">&quot;TI X3130 Upstream Port of PCI Express Switch&quot;</span>;</span><br><span class="line">    dc-&gt;reset = xio3130_upstream_reset;</span><br><span class="line">    dc-&gt;vmsd = &amp;vmstate_xio3130_upstream;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>xio3130_upstream 有一个父类————PCIEPort，从</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">static</span> <span class="type">const</span> TypeInfo xio3130_upstream_info = &#123;</span><br><span class="line">    .name          = <span class="string">&quot;x3130-upstream&quot;</span>,</span><br><span class="line">    .parent        = TYPE_PCIE_PORT,</span><br></pre></td></tr></table></figure><p>就可以看出来。同理可以看出来 PCIEPort的父类是PCIBridge，PCIBridge的父类是抽象类PCIDevice。</p><h1 id="PCI-设备寄存器初始化过程"><a href="#PCI-设备寄存器初始化过程" class="headerlink" title="PCI 设备寄存器初始化过程"></a>PCI 设备寄存器初始化过程</h1><p>pci 设备类的定义</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//pci 物理设备的空间</span></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">PCIDevice</span> &#123;</span><br><span class="line">    DeviceState qdev;</span><br><span class="line">    <span class="type">bool</span> partially_hotplugged;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* PCI config space */</span></span><br><span class="line">    <span class="type">uint8_t</span> *config;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* Used to enable config checks on load. Note that writable bits are</span></span><br><span class="line"><span class="comment">     * never checked even if set in cmask. */</span></span><br><span class="line">    <span class="type">uint8_t</span> *cmask;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* Used to implement R/W bytes */</span></span><br><span class="line">    <span class="type">uint8_t</span> *wmask;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* Used to implement RW1C(Write 1 to Clear) bytes */</span></span><br><span class="line">    <span class="type">uint8_t</span> *w1cmask;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* Used to allocate config space for capabilities. */</span></span><br><span class="line">    <span class="type">uint8_t</span> *used;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* the following fields are read only */</span></span><br><span class="line">    <span class="type">int32_t</span> devfn;</span><br><span class="line">    <span class="comment">/* Cached device to fetch requester ID from, to avoid the PCI</span></span><br><span class="line"><span class="comment">     * tree walking every time we invoke PCI request (e.g.,</span></span><br><span class="line"><span class="comment">     * MSI). For conventional PCI root complex, this field is</span></span><br><span class="line"><span class="comment">     * meaningless. */</span></span><br><span class="line">    PCIReqIDCache requester_id_cache;</span><br><span class="line">    <span class="type">char</span> name[<span class="number">64</span>];</span><br><span class="line">    PCIIORegion io_regions[PCI_NUM_REGIONS];</span><br><span class="line">    AddressSpace bus_master_as;</span><br><span class="line">    MemoryRegion bus_master_container_region;</span><br><span class="line">    MemoryRegion bus_master_enable_region;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* do not access the following fields */</span></span><br><span class="line">    PCIConfigReadFunc *config_read;</span><br><span class="line">    PCIConfigWriteFunc *config_write;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* Legacy PCI VGA regions */</span></span><br><span class="line">    MemoryRegion *vga_regions[QEMU_PCI_VGA_NUM_REGIONS];</span><br><span class="line">    <span class="type">bool</span> has_vga;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* Current IRQ levels.  Used internally by the generic PCI code.  */</span></span><br><span class="line">    <span class="type">uint8_t</span> irq_state;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* Capability bits */</span></span><br><span class="line">    <span class="type">uint32_t</span> cap_present;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* Offset of MSI-X capability in config space */</span></span><br><span class="line">    <span class="type">uint8_t</span> msix_cap;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* MSI-X entries */</span></span><br><span class="line">    <span class="type">int</span> msix_entries_nr;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* Space to store MSIX table &amp; pending bit array */</span></span><br><span class="line">    <span class="type">uint8_t</span> *msix_table;</span><br><span class="line">    <span class="type">uint8_t</span> *msix_pba;</span><br><span class="line">    <span class="comment">/* MemoryRegion container for msix exclusive BAR setup */</span></span><br><span class="line">    MemoryRegion msix_exclusive_bar;</span><br><span class="line">    <span class="comment">/* Memory Regions for MSIX table and pending bit entries. */</span></span><br><span class="line">    MemoryRegion msix_table_mmio;</span><br><span class="line">    MemoryRegion msix_pba_mmio;</span><br><span class="line">    <span class="comment">/* Reference-count for entries actually in use by driver. */</span></span><br><span class="line">    <span class="type">unsigned</span> *msix_entry_used;</span><br><span class="line">    <span class="comment">/* MSIX function mask set or MSIX disabled */</span></span><br><span class="line">    <span class="type">bool</span> msix_function_masked;</span><br><span class="line">    <span class="comment">/* Version id needed for VMState */</span></span><br><span class="line">    <span class="type">int32_t</span> version_id;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* Offset of MSI capability in config space */</span></span><br><span class="line">    <span class="type">uint8_t</span> msi_cap;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* PCI Express */</span></span><br><span class="line">    PCIExpressDevice exp;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* SHPC */</span></span><br><span class="line">    SHPCDevice *shpc;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* Location of option rom */</span></span><br><span class="line">    <span class="type">char</span> *romfile;</span><br><span class="line">    <span class="type">bool</span> has_rom;</span><br><span class="line">    MemoryRegion rom;</span><br><span class="line">    <span class="type">uint32_t</span> rom_bar;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* INTx routing notifier */</span></span><br><span class="line">    PCIINTxRoutingNotifier intx_routing_notifier;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* MSI-X notifiers */</span></span><br><span class="line">    MSIVectorUseNotifier msix_vector_use_notifier;</span><br><span class="line">    MSIVectorReleaseNotifier msix_vector_release_notifier;</span><br><span class="line">    MSIVectorPollNotifier msix_vector_poll_notifier;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* ID of standby device in net_failover pair */</span></span><br><span class="line">    <span class="type">char</span> *failover_pair_id;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// pci 设备这个类的结构体</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">struct</span> <span class="title class_">PCIDeviceClass</span> &#123;</span><br><span class="line">    DeviceClass parent_class;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">void</span> (*realize)(PCIDevice *dev, Error **errp);</span><br><span class="line">    PCIUnregisterFunc *exit;</span><br><span class="line">    PCIConfigReadFunc *config_read;</span><br><span class="line">    PCIConfigWriteFunc *config_write;</span><br><span class="line"></span><br><span class="line">    <span class="type">uint16_t</span> vendor_id;</span><br><span class="line">    <span class="type">uint16_t</span> device_id;</span><br><span class="line">    <span class="type">uint8_t</span> revision;</span><br><span class="line">    <span class="type">uint16_t</span> class_id;</span><br><span class="line">    <span class="type">uint16_t</span> subsystem_vendor_id;       <span class="comment">/* only for header type = 0 */</span></span><br><span class="line">    <span class="type">uint16_t</span> subsystem_id;              <span class="comment">/* only for header type = 0 */</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">/*</span></span><br><span class="line"><span class="comment">     * pci-to-pci bridge or normal device.</span></span><br><span class="line"><span class="comment">     * This doesn&#x27;t mean pci host switch.</span></span><br><span class="line"><span class="comment">     * When card bus bridge is supported, this would be enhanced.</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="type">bool</span> is_bridge;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/* rom bar */</span></span><br><span class="line">    <span class="type">const</span> <span class="type">char</span> *romfile;</span><br><span class="line">&#125; PCIDeviceClass;</span><br><span class="line"></span><br><span class="line"><span class="type">static</span> <span class="type">const</span> TypeInfo pci_device_type_info = &#123;</span><br><span class="line">    .name = TYPE_PCI_DEVICE,</span><br><span class="line">    .parent = TYPE_DEVICE,</span><br><span class="line">    .instance_size = <span class="built_in">sizeof</span>(PCIDevice),</span><br><span class="line">    .abstract = <span class="literal">true</span>,</span><br><span class="line">    .class_size = <span class="built_in">sizeof</span>(PCIDeviceClass),</span><br><span class="line">    .class_init = pci_device_class_init,</span><br><span class="line">    .class_base_init = pci_device_class_base_init,</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>instance_size 和 class_size 的区别在于它们分别定义了对象和类的内存大小。对象通常存储设备的状态和属性，而类则包含了类特有的方法和类变量。</p><p>pci_device_class_init 函数中注册了实例化函数，当需要实例化pci设备时就会分配一个instance_size大小的空间。</p><h1 id="pci-bridge-写配置"><a href="#pci-bridge-写配置" class="headerlink" title="pci bridge 写配置"></a>pci bridge 写配置</h1><p>pci_bridge_write_config 调用了 pci.c 里面的 pci_default_write_config实现设备网桥设备的读写。pci_default_write_config函数内容如下：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">pci_default_write_config</span><span class="params">(PCIDevice *d, <span class="type">uint32_t</span> addr, <span class="type">uint32_t</span> val_in, <span class="type">int</span> l)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="type">int</span> i, was_irq_disabled = <span class="built_in">pci_irq_disabled</span>(d);</span><br><span class="line">    <span class="type">uint32_t</span> val = val_in;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; l; val &gt;&gt;= <span class="number">8</span>, ++i) &#123;</span><br><span class="line">        <span class="type">uint8_t</span> wmask = d-&gt;wmask[addr + i];</span><br><span class="line">        <span class="type">uint8_t</span> w1cmask = d-&gt;w1cmask[addr + i];</span><br><span class="line">        <span class="built_in">assert</span>(!(wmask &amp; w1cmask));</span><br><span class="line">        d-&gt;config[addr + i] = (d-&gt;config[addr + i] &amp; ~wmask) | (val &amp; wmask);</span><br><span class="line">        d-&gt;config[addr + i] &amp;= ~(val &amp; w1cmask); <span class="comment">/* W1C: Write 1 to Clear */</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (<span class="built_in">ranges_overlap</span>(addr, l, PCI_BASE_ADDRESS_0, <span class="number">24</span>) ||</span><br><span class="line">        <span class="built_in">ranges_overlap</span>(addr, l, PCI_ROM_ADDRESS, <span class="number">4</span>) ||</span><br><span class="line">        <span class="built_in">ranges_overlap</span>(addr, l, PCI_ROM_ADDRESS1, <span class="number">4</span>) ||</span><br><span class="line">        <span class="built_in">range_covers_byte</span>(addr, l, PCI_COMMAND))</span><br><span class="line">        <span class="built_in">pci_update_mappings</span>(d);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (<span class="built_in">range_covers_byte</span>(addr, l, PCI_COMMAND)) &#123;</span><br><span class="line">        <span class="built_in">pci_update_irq_disabled</span>(d, was_irq_disabled);</span><br><span class="line">        <span class="built_in">memory_region_set_enabled</span>(&amp;d-&gt;bus_master_enable_region,</span><br><span class="line">                                  <span class="built_in">pci_get_word</span>(d-&gt;config + PCI_COMMAND)</span><br><span class="line">                                    &amp; PCI_COMMAND_MASTER);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">msi_write_config</span>(d, addr, val_in, l);</span><br><span class="line">    <span class="built_in">msix_write_config</span>(d, addr, val_in, l);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>d-&gt;config是pci设备配置空间，为了方便，这里贴出地址空间的图片可以对应上。</p><p><img src="/2024/06/26/QEMU-PCI-%E8%AE%BE%E5%A4%87%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/pci%20config%20space.png"></p>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;xio3130-upstream-设备初始化过程&quot;&gt;&lt;a href=&quot;#xio3130-upstream-设备初始化过程&quot; class=&quot;headerlink&quot; title=&quot;xio3130_upstream 设备初始化过程&quot;&gt;&lt;/a&gt;xio3130_upstream 设备初始化过程&lt;/h1&gt;&lt;p&gt;函数调用链： &lt;/p&gt;
&lt;figure class=&quot;highlight c&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;type_init(xio3130_upstream_register_types) -&amp;gt; type_register_static(&amp;amp;xio3130_upstream_info); -&amp;gt; xio3130_upstream_class_init(ObjectClass *klass, &lt;span class=&quot;type&quot;&gt;void&lt;/span&gt; *data)&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;</summary>
    
    
    
    
    <category term="QEMU" scheme="http://example.com/tags/QEMU/"/>
    
  </entry>
  
  <entry>
    <title>hexo + markdown 简明使用指令集</title>
    <link href="http://example.com/2024/06/23/hexo-markdown-%E7%AE%80%E6%98%8E%E4%BD%BF%E7%94%A8%E6%8C%87%E4%BB%A4%E9%9B%86/"/>
    <id>http://example.com/2024/06/23/hexo-markdown-%E7%AE%80%E6%98%8E%E4%BD%BF%E7%94%A8%E6%8C%87%E4%BB%A4%E9%9B%86/</id>
    <published>2024-06-23T23:59:04.000Z</published>
    <updated>2024-06-25T06:03:15.232Z</updated>
    
    <content type="html"><![CDATA[<h2 id="创建新的文章"><a href="#创建新的文章" class="headerlink" title="创建新的文章"></a>创建新的文章</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">在hexo的文件夹下执行</span></span><br><span class="line">hexo new post &quot;文章名称&quot;</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">执行之后会在./source/_posts下面生成一个 文章名称.md 的文件，这个就是markdown文章</span></span><br></pre></td></tr></table></figure><span id="more"></span><h2 id="删除旧的静态网页"><a href="#删除旧的静态网页" class="headerlink" title="删除旧的静态网页"></a>删除旧的静态网页</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">想要构建新的网页就要把旧的删掉</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">在hexo的文件夹下执行</span></span><br><span class="line">hexo clean</span><br></pre></td></tr></table></figure><p><img src="/2024/06/23/hexo-markdown-%E7%AE%80%E6%98%8E%E4%BD%BF%E7%94%A8%E6%8C%87%E4%BB%A4%E9%9B%86/Snipaste_2024-06-24_22-44-05.png"></p><h2 id="构建新的静态网页"><a href="#构建新的静态网页" class="headerlink" title="构建新的静态网页"></a>构建新的静态网页</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">在hexo的文件夹下执行</span></span><br><span class="line">hexo g</span><br></pre></td></tr></table></figure><p><img src="/2024/06/23/hexo-markdown-%E7%AE%80%E6%98%8E%E4%BD%BF%E7%94%A8%E6%8C%87%E4%BB%A4%E9%9B%86/Snipaste_2024-06-24_22-46-25.png"></p><p>可以看到生成了很多网页的资源，生成的静态网页放在.&#x2F;public文件夹下</p><p><img src="/2024/06/23/hexo-markdown-%E7%AE%80%E6%98%8E%E4%BD%BF%E7%94%A8%E6%8C%87%E4%BB%A4%E9%9B%86/Snipaste_2024-06-24_22-48-14.png"></p><h2 id="上传新的静态网页"><a href="#上传新的静态网页" class="headerlink" title="上传新的静态网页"></a>上传新的静态网页</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">在hexo的文件夹下执行</span></span><br><span class="line">hexo d</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;创建新的文章&quot;&gt;&lt;a href=&quot;#创建新的文章&quot; class=&quot;headerlink&quot; title=&quot;创建新的文章&quot;&gt;&lt;/a&gt;创建新的文章&lt;/h2&gt;&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;在hexo的文件夹下执行&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;hexo new post &amp;quot;文章名称&amp;quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta prompt_&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;language-bash&quot;&gt;执行之后会在./source/_posts下面生成一个 文章名称.md 的文件，这个就是markdown文章&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;</summary>
    
    
    
    
    <category term="hexo" scheme="http://example.com/tags/hexo/"/>
    
  </entry>
  
  <entry>
    <title>VMware 虚拟机只有一个环回网口解决办法</title>
    <link href="http://example.com/2024/06/23/note/"/>
    <id>http://example.com/2024/06/23/note/</id>
    <published>2024-06-23T23:11:04.000Z</published>
    <updated>2024-06-28T01:06:58.255Z</updated>
    
    <content type="html"><![CDATA[<h1 id="VMware-虚拟机只有一个环回网口解决办法"><a href="#VMware-虚拟机只有一个环回网口解决办法" class="headerlink" title="VMware 虚拟机只有一个环回网口解决办法"></a>VMware 虚拟机只有一个环回网口解决办法</h1><p>这两天每次启动VM和vscode的时候总会发现vscode连接不上vm，排查之后（ifconfig）发现vm里面只有一个环回网口（127.0.0.1）。</p><p><img src="/2024/06/23/note/no_ens33.png"></p><p>后来了解到是没有启动ens33网口。这个网口是以太网的网口，为啥没有启动呢？不理解，先解决再说。</p><p>先启动ens33</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo ifconfig ens33 up</span><br></pre></td></tr></table></figure><span id="more"></span><p><img src="/2024/06/23/note/ens33_up.png"></p><p>调用DHCP获取IP地址</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo dhclient</span><br></pre></td></tr></table></figure><p><img src="/2024/06/23/note/dhclient.png"></p><p>这样就成了。</p><p>之后尝试解决开机不能自动获取ip的问题 以及 设置为静态ip。</p>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;VMware-虚拟机只有一个环回网口解决办法&quot;&gt;&lt;a href=&quot;#VMware-虚拟机只有一个环回网口解决办法&quot; class=&quot;headerlink&quot; title=&quot;VMware 虚拟机只有一个环回网口解决办法&quot;&gt;&lt;/a&gt;VMware 虚拟机只有一个环回网口解决办法&lt;/h1&gt;&lt;p&gt;这两天每次启动VM和vscode的时候总会发现vscode连接不上vm，排查之后（ifconfig）发现vm里面只有一个环回网口（127.0.0.1）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/2024/06/23/note/no_ens33.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;后来了解到是没有启动ens33网口。这个网口是以太网的网口，为啥没有启动呢？不理解，先解决再说。&lt;/p&gt;
&lt;p&gt;先启动ens33&lt;/p&gt;
&lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;sudo ifconfig ens33 up&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;</summary>
    
    
    
    
    <category term="Internet" scheme="http://example.com/tags/Internet/"/>
    
  </entry>
  
</feed>
