闷仙的菜园子 - 2025年2月
type: channel
link: https://www.tomatosoup.cn/index.php/2025/02/
description: 一个INFJ的碎碎念，关于技术、生活、学习等等
items: 如何利用Deepseek解决Obsidian插件代码问题
items: NVMe数据地址描述方式之SGL

如何利用Deepseek解决Obsidian插件代码问题
type: item
date: 2025-02-11T17:00:00+08:00
description: 写在前面：本文包含的代码：main.zip如果你问春节期间谁最火，哪吒2和Deepseek不分伯仲，以后有机会蹭哪吒2，今天我们先蹭一下Deepseek。其实，Deepseek还没有这么火的时候，我就已经开始使用他家的API了，最初是在Obsidian里嵌入了Deepseek，作为AI辅助工具，让它帮我整理和检索笔记，用得不亦乐乎，然后我给身边很多人安利了他家的模型，当然了，它的爆火跟我的安利不能说一点关系没有，至少没有一点关系😊。看着以前自己的“暗恋对象”火出圈变成了“大众情人”，这种心情还是蛮复杂的，一方面说明自己眼光不错，值得开心；但另一方面也着实增添了很多使用中的烦恼——最近就频频遇到服务器超时的问题——这是另外的话题，我们先按下不表，今天以一个具体的例子来分享一下如何使用Deepseek这样的AI工具辅助解决代码中的问题。叠甲：我对JS以及Web不是懂一点，是一点都不懂，所以我的解决方案很可能看起来很傻很笨，大家轻喷，这里只是分享一种在遇到我们不熟悉的问题时如何借助AI工具来分析和解决的思路，供大家参考；多少有点标题党了，是否使用Deepseek在本问题中并不是关键，可能其他模型也可以达到相同的目的，但是我个人使用下来，Deepseek几乎是效果最好的。问题是什么？Obsidian的编辑器宽度在不使用插件或者CSS片段的情况下只有两种格式，最窄或者最宽（通过关闭setting->Editor->Readable line length来实现），可以用但是不够美观，这种遗憾正中完美主义者的七寸，让我很难受:我想要一种解决方案：可以灵活调整编辑器的宽度；最好每一个笔记可以配置不同的宽度；打瞌睡的时候递枕头，确实有一款插件可以满足我的需求：MugishoMp/obsidian-editor-width-slider: With this plugin you can set the line width of the editor in obsidian.下面是其支持的功能：FeaturesAdjust the line width of the editor using a slider in the status bar.Increase or decrease the line width to customize your editing experience.Simple and intuitive interface for easy usage.Feature: Custom for Individual Files using YAMLWith the Obsidian Line Width Slider Plugin, you can now customize the editor width for individual files by specifying an "editor-width" field in the YAML frontmatter of your notes. This feature allows you to have different line widths for different files, giving you greater flexibility in your note-taking and editing experience.Setting the Editor WidthTo set a custom editor width for a specific file, follow these steps:Open the note for which you want to customize the editor width.In the YAML frontmatter section at the top of the note, add an "editor-width" field. The value of this field should be a number between 0 and 100, representing the desired editor width as a percentage of the viewport width. For example:--- title: My Customized Note editor-width: 75 ---从描述来看，该插件完美契合我的需求，但是在使用的过程中遇到了两个问题：在Minimal主题下，该插件不工作；无法为不同的笔记配置不同的宽度（Obsidian版本, v1.8.4），这个问题跟主题无关，我试过Minimum，Default以及Primary，都有问…

NVMe数据地址描述方式之SGL
type: item
date: 2025-02-07T17:35:00+08:00
description: 本文主要介绍了NVMe中的SGL，通过本文您将了解到以下没用的知识：什么是SGL？包括它的特点、结构、使用方法等；NVMe Linux驱动如何使用SGL？PCIe trace中的SGL。什么是SGL?在传输数据时，SSD需要知道数据在Host内存中的地址，否则它不知道数据应该从哪儿搬（写方向）以及搬到哪儿（读方向），也就是说，SSD需要知道数据在Host内存中的分布，而这个信息，是Host通过某种方式告诉SSD的，SGL就是“某种方式”之一。类比“地理藏宝”SGL是Scatter Gather List的简称，顾名思义，SGL是一条链子，将散落在不同地方的数据串在一起，有点像我们玩过的“地理藏宝”的游戏：没喻硬比：游戏里的每一个地点相当于SGL里的SGL segment；游戏里每一个地点藏有下一个地点的信息（除了最后一个），SGL里每一个SGL Segment保存下一个SGL Segment的地址（除了最后一个）；游戏里每一个地点藏有一个（大多数）或多个（少数）宝藏，而每一个SGL Segment包含一个或多个SGL descriptor；SGL特点SGL具有以下特点：SGL是一个链表；链表的每一个节点是一个SGL Segment；一个SGL Segment包含一个或多个SGL Descriptor；SGL Descriptor有多种类型，常用的有SGL data block descriptor，SGL Segment descriptor以及SGL Last Segment descriptor等；每一个SGL Descriptor指向了一段Memory buffer；一个SGL的第一个SGL Segment位于command内部（dword 6 - 9,16 Bytes），这个SGL Segment只包含一个SGL Descriptor。下图描述了一种通用情况下，SGL是如何表达数据分布的：SGL里各个概念之间的关系可以描述为：SGL Descriptor在SGL中，最基本的功能单位是SGL Descriptor，它就像一座建筑的板砖，构建了整个SGL的大厦。SGL Descriptor的结构SGL Descriptor的size是固定的16个字节，其中，第15个字节（0-based）的Bits[07:04]是SGL Descriptor type，表示该SGL Descriptor的类型；第15个字节（0-based）的Bits[03:00]是SGL Descriptor Sub Type，表示SGL Descriptor的子类型；其他的字段，根据Descriptor的类型而具有不同的定义。SGL Descriptor的种类SGL Descriptor的类型主要有以下几种：其中，绿色的SGL Data Block descriptor, SGL Segment descriptor和SGL Last Segment descriptor是最常用的三种类型，而粉色的SGL Bit Bucket descriptor是次常用的，剩下的是最不常用的，我们主要关注有颜色的四种类型即可。SGL Data Block descriptorSGL Data Block descriptor是最常用的descriptor，它可以直接描述用户数据的排布。BytesDescription07:00Address(ADDR):如果SGLDST=0h, 该字段表示存放用户数据的绝对地址；否则，如果SGLDST=1h，该字段表示存放用户数据的相对地址，主要用于NVMe over fabric协议中命令和数据捆绑在一起的情况。另外，如果SSD要求用户数据的地址需要dword对齐（在Identify controller数据中体现），那么该字段低2位比特需要清零。11:08Length (LEN):表示用户数据的长度，以字节为单位。如果SSD要求用户数据的颗粒度需要dword对齐的话，该字段的低2位比特需要清零。14:12预留15SGL Identifier (SGLID):Bits 07:04: SGL Descriptor Type (SGLDT): 0h, 表示是Data Block descriptor；Bits 03:00: SGL Descriptor Sub Type (SGLDST): 如果是0h，ADDR=绝对地址；如果是1h，ADDR=相对地址SGL Segment descriptorSGL Segment descriptor是用于描述SGL Segment的描述符，通过它，SSD可以知道下一个SGL Segment的位置以及该SGL Segment包含多少个SGL descriptor。BytesDescription07…