对于我这种普通程序员来说,Linux 内核是神秘而高贵的,轻易我们不敢去说内核相关的事情。不过,有时候逼不得已,也得硬着头皮对内核进行一些调试。(比如发现一些异常现象,怀疑是某个系统调用的异常行为在作祟时)为此,学习一些内核调试技术也是有必要的。

限于个人水平,此篇以操作指南为主,不涉及过多的理论知识——其实是我不懂。

阅读全文 »

VSCode 是微软主导开发的新一代编辑器。自其开发之初,就与 Sublime Text 以及 GitHub 主导开发的 Atom 对标。几年前,VSCode 中的 LaTeX 支持还很不完善,考虑到我个人对 LaTeX 的强需求,当时没有从 Sublime Text 切换到 VSCode 上。时至今日,VSCode 发展得已经很不错。前些日子,东升在他的新主页上发布了一篇博文,讲解如何在当前的 VSCode 上配置 LaTeX IDE。看过之后,我就心动了,立即配置好来使用。

不过,由于东升不在 macOS 下工作,他的博文中没有提到如何让 VSCode 在 macOS 上与诸如 Skim 的外部 PDF 浏览器配合工作——特别是 LaTeX 的正反跳转。检索互联网之后,也没有完整可用的方法。甚至 LaTeX workshop 官方的说法也是不支持,需要用户自己想办法绕过。故此有这篇文章。

阅读全文 »

本文是译文,原文由 Chris Wellons 创作,首刊于这里
本文已被翻译成日语乌克兰语中文
本文还有一后续

Linux 的线程设计十分优美:线程只不过是共享虚拟地址空间和文件描述符表的进程而已。由某一进程产生的线程是该主线程(父进程)的子进程。除了少数线程相关的系统调用,操作线程的系统调用与操作进程的系统调用完全相同。这种优美与文件描述符的优美异曲同工。

通常来说,在类-Unix 的系统上,进程是通过 fork() 来生成的。新生成的进程的虚拟内存空间是原进程的拷贝,但具有独立的地址空间和文件描述符表。(Linux 使用写时拷贝技术提升了这一步骤的效率)不过,对于创建线程来说,这种做法太高级(high-level)了;因此 Linux 还有名为 clone() 的系统调用。它与 fork() 的行为大致相同,只不过它能通过一系列参数控制其行为:主要是控制子进程与父进程之间共享那些运行时上下文。

在进程的栈上创建一个新的线程非常简单——只需要 15 条命令,而无需任何库,特别是不需要调用 pthread 库!本文中,我将以 x86-64 平台为例。所有代码均以 NASM 语法写就,因为,依我愚见,它是至今为止最好的(参见:这里)。

此处是完整的示例代码:Pure assembly, library-free Linux threading demo

阅读全文 »

我打小就与音乐结缘,先后学习过声乐和钢琴,接触过的乐器就更多。作为人类智慧的结晶(EVA 渚薰语),音乐总是与高贵、优雅、美丽这些美好的形容词挂钩。另一方面,物理和数学又代表着人类心智的荣耀。作为写作的缘和由,这无疑是很强大的了。因此,这一系列将介绍音乐中的物理和数学知识。

这是系列文章的第一篇,讲讲和声音相关最基本的一些知识。

阅读全文 »