<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>C on T.本秋的自留地</title>
    <link>https://blog.texsd.eu.org/tags/c/</link>
    <description>Recent content in C on T.本秋的自留地</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <copyright>Copyright© 2026 T.本秋. Licensed under CC BY-NC-SA 4.0.</copyright>
    <lastBuildDate>Wed, 02 Jul 2025 11:28:27 +0800</lastBuildDate><atom:link href="https://blog.texsd.eu.org/tags/c/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>操作系统笔记：设备与驱动程序</title>
      <link>https://blog.texsd.eu.org/posts/os-1-devices-drivers/io/</link>
      <pubDate>Wed, 02 Jul 2025 11:28:27 +0800</pubDate>
      
      <guid>https://blog.texsd.eu.org/posts/os-1-devices-drivers/io/</guid>
      <description>
&lt;h2 class=&#34;relative group&#34;&gt;插上u盘，是如何工作的？
    &lt;div id=&#34;插上u盘是如何工作的&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e6%8f%92%e4%b8%8au%e7%9b%98%e6%98%af%e5%a6%82%e4%bd%95%e5%b7%a5%e4%bd%9c%e7%9a%84&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;usb控制器检测到电平变化 -&amp;gt; 硬件中断 -&amp;gt; 总线驱动捕获中断 -&amp;gt; sysfs创建设备目录和属性文件 -&amp;gt; 内核通过&lt;code&gt;netlink&lt;/code&gt;发出uevent消息，广播&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;为什么udev的效率高？
    &lt;div id=&#34;为什么udev的效率高&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e4%b8%ba%e4%bb%80%e4%b9%88udev%e7%9a%84%e6%95%88%e7%8e%87%e9%ab%98&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;udev被内核发送的uevent唤醒，而不是一直去轮询内核。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;udev是并行工作的。在多个设备插入的时候，为每个事件启动一个处理实例。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;udev使用的Netlink为传递短小的控制信息优化，比其他IPC更加轻量和迅速。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;udev启动的时候会读取所有&lt;code&gt;.rules&lt;/code&gt;文件，并解析成快速查询的内存数据结构。（这个就像mihomo一样，提前把规则处理成一个搜索树，使得匹配效率大幅提高）&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 class=&#34;relative group&#34;&gt;I/O设备控制
    &lt;div id=&#34;io设备控制&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#io%e8%ae%be%e5%a4%87%e6%8e%a7%e5%88%b6&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;X86同时支持MMIO/PMIO，ARM只支持MMIO。&lt;/p&gt;
&lt;p&gt;通过一条线，一条指令就可以实现控制。&lt;/p&gt;
&lt;p&gt;控制方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MMIO&lt;/strong&gt;: 把外部控制寄存器映射到内存地址空间。使得一块特定的内存地址不再对应物理RAM。像这块内存地址写入，就是发送到硬件的控制寄存器，而从这里读取，就是获取寄存器当前的状态。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;PMIO&lt;/strong&gt;: （微机里面的IN/OUT指令）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;使用内存的地址空间，不会造成存的浪费吗？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;早期的32位系统，你安装了4G内存，会发现只有3.几可用，剩下为硬件保留的内存就是这个原因。一般都是被强制保留给PCIe的MMIO。&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;GPIO
    &lt;div id=&#34;gpio&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#gpio&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;一个通用的IO，有别于专用IO（USB/HDMI）。可以编程，可以作为输入或者输出。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;输入模式：读取外部世界。通过这个引脚送过来的电平是高或者低来感知外部世界。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;输出模式：设置这个引脚为高电平或者低电平，从而控制外部设备。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
      
    </item>
    
  </channel>
</rss>
