<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="https://b1n.io/feed_style.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <tabi:metadata xmlns:tabi="https://github.com/welpo/tabi">
        <tabi:base_url>https:&#x2F;&#x2F;b1n.io</tabi:base_url>
        <tabi:separator>
            •
        </tabi:separator>
        <tabi:about_feeds>This is a web feed, also known as an Atom feed. Subscribe by copying the URL from the address bar into your newsreader. Visit About Feeds to learn more and get started. It&#x27;s free.</tabi:about_feeds>
        <tabi:visit_the_site>Visit website</tabi:visit_the_site>
        <tabi:recent_posts>Recent posts</tabi:recent_posts>
        <tabi:last_updated_on>Updated on $DATE</tabi:last_updated_on>
        <tabi:default_theme>dark</tabi:default_theme>
        <tabi:post_listing_date>date</tabi:post_listing_date>
        <tabi:current_section>~&#x2F;b1n</tabi:current_section>
    </tabi:metadata><link rel="extra-stylesheet" href="https://b1n.io/skins/mint.css?h=504215cf6bc10586b487" /><title>~/b1n</title>
        <subtitle>Linux kernel vulnerability researcher</subtitle>
    <link href="https://b1n.io/atom.xml" rel="self" type="application/atom+xml"/>
    <link href="https://b1n.io" rel="alternate" type="text/html"/>
    <generator uri="https://www.getzola.org/">Zola</generator><updated>2025-06-03T00:00:00+00:00</updated><id>https://b1n.io/atom.xml</id><entry xml:lang="en">
        <title>Linux Kernel Development and Debugging on macOS</title>
        <published>2025-06-02T00:00:00+00:00</published>
        <updated>2025-06-03T00:00:00+00:00</updated>
        <author>
            <name>b1n</name>
        </author>
        <link rel="alternate" href="https://b1n.io/blog/linux-kernel-development-and-debugging-on-macos/" type="text/html"/>
        <id>https://b1n.io/blog/linux-kernel-development-and-debugging-on-macos/</id>
        
            <content type="html">&lt;p&gt;我使用搭载&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Apple_silicon&quot;&gt;Apple silicon&lt;&#x2F;a&gt;的MacBook Pro, 通过Linux虚拟机跨平台编译x86_64内核, 开发和调试都在macOS中原生进行. Linux Kernel VRED (Vulnerability Research and Exploit Development)通常不修改内核代码, 不需要频繁编译.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;create-disk-image&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#create-disk-image&quot; aria-label=&quot;Anchor link for: create-disk-image&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Create Disk Image&lt;&#x2F;h2&gt;
&lt;p&gt;Linux内核开发需要大小写敏感的文件系统. macOS文件系统默认大小写不敏感, 查看&lt;a href=&quot;https:&#x2F;&#x2F;support.apple.com&#x2F;guide&#x2F;disk-utility&#x2F;create-a-disk-image-dskutl11888&#x2F;22.6&#x2F;mac&#x2F;15.0&quot;&gt;Create a blank disk image for storage&lt;&#x2F;a&gt;, 创建一个大小写敏感的空白磁盘映像.&lt;&#x2F;p&gt;
&lt;p&gt;挂载创建的磁盘映像, 克隆Linux Kernel仓库. 默认挂载到&lt;code&gt;&#x2F;Volumes&lt;&#x2F;code&gt;下.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;create-linux-vm&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#create-linux-vm&quot; aria-label=&quot;Anchor link for: create-linux-vm&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Create Linux VM&lt;&#x2F;h2&gt;
&lt;p&gt;我使用&lt;a href=&quot;https:&#x2F;&#x2F;www.parallels.com&quot;&gt;Parallels Desktop&lt;&#x2F;a&gt;虚拟机管理程序创建&lt;a href=&quot;https:&#x2F;&#x2F;www.debian.org&quot;&gt;Debian&lt;&#x2F;a&gt;虚拟机, 也可以使用&lt;a href=&quot;https:&#x2F;&#x2F;mac.getutm.app&quot;&gt;UTM&lt;&#x2F;a&gt;, 开源免费.&lt;&#x2F;p&gt;
&lt;p&gt;安装Debian软件包:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; apt update&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; apt install build-essential crossbuild-essential-amd64 bc bison flex libncurses-dev libelf-dev libssl-dev&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; apt install debootstrap qemu-user-static &lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; syzkaller create-image.sh required&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;共享大小写敏感的磁盘到虚拟机. 虚拟机需要安装Parallels Tools, 否则不会自动挂载共享的磁盘. 默认自动挂载到&lt;code&gt;&#x2F;media&#x2F;psf&lt;&#x2F;code&gt;下.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;compile&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#compile&quot; aria-label=&quot;Anchor link for: compile&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Compile&lt;&#x2F;h2&gt;
&lt;p&gt;设置一些跨平台编译所需的环境变量:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-shell&quot;&gt;export&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;ARCH&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-shell&quot;&gt;x86_64&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-shell&quot;&gt;export&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;CROSS_COMPILE&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-shell&quot;&gt;x86_64-linux-gnu-&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-shell&quot;&gt;export&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;CC&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-shell&quot;&gt;x86_64-linux-gnu-gcc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;生成默认的内核配置文件: &lt;code&gt;make defconfig&lt;&#x2F;code&gt;, 编辑&lt;code&gt;.config&lt;&#x2F;code&gt;文件启用下面的内核配置选项:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;# Debug info for symbolization.
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;CONFIG_DEBUG_INFO_DWARF4=y
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;# Required for Debian Stretch and later
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;CONFIG_CONFIGFS_FS=y
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;CONFIG_SECURITYFS=y
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;更新内核配置文件: &lt;code&gt;make olddefconfig&lt;&#x2F;code&gt;, 编译内核: &lt;code&gt;make -j`nproc`&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;code-navigation&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#code-navigation&quot; aria-label=&quot;Anchor link for: code-navigation&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Code Navigation&lt;&#x2F;h2&gt;
&lt;p&gt;我使用&lt;a href=&quot;https:&#x2F;&#x2F;ctags.io&quot;&gt;Ctags&lt;&#x2F;a&gt;和&lt;a href=&quot;https:&#x2F;&#x2F;cscope.sourceforge.net&quot;&gt;Cscope&lt;&#x2F;a&gt;导航内核代码, 速度极快. Neovim需要安装第三方Cscope插件, 推荐使用&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dhananjaylatkar&#x2F;cscope_maps.nvim&quot;&gt;cscope_maps.nvim&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Linux内核项目的Makefile中有&lt;code&gt;tags&lt;&#x2F;code&gt;和&lt;code&gt;cscope&lt;&#x2F;code&gt;目标, 生成各自依赖的索引文件. 仅对已编译的源文件生成索引文件, 可通过设置&lt;code&gt;COMPILED_SOURCE&lt;&#x2F;code&gt;环境变量实现.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; data-name=&quot;https:&#x2F;&#x2F;elixir.bootlin.com&#x2F;linux&#x2F;v6.15&#x2F;source&#x2F;scripts&#x2F;tags.sh#L109&quot; class=&quot;language-sh z-code&quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot; data-name=&quot;https:&#x2F;&#x2F;elixir.bootlin.com&#x2F;linux&#x2F;v6.15&#x2F;source&#x2F;scripts&#x2F;tags.sh#L109&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function z-shell&quot;&gt;&lt;span class=&quot;z-entity z-name z-function z-shell&quot;&gt;all_target_sources&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-begin z-shell&quot;&gt;(&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-parens z-end z-shell&quot;&gt;)&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-braces z-begin z-shell&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function z-shell&quot;&gt;	&lt;span class=&quot;z-keyword z-control z-conditional z-if z-shell&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-test z-begin z-shell&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt;-&lt;&#x2F;span&gt;n&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;COMPILED_SOURCE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-test z-end z-shell&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-continue z-shell&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-conditional z-then z-shell&quot;&gt;then&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function z-shell&quot;&gt;		&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;all_compiled_sources&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function z-shell&quot;&gt;	&lt;span class=&quot;z-keyword z-control z-conditional z-else z-shell&quot;&gt;else&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function z-shell&quot;&gt;		&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;all_sources&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function z-shell&quot;&gt;	&lt;span class=&quot;z-keyword z-control z-conditional z-end z-shell&quot;&gt;fi&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-braces z-end z-shell&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;debugging&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#debugging&quot; aria-label=&quot;Anchor link for: debugging&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Debugging&lt;&#x2F;h2&gt;
&lt;p&gt;查看&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;google&#x2F;syzkaller&#x2F;blob&#x2F;master&#x2F;docs&#x2F;linux&#x2F;setup_ubuntu-host_qemu-vm_x86-64-kernel.md#image&quot;&gt;syzkaller&lt;&#x2F;a&gt;的教程, 创建Debian Linux映像, 复制到共享磁盘.&lt;&#x2F;p&gt;
&lt;p&gt;使用&lt;a href=&quot;https:&#x2F;&#x2F;www.qemu.org&quot;&gt;QEMU&lt;&#x2F;a&gt;运行Linux内核:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;qemu-system-x86_64&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-punctuation z-separator z-continuation z-line z-shell&quot;&gt;\
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt;	-&lt;&#x2F;span&gt;m&lt;&#x2F;span&gt; 2G &lt;span class=&quot;z-punctuation z-separator z-continuation z-line z-shell&quot;&gt;\
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt;	-&lt;&#x2F;span&gt;smp&lt;&#x2F;span&gt; 2 &lt;span class=&quot;z-punctuation z-separator z-continuation z-line z-shell&quot;&gt;\
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt;	-&lt;&#x2F;span&gt;kernel&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-assignment z-redirection z-shell&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;bzImage&lt;span class=&quot;z-keyword z-operator z-assignment z-redirection z-shell&quot;&gt;&amp;gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-separator z-continuation z-line z-shell&quot;&gt;\
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt;	-&lt;&#x2F;span&gt;append&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;console=ttyS0 root=&#x2F;dev&#x2F;sda net.ifnames=0&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-separator z-continuation z-line z-shell&quot;&gt;\
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt;	-&lt;&#x2F;span&gt;drive&lt;&#x2F;span&gt; file=&lt;span class=&quot;z-keyword z-operator z-assignment z-redirection z-shell&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;stretch.img&lt;span class=&quot;z-keyword z-operator z-assignment z-redirection z-shell&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;,format=raw &lt;span class=&quot;z-punctuation z-separator z-continuation z-line z-shell&quot;&gt;\
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt;	-&lt;&#x2F;span&gt;net&lt;&#x2F;span&gt; user,host=10.0.2.31,hostfwd=tcp:127.0.0.1:2222-:22 &lt;span class=&quot;z-punctuation z-separator z-continuation z-line z-shell&quot;&gt;\
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt;	-&lt;&#x2F;span&gt;net&lt;&#x2F;span&gt; nic,model=e1000 &lt;span class=&quot;z-punctuation z-separator z-continuation z-line z-shell&quot;&gt;\
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt;	-&lt;&#x2F;span&gt;nographic&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-separator z-continuation z-line z-shell&quot;&gt;\
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt;	-&lt;&#x2F;span&gt;no-reboot&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-separator z-continuation z-line z-shell&quot;&gt;\
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt;	-&lt;&#x2F;span&gt;pidfile&lt;&#x2F;span&gt; vm.pid&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;参数说明查看&lt;a href=&quot;https:&#x2F;&#x2F;www.qemu.org&#x2F;docs&#x2F;master&#x2F;system&#x2F;index.html&quot;&gt;System Emulation&lt;&#x2F;a&gt;官方文档.&lt;&#x2F;p&gt;
&lt;p&gt;使用&lt;a href=&quot;https:&#x2F;&#x2F;www.sourceware.org&#x2F;gdb&quot;&gt;gdb&lt;&#x2F;a&gt; + &lt;a href=&quot;https:&#x2F;&#x2F;pwndbg.re&quot;&gt;pwndbg&lt;&#x2F;a&gt;调试内核, 推荐使用Nix安装pwndbg: &lt;code&gt;nix profile install github:pwndbg&#x2F;pwndbg&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
</content>
        <summary type="html">macOS搭建Linux Kernel开发调试环境</summary>
        </entry><entry xml:lang="en">
        <title>First Patch to Linux Kernel</title>
        <published>2025-05-30T00:00:00+00:00</published>
        <updated>2025-06-02T00:00:00+00:00</updated>
        <author>
            <name>b1n</name>
        </author>
        <link rel="alternate" href="https://b1n.io/blog/first-patch-to-linux-kernel/" type="text/html"/>
        <id>https://b1n.io/blog/first-patch-to-linux-kernel/</id>
        
            <content type="html">&lt;p&gt;Linux Kernel是地球最大的开源项目之一, 使用电子邮件工作流接受贡献.&lt;&#x2F;p&gt;
&lt;p&gt;推荐阅读&lt;a href=&quot;https:&#x2F;&#x2F;kernelnewbies.org&#x2F;Outreachyfirstpatch&quot;&gt;Outreachyfirstpatch&lt;&#x2F;a&gt;, 指导创建第一个Linux Kernel补丁. 官方文档查看&lt;a href=&quot;https:&#x2F;&#x2F;docs.kernel.org&#x2F;process&#x2F;submitting-patches.html&quot;&gt;Submitting patches&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;kernel-tree&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#kernel-tree&quot; aria-label=&quot;Anchor link for: kernel-tree&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Kernel Tree&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;git.kernel.org&quot;&gt;Linux Kernel&lt;&#x2F;a&gt;项目有许多代码仓库, 称之为树. 不同的子系统或功能在不同的子树中开发, 最终由&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Linus_Torvalds&quot;&gt;Linus Torvalds&lt;&#x2F;a&gt;将各个子树的补丁合并到&lt;a href=&quot;https:&#x2F;&#x2F;git.kernel.org&#x2F;pub&#x2F;scm&#x2F;linux&#x2F;kernel&#x2F;git&#x2F;torvalds&#x2F;linux.git&#x2F;&quot;&gt;mainline&lt;&#x2F;a&gt;仓库.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;coding-style&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#coding-style&quot; aria-label=&quot;Anchor link for: coding-style&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Coding Style&lt;&#x2F;h2&gt;
&lt;aside data-position=&quot;right&quot;&gt;
    &lt;p&gt;在十几年前, 还很可能会收到一些不太优雅的回复.&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;p&gt;Linux Kernel有严格的编码风格要求, 细节查看&lt;a href=&quot;https:&#x2F;&#x2F;docs.kernel.org&#x2F;process&#x2F;coding-style.html&quot;&gt;Linux kernel coding style&lt;&#x2F;a&gt;. 违反编码风格的补丁会被维护者拒绝.&lt;&#x2F;p&gt;
&lt;p&gt;提交补丁前使用&lt;code&gt;scripts&#x2F;checkpatch.pl&lt;&#x2F;code&gt;脚本检查编码风格, 如果违反编码风格的代码看起来更好, 那么最好保持原样, 常见的噪音查看&lt;a href=&quot;https:&#x2F;&#x2F;kernelnewbies.org&#x2F;CheckpatchTips&quot;&gt;CheckpatchTips&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;email-workflow&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#email-workflow&quot; aria-label=&quot;Anchor link for: email-workflow&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Email Workflow&lt;&#x2F;h2&gt;
&lt;p&gt;Linux Kernel使用电子邮件工作流, 补丁通过电子邮件发送给维护者, 维护者审查通过后合并到子树. 使用&lt;code&gt;scripts&#x2F;get_maintainer.pl&lt;&#x2F;code&gt;脚本通过commit或文件查询维护者的邮件地址和相关邮件列表.&lt;&#x2F;p&gt;
&lt;p&gt;推荐使用&lt;code&gt;git send-email&lt;&#x2F;code&gt;发送补丁, &lt;a href=&quot;https:&#x2F;&#x2F;sourcehut.org&quot;&gt;sourcehut&lt;&#x2F;a&gt;创建了基于此的电子邮件工作流教程&lt;a href=&quot;https:&#x2F;&#x2F;git-send-email.io&quot;&gt;git-send-email&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;patch-philosophy&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#patch-philosophy&quot; aria-label=&quot;Anchor link for: patch-philosophy&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Patch Philosophy&lt;&#x2F;h2&gt;
&lt;p&gt;Linux Kernel对补丁有严格的格式要求, 细节查看&lt;a href=&quot;https:&#x2F;&#x2F;kernelnewbies.org&#x2F;PatchPhilosophy&quot;&gt;PatchPhilosophy&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;下面是使用&lt;code&gt;git format-patch&lt;&#x2F;code&gt;生成的补丁示例:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;From d446483f4cbfc8f89973fc2aea1f2e7351d73c43 Mon Sep 17 00:00:00 2001
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;From: Xingquan Liu &amp;lt;b1n@b1n.io&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Date: Fri, 30 May 2025 13:08:53 -0400
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Subject: [PATCH] ...
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;[1]
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Signed-off-by: Xingquan Liu &amp;lt;b1n@b1n.io&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;---
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;[2]
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt; test | 0
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt; 1 file changed, 0 insertions(+), 0 deletions(-)
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt; create mode 100644 test
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;diff --git a&#x2F;test b&#x2F;test
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;new file mode 100644
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;index 000000000000..e69de29bb2d1
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;Subject: [PATCH] ...&lt;&#x2F;code&gt;是从补丁主题自动生成的邮件主题, 一般不直接修改, 而是使用&lt;code&gt;git commit --amend&lt;&#x2F;code&gt;修改commit, 并重新生成补丁. 补丁主题也有严格的格式要求, 细节查看&lt;a href=&quot;https:&#x2F;&#x2F;kernelnewbies.org&#x2F;PatchPhilosophy#Patch_subject_formatting&quot;&gt;Patch subject formatting&lt;&#x2F;a&gt;. &lt;code&gt;Signed-off-by: ...&lt;&#x2F;code&gt;是一个补丁标签, 证明代码符合&lt;a href=&quot;https:&#x2F;&#x2F;developercertificate.org&quot;&gt;Developer Certificate of Origin&lt;&#x2F;a&gt;, 详细解释查看&lt;a href=&quot;https:&#x2F;&#x2F;kernelnewbies.org&#x2F;PatchTipsAndTricks&quot;&gt;PatchTipsAndTricks&lt;&#x2F;a&gt;. 可以通过&lt;code&gt;git config format.signOff yes&lt;&#x2F;code&gt;命令启用自动补丁签署. 邮件主题下方[1]处是补丁描述. &lt;code&gt;---&lt;&#x2F;code&gt;下方[2]处可以添加注释, 应用补丁时被忽略.&lt;&#x2F;p&gt;
&lt;p&gt;维护者审查补丁后, 可能会要求修改, 修改后再次生成补丁应使用&lt;code&gt;git format-patch -v2&lt;&#x2F;code&gt;命令. &lt;code&gt;-v2&lt;&#x2F;code&gt;参数会在邮件主题中添加版本号: &lt;code&gt;Subject: [PATCH v2] ...&lt;&#x2F;code&gt;. 还需要在[2]处添加补丁版本说明:&lt;&#x2F;p&gt;
&lt;pre class=&quot;z-code&quot;&gt;&lt;code&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;Signed-off-by: Xingquan Liu &amp;lt;b1n@b1n.io&amp;gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;---
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;v2:
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;- Made commit message more clear
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;- Corrected grammer in code comment
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;- Used new API instead of depreciated API
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-plain&quot;&gt; test | 0
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;一系列相关的补丁合并为补丁集提交, 可以使用&lt;code&gt;git format-patch --cover-letter&lt;&#x2F;code&gt;命令, 将注释写在单独的文件中.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;reply-email&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#reply-email&quot; aria-label=&quot;Anchor link for: reply-email&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Reply Email&lt;&#x2F;h2&gt;
&lt;p&gt;提交补丁后, 可能会需要一些讨论, 以确定最终方案, 开发者需要回复电子邮件参与讨论. Linux Kernel要求邮件是内联的纯文本格式, 禁用&lt;a href=&quot;https:&#x2F;&#x2F;www.ietf.org&#x2F;rfc&#x2F;rfc3676.txt&quot;&gt;format=flowed&lt;&#x2F;a&gt;, 自动换行和GPG签名, 并使用&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;UTF-8&quot;&gt;UTF-8&lt;&#x2F;a&gt;编码. 推荐使用&lt;a href=&quot;https:&#x2F;&#x2F;neomutt.org&quot;&gt;NeoMutt&lt;&#x2F;a&gt;电子邮件客户端, 其他被认为纯文本支持良好的电子邮件客户端查看&lt;a href=&quot;https:&#x2F;&#x2F;useplaintext.email&quot;&gt;Use plain text email&lt;&#x2F;a&gt;. 引用原始邮件内容时使用&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Posting_style#Interleaved_style&quot;&gt;内联回复&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        <summary type="html">Linux Kernel开发所需的前置知识.</summary>
        </entry><entry xml:lang="en">
        <title>Quality of Cyber Life</title>
        <published>2025-05-29T00:00:00+00:00</published>
        <updated>2025-06-02T00:00:00+00:00</updated>
        <author>
            <name>b1n</name>
        </author>
        <link rel="alternate" href="https://b1n.io/blog/quality-of-cyber-life/" type="text/html"/>
        <id>https://b1n.io/blog/quality-of-cyber-life/</id>
        
            <content type="html">&lt;p&gt;记录我在赛博世界的生活方式, 仅包含足以让感兴趣的人前进的指引. 推荐阅读&lt;a href=&quot;https:&#x2F;&#x2F;missing.csail.mit.edu&quot;&gt;The Missing Semester of Your CS Education&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;privacy-guides&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#privacy-guides&quot; aria-label=&quot;Anchor link for: privacy-guides&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Privacy Guides&lt;&#x2F;h2&gt;
&lt;p&gt;真的需要仔细阅读&lt;a href=&quot;https:&#x2F;&#x2F;privacyguides.org&quot;&gt;Privacy Guides&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;keyboard-layout&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#keyboard-layout&quot; aria-label=&quot;Anchor link for: keyboard-layout&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Keyboard Layout&lt;&#x2F;h2&gt;
&lt;p&gt;我使用&lt;a href=&quot;https:&#x2F;&#x2F;colemak.com&quot;&gt;Colemak&lt;&#x2F;a&gt;键盘布局, 并且将&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Caps_Lock&quot;&gt;Caps Lock&lt;&#x2F;a&gt;映射为&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Esc_key&quot;&gt;Esc&lt;&#x2F;a&gt;&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;#fn-1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;. 始终应该使用任何更高效, 更舒适的键盘布局替代&lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;QWERTY&quot;&gt;QWERTY&lt;&#x2F;a&gt;, 如果你的余生需要长时间敲击键盘.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;package-manager&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#package-manager&quot; aria-label=&quot;Anchor link for: package-manager&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Package Manager&lt;&#x2F;h2&gt;
&lt;p&gt;我使用&lt;a href=&quot;https:&#x2F;&#x2F;brew.sh&quot;&gt;Homebrew&lt;&#x2F;a&gt;和&lt;a href=&quot;https:&#x2F;&#x2F;nixos.org&quot;&gt;Nix&lt;&#x2F;a&gt;包管理器, 分别用于管理GUI应用程序(&lt;a href=&quot;https:&#x2F;&#x2F;formulae.brew.sh&#x2F;cask&#x2F;&quot;&gt;Casks&lt;&#x2F;a&gt;)和CLI软件包(&lt;a href=&quot;https:&#x2F;&#x2F;search.nixos.org&#x2F;packages&quot;&gt;Packages&lt;&#x2F;a&gt;). 使用&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;DeterminateSystems&#x2F;nix-installer&quot;&gt;Determinate Nix Installer&lt;&#x2F;a&gt;安装Nix.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;b1nhack&#x2F;dotfiles&#x2F;blob&#x2F;main&#x2F;Brewfile&quot;&gt;Brewfile&lt;&#x2F;a&gt;记录了我通过Homebrew安装的Casks, 通过&lt;code&gt;brew bundle dump&lt;&#x2F;code&gt;命令导出. &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;b1nhack&#x2F;dotfiles&#x2F;blob&#x2F;main&#x2F;nix-packages&quot;&gt;nix-packages&lt;&#x2F;a&gt;记录了我通过Nix安装的Packages, 通过&lt;code&gt;nix profile list &amp;gt; nix-packages&lt;&#x2F;code&gt;命令导出.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;terminal-emulator&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#terminal-emulator&quot; aria-label=&quot;Anchor link for: terminal-emulator&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Terminal Emulator&lt;&#x2F;h2&gt;
&lt;p&gt;我使用&lt;a href=&quot;https:&#x2F;&#x2F;sw.kovidgoyal.net&#x2F;kitty&quot;&gt;kitty&lt;&#x2F;a&gt;终端模拟器, &lt;a href=&quot;https:&#x2F;&#x2F;wezterm.org&quot;&gt;WezTerm&lt;&#x2F;a&gt;也是个不错的选择.&lt;&#x2F;p&gt;
&lt;p&gt;kitty配置文件&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;b1nhack&#x2F;dotfiles&#x2F;blob&#x2F;main&#x2F;kitty&#x2F;kitty.conf&quot;&gt;kitty.conf&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;font&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#font&quot; aria-label=&quot;Anchor link for: font&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Font&lt;&#x2F;h2&gt;
&lt;p&gt;我使用&lt;a href=&quot;https:&#x2F;&#x2F;www.jetbrains.com&#x2F;lp&#x2F;mono&#x2F;&quot;&gt;JetBrains Mono&lt;&#x2F;a&gt;字体, 用于终端模拟器&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;#fn-2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt;和博客.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;unix-shell&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#unix-shell&quot; aria-label=&quot;Anchor link for: unix-shell&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Unix Shell&lt;&#x2F;h2&gt;
&lt;p&gt;我使用&lt;a href=&quot;https:&#x2F;&#x2F;www.zsh.org&quot;&gt;Zsh&lt;&#x2F;a&gt;, 配置文件目录&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;b1nhack&#x2F;dotfiles&#x2F;tree&#x2F;main&#x2F;zsh&quot;&gt;zsh&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;version-control-system&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#version-control-system&quot; aria-label=&quot;Anchor link for: version-control-system&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Version Control System&lt;&#x2F;h2&gt;
&lt;p&gt;我使用&lt;a href=&quot;https:&#x2F;&#x2F;git-scm.com&quot;&gt;Git&lt;&#x2F;a&gt; DVCS (Distributed Version Control System), 并使用&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dandavison&#x2F;delta&quot;&gt;delta&lt;&#x2F;a&gt;增强Git的输出.&lt;&#x2F;p&gt;
&lt;p&gt;Git配置文件&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;b1nhack&#x2F;dotfiles&#x2F;blob&#x2F;main&#x2F;git&#x2F;config&quot;&gt;config&lt;&#x2F;a&gt;, delta配置文件&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;b1nhack&#x2F;dotfiles&#x2F;blob&#x2F;main&#x2F;delta&#x2F;delta.gitconfig&quot;&gt;delta.gitconfig&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;password-manager&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#password-manager&quot; aria-label=&quot;Anchor link for: password-manager&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Password Manager&lt;&#x2F;h2&gt;
&lt;p&gt;我使用&lt;a href=&quot;https:&#x2F;&#x2F;keepassxc.org&quot;&gt;KeePassXC&lt;&#x2F;a&gt;密码管理器, 配置文件&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;b1nhack&#x2F;dotfiles&#x2F;blob&#x2F;main&#x2F;keepassxc&#x2F;keepassxc.ini&quot;&gt;keepassxc.ini&lt;&#x2F;a&gt;. 一定要备份密码数据库文件!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;code-editor&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#code-editor&quot; aria-label=&quot;Anchor link for: code-editor&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Code Editor&lt;&#x2F;h2&gt;
&lt;p&gt;我使用&lt;a href=&quot;https:&#x2F;&#x2F;neovim.io&quot;&gt;Neovim&lt;&#x2F;a&gt;代码编辑器, 配置文件目录&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;b1nhack&#x2F;nvim&quot;&gt;nvim&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;email-client&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#email-client&quot; aria-label=&quot;Anchor link for: email-client&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Email Client&lt;&#x2F;h2&gt;
&lt;p&gt;我使用&lt;a href=&quot;https:&#x2F;&#x2F;neomutt.org&quot;&gt;NeoMutt&lt;&#x2F;a&gt;电子邮件客户端. &lt;a href=&quot;https:&#x2F;&#x2F;www.kernel.org&quot;&gt;Linux Kernel&lt;&#x2F;a&gt;使用电子邮件工作流.&lt;&#x2F;p&gt;
&lt;p&gt;配置文件目录&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;b1nhack&#x2F;dotfiles&#x2F;tree&#x2F;main&#x2F;neomutt&quot;&gt;neomutt&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;openpgp-implementation&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#openpgp-implementation&quot; aria-label=&quot;Anchor link for: openpgp-implementation&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
OpenPGP Implementation&lt;&#x2F;h2&gt;
&lt;p&gt;我使用&lt;a href=&quot;https:&#x2F;&#x2F;gnupg.org&quot;&gt;GnuPG&lt;&#x2F;a&gt; OpenPGP实现, 主要用于电子邮件加密和代码签名.&lt;&#x2F;p&gt;
&lt;p&gt;配置文件目录&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;b1nhack&#x2F;dotfiles&#x2F;tree&#x2F;main&#x2F;gnupg&quot;&gt;gnupg&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;software-development-platform&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#software-development-platform&quot; aria-label=&quot;Anchor link for: software-development-platform&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Software Development Platform&lt;&#x2F;h2&gt;
&lt;p&gt;我主要使用&lt;a href=&quot;https:&#x2F;&#x2F;github.com&quot;&gt;GitHub&lt;&#x2F;a&gt;软件开发平台, 一些重要的代码仓库会使用&lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&quot;&gt;Codeberg&lt;&#x2F;a&gt;, 再通过Mirror功能同步到GitHub.&lt;&#x2F;p&gt;
&lt;footer class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;Neovim需要频繁使用Esc切换模式. &lt;a href=&quot;#fr-1-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;终端模拟器使用&lt;a href=&quot;https:&#x2F;&#x2F;www.programmingfonts.org&#x2F;#jetbrainsmono&quot;&gt;JetBrainsMono Nerd Font&lt;&#x2F;a&gt;以显示大量图标. &lt;a href=&quot;#fr-2-1&quot;&gt;↩&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;footer&gt;
</content>
        <summary type="html">一些重要的非技术知识清单, 提升效率和生活质量.</summary>
        </entry>
</feed>
