
Linux
文章平均质量分 89
大聪明-PLUS
专注于嵌入式SMARC技术
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
NAND 和 eMMC 测试
现在,让我们来谈谈一种配备内部磨损优化机制的存储设备。这种设备就是 eMMC 内存。eMMC 的缩写代表“嵌入式多媒体存储卡”。为了在嵌入式和便携式系统中使用,设计了一种将控制器和单元阵列集成在单个芯片中的设备。本质上,所有用于数据管理、监控已写入和已擦除块以及对齐和重新分配“坏”块的开销功能都已转移到嵌入式控制器。每个 eMMC 至少包含三个组件:用于与主机系统交互的接口、闪存阵列和控制器。它通常采用行业标准的 BGA(球栅阵列)封装。原创 2025-10-04 12:03:35 · 503 阅读 · 0 评论 -
Linux 网络和流量加密完整指南(第 1 部分)
大家好!我是!在本文中,我想重点介绍 Linux 系统上的流量加密。我们都了解保护隐私的重要性。在这个许多公司收集数据、黑客有时甚至会拦截我们流量的时代,这一点尤为重要。确保数据安全至关重要。例如,确保您的公司网络不被黑客窃听。如今,信息安全不仅仅是一种时尚,而是一种迫切的需要。网络犯罪日益猖獗,保护流量免遭拦截是任何个人或企业数字生活的基本方面。在本文中,我们将介绍 Linux 中可用的主要加密方法及其实现方法。原创 2025-10-04 12:03:13 · 449 阅读 · 0 评论 -
从技术史看:Unix 从何而来
大家好!我是!如今,许多人认为“Unix”和“Linux”是同一个东西。但从 2024 年起,对于大多数我们认为是“Unix”和“Linux”的发行版来说,情况基本如此。但 Unix 的历史悠久。如果你只了解我们今天所熟知的 Linux 系统,很难想象“Unix 早期的情况是什么样的”,因为自那时以来发生了太多变化。原创 2025-10-03 15:30:04 · 923 阅读 · 0 评论 -
Linux 如何创建和计数套接字
大家好!我是!如果您有使用 Web 服务器的经验,您可能遇到过典型的“地址已被使用”(EADDRINUSE)情况。本文不仅会详细介绍判断这种情况是否会在不久的将来发生的先决条件(为此,查看打开的套接字列表就足够了),而且还会解释如何跟踪内核中的特定代码路径(发生此类检查的地方)。如果您只是好奇 socket(2)系统调用究竟如何工作以及所有这些套接字究竟存储在哪里,那么请务必阅读本文直到最后!原创 2025-10-03 15:29:49 · 933 阅读 · 0 评论 -
如何缩小物联网设备的 Docker 镜像
大家好!我是!物联网 (IoT) 设备通常缺乏资源来拉取和使用重量级的 Docker 镜像。本文将展示如何 使用工具 在 不重新编译容器化应用程序的情况下,将 Docker 镜像大小减少。我们还将介绍如何为使用 Rust、Go 和 C/C++ 编写的原生应用程序创建极简镜像。strace。原创 2025-10-02 09:45:24 · 567 阅读 · 0 评论 -
Linux:懒惰抢占的漫漫长路
现代内核提供四种不同的操作模式,用于控制如何抢占一个任务以取代另一个任务。在最简单的模式下,只有当前任务耗尽其分配的时间窗口时才允许抢占。此模式还会在内核中设置多个点,必要时可在每个点执行抢占。在此模式下,除了内核明确禁止的点(例如持有自旋锁的点)外,几乎任何点都可以进行抢占。最后,在此模式下,PREEMPT_RT抢占的优先级高于几乎所有其他操作。即使是大多数由自旋锁持有的代码也可以被抢占。抢占级别越高,系统响应事件的速度就越快,无论是计算机鼠标移动,还是核反应堆发出的表明核心即将熔毁的信号。原创 2025-10-02 09:45:00 · 611 阅读 · 0 评论 -
当你认为在编译器中发现了一个错误时
报告编译器问题时,请记住一个关键点:编译器支持团队不了解您的代码库,因此,如果您能找到尽可能窄的测试用例,只涵盖问题本身,那是最好的选择。在调试此类问题时,你必须在每一步都检查你的假设,并使用调试器或 printf(并希望这两种工具都不会影响代码的状态)。查找此类错误可能非常困难,但重要的是,对于你自己代码中的错误,调试它们只需要你重新思考正在发生的事情。继续“排除你认为应该负责的问题”这个话题,我想指出的是:最明显的迹象之一就是编译器出现了 bug,那就是编译器出现了一些无法解释的问题。原创 2025-10-01 11:51:17 · 1126 阅读 · 0 评论 -
Linux 重启序列:发布
随着系统中处理器的多核化程度不断提升,编写和执行高度并行程序的需求也日益增长。然而,基于锁的并发代码迟早会在用户空间和内核中遇到可扩展性问题。因此,尝试非阻塞算法变得越来越有意义。在内核中,并发非阻塞访问是一项具有明显优势的技术,因为它可以保护内核中执行的代码,避免因中断、抢占或在关键代码段执行期间切换到另一个处理器核心而导致的停顿。而在用户空间中,则无法提供这样的保证。因此,任何针对用户空间的非阻塞算法都必须能够在代码执行可能随时被中断的环境中正常工作。可重启序列是解决此问题的一种方案。原创 2025-10-01 11:50:40 · 672 阅读 · 0 评论 -
通过 Telnet 实现自动化
我定期在这里写各种各样的东西,使用 shell 脚本和各种 Linux 实用程序 - 特别是为了再次证明在 Linux 中你不一定需要“找到一个可以执行 XXXXX 的程序” - 在许多情况下,你已经拥有了你需要的一切,你只需要知道如何使用它。在这种情况下,脚本输入登录名、密码、命令,在第 10 行找到接口名称,在第 11 行将该值分配给日志变量,然后打开文件,将当前值写入其中并退出。这个方案确实有效,但问题在于,服务提供商自己会改变路由,并且不断追踪与哪些内容相关的信息,这让人感到厌烦。原创 2025-09-30 06:40:27 · 229 阅读 · 0 评论 -
您多久会想起罗马帝国……(静态代码分析)
大家好!我是!嗨!不,你没看错——这确实是一篇历史文章。不过不是关于罗马的,而是关于静态代码分析的。不过……这有什么问题?罗马也有它的开国皇帝,也有它与漏洞的斗争,甚至也有它自己的崩溃(请不要对未编译的代码进行分析)。很长一段时间以来,我都不明白为什么“你多久会想起罗马帝国?”这个问题会成为去年最流行的梗之一,直到我发现自己开始痴迷于静态分析。在深入研究了它的历史之后,我决定与大家分享这项研究。顺便提一下,静态分析的概念与编译器(毕竟是代码分析)直接相关。原创 2025-09-30 06:40:08 · 946 阅读 · 0 评论 -
代码审查是开发过程中最大的瓶颈
大家好!我是!今天我要来揭秘现代开发中的一项神圣支柱——代码审查。我们都听过这样的口头禅:“代码评审很重要”、“没有评审就没有质量”、“这是分享知识的最佳方式”。我对此并不否认,但在实践中,在商业开发的严酷现实中,截止日期紧迫、资源有限、团队领导精疲力竭,代码评审已经成为它们已经成为瓶颈,功能和修复几乎无法顺利推进。这并非空洞的断言,而是我们分析了过去两年项目数据后得出的结论。原创 2025-09-29 07:00:06 · 828 阅读 · 0 评论 -
ARM Cortex-M:内存保护单元 (MPU) 发布
然而,一个新问题随之而来。是一种计算机内存管理方法,它允许运行需要更多内存的程序,方法是自动将程序的各个部分在主存储器和辅助存储器之间移动。其功能包括将虚拟内存地址转换为物理内存地址(即管理虚拟内存)、内存保护、缓存管理、总线仲裁,以及在较简单的计算机架构(尤其是地址总线宽度较小的计算机架构)中执行内存块切换。例如,如果您的区域是 16 KB,则需要将其对齐到 16 KB。如果 MemManage_Handler 内部未禁用 MPU,MemManage_Handler 将被重复调用,从而阻塞主程序的执行。原创 2025-09-29 06:59:36 · 905 阅读 · 0 评论 -
C 代码如何在 ARM 处理器上运行:汇编程序分析
大家好!我是!C 语言中的函数调用大量使用堆栈,也称为“调用栈”。函数调用时,会形成所谓的“堆栈帧”。每次函数调用都会创建一个帧,这些帧被放置在堆栈中,并在堆栈中分配空间。变量和中间值的内存也在堆栈帧内分配。堆栈帧还包含指向前一个帧的指针和程序计数器的值。一旦帧从堆栈中弹出,就必须执行它所对应的指令。接下来,让我们反汇编 C 语言中的函数调用,以了解堆栈帧在 ARM 汇编器中的结构。原创 2025-09-28 09:35:55 · 1227 阅读 · 0 评论 -
构建并运行最小 Linux 内核
大家好!我是!有一天,一位技术主管建议我读一读 Bove 和 Cesati 合著的《理解 Linux 内核》。这本书涵盖了 Linux 2.6,比更现代的 6.0 版本落后了不少。但显然,它仍然包含许多有价值的信息。这本书很厚,所以我花了很长时间才读完。在学习的过程中,我决定搭建一个开发环境,以便查看和修改最新版本的 Linux 内核——这会让学习过程更加有趣。还有其他文章讲解了如何构建 Linux 内核。但在本文中,我将以稍微不同的方式组织和呈现这些信息。原创 2025-09-28 09:35:38 · 1027 阅读 · 0 评论 -
Linux 的起源历史——它是如何发生的?
诚然,这个项目最初的名字是别的:托瓦兹创造了一个有趣的词“Freax”(自由)、“Freak”和“Unix”的混合词,并要求ftp.funet.fi网站的管理员阿里·莱姆克(Ari Lemmke)将他的终端源代码上传到这个门户网站。托瓦兹最想做的就是通过调制解调器从他的个人 386 电脑连接到大学的 DEC 电脑,这样他就可以轻松地在家阅读他最喜欢的 Usenet 新闻组了,但现有的终端程序都无法满足他的需求——每个程序都存在一些缺陷。俗话说,伟大的事物有时源于偶然,但它们仍然需要天赋和毅力。原创 2025-09-27 05:46:02 · 673 阅读 · 0 评论 -
数字和字节:Linux 中的内存如何工作?
大家好!我是!原创 2025-09-27 05:45:31 · 1306 阅读 · 0 评论 -
如何从头开始开发 Linux 驱动程序
我撰写了一系列主要侧重实践的文章,理论背景较少。我从《Linux 设备驱动程序》一书中学习了如何开发驱动程序,该书中讨论的示例代码可在GitHub上找到。首先介绍一下基础知识,Linux 操作系统分为内核空间和用户空间。访问硬件设备只能通过内核空间,而设备驱动程序可以被视为内核空间提供的 API,允许用户空间代码访问设备。基于这些基本概念,我发现了几个促使我学习驱动程序开发的问题。原创 2025-09-26 07:46:29 · 1367 阅读 · 0 评论 -
您能相信编译器会优化您的代码吗?
大家好!我是!对于 SIMD 的工作原理,有三个层次的理解(至少我目前处于第 3 级):我最近从 2 级升到了 3 级,注意到编译器使用的模型在我的脑海中闪过一个念头。在这篇文章中,我想解释一下适用于优化 Rust 或 C++ 等静态语言的编译器的通用结构。之后,我会将此结构应用于自动矢量化。我还没有从事过生产优化编译器后端的工作,所以以下内容不会绝对完美,但这些模型绝对有用,至少对我来说!原创 2025-09-26 07:46:09 · 1217 阅读 · 0 评论 -
SIGSEGV 故障排除:Linux 容器中的分段错误(返回代码 139)
段错误”这个术语可能看起来很模糊,但从技术上讲,它是一种非常简单的现象。当一个进程试图读取或写入未经授权的内存位置时,就会收到 SIGSEGV 信号。通常,内核会终止该进程以防止内存损坏。这种行为可以通过在程序代码中显式处理该信号来修改。段错误之所以如此命名,是因为它们会破坏先前精心定义的内存分区顺序。数据段存储可在编译时确定的值,文本段包含程序指令,而堆段封装在运行时创建并动态分配的变量。实际生活中遇到的大多数段错误都属于第三类。原创 2025-09-25 08:47:11 · 601 阅读 · 0 评论 -
精灵和企鹅:什么是 ELF 以及它如何在 Linux 中工作?
绝大多数计算机程序都是用高级语言(例如 Java、C、C++ 等)编写的。这些程序必须经过编译,生成二进制可执行文件,其中包含由 0 和 1 组成的机器码。计算机上的每一条信息都以二进制格式存储,因此要存储有用的信息,必须将其转换为这种格式。二进制文件是指非文本文件的计算机文件。“二进制文件”一词通常与“非文本文件”互换使用。许多二进制文件格式包含可解释为文本的部分;原创 2025-09-25 08:46:48 · 719 阅读 · 0 评论 -
让我们剖析一下“Unix哲学”
大家好!我是!我曾经写过一篇关于编译器设计的文章。那篇文章的核心思想是一个非常简单的组合原语——即构建一个函数流水线。传统上,编译器设计是一个自上而下的过程。编译器是一个庞大的东西,大到你无法一下子理解。因此,任务会被分解,直到最终分解成一个可管理的子任务,比如编写一个解析器。这个问题已经足够紧凑,一个人就能解决。今天,我想讨论一种与上述方法类似,但又完全相反的设计方法。与上述方法类似,它允许我们将大问题分解成更小的问题,但这一次,我们处理的所有较小的子问题都已经得到解决了。原创 2025-09-24 08:06:18 · 820 阅读 · 0 评论 -
为未知 USB 设备编写 Linux 内核驱动程序
我曾经在 eBay 上发现一个奇怪的设备:DreamCheeky USB 信号枪。制造商没有为它提供 Linux 驱动程序,也没有发布 USB 协议规范。只有一个适用于 Windows 的二进制驱动程序可用,有了它,信号枪就成了 Linux 用户名副其实的黑匣子。真是个挑战!让我们让这个可怕的机器在 Linux 下工作。为了使 USB 编程更容易,有一个可通过libusb从用户空间访问的 USB 接口,libusb 是一个软件 API,它隐藏了与内核的低级交互。原创 2025-09-24 08:05:57 · 835 阅读 · 0 评论 -
Linux 网络和流量加密完整指南(第 2 部分)
它会更改客户端的 IP 地址,但不会隐藏正在使用的代理,网站可以检测到客户端的使用,但仅此而已。例如,较慢的外部连接会导致上层排队的重传数量超过下层的处理能力。为了避免被发现,攻击者在解密消息后,可以使用与实际接收者共享的密钥,或者在非对称系统的情况下使用接收者的公钥对其进行加密,然后重新发送消息。它还可以帮助配置网站的访问权限,例如,限制对某些网站的访问,甚至跟踪和监控用户流量。在隧道模式下,IPsec 会加密原始数据包并将其附加到新的报头,并在两个网关之间建立隧道(例如,路由器和防火墙之间)。原创 2025-09-23 09:29:15 · 801 阅读 · 0 评论 -
关于Linux中的软链接和硬链接
链接只是文件或目录的另一个目录条目。软链接(符号链接)是一个单独的文件,其中包含指向另一个文件或目录的路径。与硬链接不同,软链接不直接引用目标文件的 inode,而是拥有自己的 inode,并包含指向目标文件或目录的路径。包含元数据,例如文件的所有者、创建日期、上次访问日期、大小、访问权限,以及指向实际存储文件内容的数据块的指针等信息。我们可以看到,软链接变成了悬空链接,因为它指向的对象已被移动到另一个位置(或者如果文件已被删除则不再存在)。只有当新的硬链接与原始硬链接位于同一文件系统中时,硬链接才有效。原创 2025-09-23 09:16:27 · 852 阅读 · 0 评论 -
C 和 C++ 中的高级预处理器用法
让我们定义 PARSE_BLOCK 宏,它将所有内容包装在 BLOCK() 中,将第一个列表与其余元素分离,并将控制权移交给 PARSE_BLOCK_0。为了避免这种情况,需要检测列表的末尾,并在其前面加上 VOID 宏,而不是 MAP_0 或 MAP_1。接下来,我们将定义两个宏,用于交替地相互转移控制权:PARSE_BLOCK_1 和 PARSE_BLOCK_2。这对于处理预处理器处理的特殊字符(例如“,”、 “(”, “)”)是必要的,这些字符可能会干扰其他宏的内部操作。该宏会增加参数的数量。原创 2025-09-22 14:11:03 · 509 阅读 · 0 评论 -
Linux 实时应用程序清单
这份清单并非详尽无遗,但其中列出的十点信息量很大,可以帮助您设计一个最坏情况下延迟不超过 200 微秒的系统——正如我在本文开头提到的。实时任务通常会等待特定的中断。最后,我们来讨论一下实时应用程序的整个生命周期内需要多少堆内存和栈内存,以确保将内存从栈和堆转移到物理RAM的操作能够及时执行。危险:硬件的选择往往没有考虑到实时系统的要求,导致软件编程过程中需要花费大量精力来克服新出现的问题。该工具可以轻松提供这些信息。如果要解决的任务具有严格的响应要求,则必须对其进行适当的优先级排序并选择合适的调度策略。原创 2025-09-22 14:06:44 · 928 阅读 · 0 评论 -
在 Linux 6.8 中创建自己的系统调用
在这里,我们复制当前加载的内核的配置文件,并告知构建系统使用与配置文件中指定的值相同的值,其他所有参数保留默认值。'n' 表示系统调用的参数数量,然后宏采用系统调用的名称,后跟作为参数传递的参数的 (type, name) 对。现在我们的系统调用已经融入内核,让我们重新启动系统并确保在启动时从 grub 中选择新的(修改后的)内核。这里,462 映射到我们的系统调用,这是两种架构上的通用做法。因此,我们将直接在加载的内核代码中创建一个名为“ ”的目录,并且在这个目录中我们将放置两个文件——原创 2025-09-21 09:33:02 · 797 阅读 · 0 评论 -
汇编程序:理解“Hello, World!”的每一个字节,程序在 CPU 和 OS 层面上是如何工作的
由于虚拟内存是以页面(通常为 4KB 的块)为单位分配给进程的,因此进程当前未使用的页面可以从 RAM 中交换到硬盘上,从而释放宝贵的 RAM 空间。是的,在 Linux 中,一切都是文件,因此我们与终端输出的交互方式与文件写入的交互方式相同。)编译同一个程序,即使从用户的角度来看它执行的功能相同,生成的汇编代码也会有所不同。显然,如果我们想让处理器执行一些有用的工作,比如解决问题,我们就需要将这个问题重新表述成处理器可以理解的指令。栈帧是堆栈的一部分,用于存储特定函数的局部变量和参数,以及返回地址。原创 2025-09-21 09:30:24 · 690 阅读 · 0 评论 -
Linux 是什么?初学者速查表
在较旧的 Ubuntu 系统中, 而在较新的系统中,一切都是通过 netplan 实用程序完成的,配置文件本身可以在这里找到: 某些系统(并非全部)安装了NetworkManager,然后可以在这里找到静态配置文件: 您可以检查是否已安装 NetworkManager,如下所示:或者 在遗嘱中,我被要求提及(嗯,systemd-networkd。它有各种各样的解释器,有的简单,有的复杂,有的体积小巧,等等。我还想指出的是,虽然 NTFS 是 Windows 的默认文件系统,但 Linux 有更多选择。原创 2025-09-20 19:40:15 · 764 阅读 · 0 评论 -
为什么 Linux 中的“一切皆文件”?或者说,为什么 UNIX 的抽象如此出色?
这对我来说是一个真正的启示,也让我感到惊喜:如果我把一张照片保存到笔记本电脑里,然后把它放在布满灰尘的角落或床底下,比如说,10年后,我仍然可以打开它查看。当你的笔记本电脑被苍蝇和蜘蛛困在床下积满灰尘时,你的数据——无论是照片、视频、游戏、你的进度还是成就——都以电荷的形式存储在数万亿个晶体管上,并被塞进一个很小的空间(固态硬盘)里。它需要一个分区,即某种。更重要的是,即使是经验丰富的程序员,也会感到难以置信,因为整个抽象层都被编程语言库隐藏起来了,而这些库代表着更高层次的抽象,他们根本不会去想它。原创 2025-09-20 19:34:46 · 1346 阅读 · 0 评论 -
Linux 中的异常和中断如何工作?
根据英特尔的术语,同步中断称为异常,异步中断称为中断。如果中断处理程序是通过中断门调用的,则 CPU 会清除 IF 标志,以防止在当前中断处理程序执行期间产生其他中断。由于软件中断可以自行重新安排,或者被其他重新安排的中断重新安排,因此如果没有进行适当的检查,软件中断可能会导致进程暂时停止。在第一阶段,内核运行一个通用中断处理程序,该处理程序确定中断号、该特定中断的中断处理程序以及中断控制器。此模式下也可以处理嵌套中断。这有时也称为中断的“下半部分”(上半部分是指在中断被禁用的情况下进行的中断处理部分)。原创 2025-09-19 17:39:11 · 1515 阅读 · 0 评论 -
Linux 中的内存工作原理
大家好!我是大聪明-PLUS!让我们从头开始。任何计算机,尤其是服务器的规格,都不可避免地包含“N GB 的 RAM”——这就是它拥有的物理内存大小。在可执行软件之间分配可用资源(包括物理内存)的任务落到了操作系统(在本例中为 Linux)的肩上。为了确保完全独立的假象,它为每个程序提供了各自独立的虚拟地址空间以及一个用于操作的低级接口。这样,它们就无需相互了解,也无需了解可用物理内存的大小及其当前占用情况。进程虚拟空间中的地址称为逻辑地址。为了跟踪物理内存和虚拟内存之间的映射,Linux 内核在其物理内存原创 2025-09-19 17:31:45 · 1706 阅读 · 0 评论 -
Linux 网络
大家好,我是大聪明-PLUS!今天我将继续我们关于 Linux 内核的系列文章。在本文中,我们将探讨服务器世界中网络的组织方式,以及它如何从使用传统的 Linux 内核网络堆栈发展到使用 OVS 的网络虚拟化,再到使用 NFV 和 SR-IOV 处理电信工作负载。在本文中,我们将探讨 Linux 内核中基本的 IPv4/TCP 流量流程,在深入探讨流量路径之前,我们应该先熟悉一些支持工具和概念:当网络适配器启动并由内核加载其驱动程序模块时,驱动程序首先会在设备内存中分配 Rx(接收)和 Tx(发送)队列或缓原创 2025-09-18 11:47:03 · 987 阅读 · 0 评论 -
Linux 文件系统的顶级数据恢复工具 - Ext4/3/2
Ext2的一个特性是,文件系统会删除部分已删除文件的信息,特别是文件名的链接,这使得恢复这些文件名几乎不可能。在我们的案例中,立即采取行动意味着您应该停止向重要信息被删除的磁盘写入数据,并找到一个可靠的应用程序来帮助您恢复文件。正如您所猜测的,当磁盘上有很多文件时,找到所需的文件将是一项相当大的挑战,而且查看每个文件将需要很长时间。每个块组的结构以超级块开始,接着是组描述符,然后是块位图,接着是 Inode 位图,再接下来是 Inode 表,最后一个元素是数据,即存储在卷中的信息。原创 2025-09-18 10:04:16 · 677 阅读 · 0 评论 -
GStreamer:具有 Linux 风格的编解码器
或许,在新安装的 Ubuntu 系统中,尝试播放 AVI 短片时,都会看到一条提示,提示需要安装 gst-ffmpeg 或 gst-plugins-ugly 等附加软件包。如果您想知道每个元素负责什么,可以运行 gst-inspect 并查看所有可用元素,“gst-inspect lame”将显示 mp3 编码器的参数。总而言之,我想说的是,开发人员仍然需要解决许多问题(例如不同步、内存泄漏和性能问题)。经典的形式是这样的:源 -> 解析器 -> 解码器 -> 过滤器 -> 接收器。原创 2025-09-17 13:41:24 · 600 阅读 · 0 评论 -
DIY Linux 桌面:让电脑再次快速运行
大家好!我是!我曾经从 Windows 转到 FreeBSD,包括因为 FreeBSD 在相同硬件上运行速度更快,并且不需要手鼓跳舞,因为通常情况下,从头到尾所需的一切都已配置好。然后是 Linux——因为它有更好的硬件支持,而且总的来说,人们不想再回到 Windows。但随着时间的推移,Ubuntu 的最新版本在缓慢性和不可预测性方面与 Windows 非常相似。然后,人们又想用电视盒打造一个便捷的桌面……原创 2025-09-17 10:22:07 · 1127 阅读 · 0 评论 -
网络白菜包子手动安装 Arch Linux
简而言之,定期备份就是你的一切。有时候,从你用自己理解的语言写的笔记中找到解决方案,然后沿着已经解开的思路继续学习,比再次翻阅已经找到的信息来解决问题要快得多。│ │ │ └─ 5.3切换到已安装的系统│ │ │ │ │ └─ 配置系统│ ... │ │ └─ 6.5.2 设置超级用户密码│ │ └─ 6.5.3 添加用户│ │ │ └─ 6.6 安装登录管理器│ │ │ └─ 6.7 安装图形环境│ └─ 6.8 重启└─。原则上,创建第二个用户并非必需,但从系统安全的角度来看,这是一个很好的做法。原创 2025-09-16 11:15:42 · 650 阅读 · 0 评论 -
DIY Linux 桌面:WiFi 管理器
通常,它的设置存储在 /etc/wpa_supplicant 的某个位置,启动时它会读取包含已连接网络记录的配置文件,作为守护进程挂起,跟踪网络的出现和消失并在必要时连接到它们。是的,这是一个非常普通的 Shell 脚本。我承认,如果“使用 systemd 启动”——那么一切都会正常,但这是错误的,就像一个老笑话里说的“三年级的铅笔”,既不是二年级的,也不是四年级的。同时,它的运行可以通过“控制接口套接字”来控制,默认在/var/run/wpa_supplicant中,这就是wpa_cli所做的。原创 2025-09-16 10:49:08 · 568 阅读 · 0 评论 -
用自己的双手在微控制器上编写命令行解释器
这通常发生在我需要根据调试需求输出大量信息的时候(例如,在开发自己的文件系统时,需要输出 NANDFLASH 的状态)。增加分配的数组可能是一个很好的解决方案,但我根本不想处理动态内存(它在项目中的其他地方没有使用,并且它占用了 ROM 中的大量代码,而 RAM 不是无限的)。与此同时,我也编写了自己的工具。我不会详细描述 UART 驱动程序,它把接收到的字符保存在静态缓冲区中,丢弃行首的空格,并等待换行符。在我开发的每款设备中,我都通过 UART 接口进行调试输出,这是最常见、最简单的接口。原创 2025-09-15 11:43:25 · 583 阅读 · 0 评论 -
为什么我们需要 UART-Shell?
我可以说,即使要启动相同的 LoRa 协议栈,也需要加载大量依赖项:GPIO、SPI、DMA、FlashFS、UART、TIMERS、SX1262。你可以直接在 TeraTerm/PuTTY 控制台中让微控制器解密 Base64、RLE、AES256,计算 SHA256,计算 CRC16,求解时间间隔的交点,确定两个日期之间的确切天数,计算两个 GNSS 坐标之间的距离,计算两点的线性函数 (ax + b = y) 的系数,求向量之间的角度,解线性方程,计算公式等等。,并在其他微控制器上以相同的形式工作。原创 2025-09-15 11:37:31 · 661 阅读 · 0 评论