蚊章汇 - Alison Chaiken
type: channel
link: https://linuxcn.bwsl.wang/author/884/
description: Alison Chaiken
items: 10 分钟让你了解 Linux ABI
items: Linux 启动过程分析

10 分钟让你了解 Linux ABI
type: item
date: 2023-07-15T19:42:49+08:00
description: 熟悉 ABI 的概念、ABI 稳定性的重要性以及 Linux 稳定 ABI 中包含的内容。LCTT 译注：昨天，AlmaLinux 称将 放弃 对 RHEL 的 1:1 兼容性，但将保持对 RHEL 的 ABI 兼容，以便在 RHEL 上运行的软件可以无缝地运行在 AlmaLinux 上。可能有的同学对 ABI 的概念还不是很清楚，因此翻译此文供大家了解。许多 Linux 爱好者都熟悉 Linus Torvalds 的 著名告诫：“我们不破坏用户空间”，但可能并非每个听到这句话的人都清楚其含义。这个“第一规则”提醒开发人员关于应用程序的二进制接口（ABI）的稳定性，该接口用于应用程序与内核之间的通信和配置。接下来的内容旨在使读者熟悉 ABI 的概念，阐述为什么 ABI 的稳定性很重要，并讨论 Linux 稳定 ABI 中包含了哪些内容。Linux 的持续增长和演进需要对 ABI 进行变更，其中一些变更引起了争议。什么是 ABI？ABI 表示 应用程序二进制接口 Applications Binary Interface 。理解 ABI 概念的一种方式是考虑它与其他概念的区别。对于许多开发人员来说， 应用程序编程接口 Applications Programming Interface （API）更为熟悉。通常，库的头文件和文档被认为是其 API，以及还有像 HTML5 这样的标准文档。调用库或交换字符串格式数据的程序必须遵守 API 中所描述的约定，否则可能得到意外的结果。ABI 类似于 API，因为它们规定了命令的解释和二进制数据的交换方式。对于 C 程序，ABI 通常包括函数的返回类型和参数列表、结构体的布局，以及枚举类型的含义、顺序和范围。截至 2022 年，Linux 内核仍然几乎完全是 C 程序，因此必须遵守这些规范。“内核系统调用接口” 的描述可以在《Linux 手册第 2 节》中找到，并包括了可从中间件应用程序调用的类似 mount 和 sync 的 C 版本函数。这些函数的二进制布局是 Linux ABI 的第一个重要组成部分。对于问题 “Linux 的稳定 ABI 包括哪些内容？”，许多用户和开发人员的回答是 “sysfs（/sys）和 procfs（/proc）的内容”。而实际上，官方 Linux ABI 文档 确实主要集中在这些 虚拟文件系统 上。前面着重介绍了 Linux ABI 在程序中的应用方式，但未涵盖同等重要的人为因素。正如下图所示，ABI 的功能需要内核社区、C 编译器（如 GCC 或 clang）、创建用户空间 C 库（通常是 glibc）的开发人员，以及按照 可执行与链接格式（ELF） 布局的二进制应用程序之间的合作努力。为什么我们关注 ABI？来自 Torvalds 本人的 Linux ABI 的稳定性保证，使得 Linux 发行版和个人用户能够独立更新内核，而不受操作系统的影响。如果 Linux 没有稳定的 ABI，那么每次内核需要修补以解决安全问题时，操作系统的大部分甚至全部内容都需要重新安装。显然，二进制接口的稳定性是 Linux 的可用性和广泛采用的重要因素之一。如上图所示，内核（在 linux-libc-dev 中）和 Glibc（在 libc6-dev 中）都提供了定义文件权限的位掩码。显然，这两个定义集必须一致！apt 软件包管理器会识别软件包提供每个文件。Glibc ABI 的潜在不稳定部分位于 bits/ 目录中。在大部分情况下，Linux ABI 的稳定性保证运作良好。按照 康韦定律 Conway's Law ，在开发过程中出现的烦人技术问题往往是由于不同软件开发社区之间的误解或分歧所致，而这些社区都为 Linux 做出了贡献。不同社区之间的接口可以通过 Linux 包管理器的元数据轻松地进行想象，如上图所示。Y2038：一个 ABI 破坏的例子通过考虑当前正在进行的、缓慢发生 的 “Y2038” ABI 破坏的例子，可以更好地理解 Linux ABI。在 2038 年 1 月，32 位时间计数器将回滚到全零，就像较旧车辆的里程表一样。2038 年 1 月听起来还很遥远，但可以肯定的是，如今销售的许多物联网设备仍将处于运行状态。像今年安装的 智能电表 和 智能停车系统 这样的普通产品可能采用的是 32 位处理器架构，而且也可能不支持软件更新。Linux 内核已经在内部转向使用 64 位的 time_t 不透明数据类型来表示更晚的时间点。这意味着像 time() 这样的系统调用在 64 位系统上已经变更了它们的函数签名。这些努力的艰难程度可以在内核头文件中（例如 time\_types.h）清楚地看到，在那里放着新的和 _old 版本的数据结构。Glibc 项目也 支持…

Linux 启动过程分析
type: item
date: 2018-03-13T18:57:27+08:00
description: 理解运转良好的系统对于处理不可避免的故障是最好的准备。关于开源软件最古老的笑话是：“代码是 自具文档化的 self-documenting ”。经验表明，阅读源代码就像听天气预报一样：明智的人依然出门会看看室外的天气。本文讲述了如何运用调试工具来观察和分析 Linux 系统的启动。分析一个功能正常的系统启动过程，有助于用户和开发人员应对不可避免的故障。从某些方面看，启动过程非常简单。内核在单核上以单线程和同步状态启动，似乎可以理解。但内核本身是如何启动的呢？initrd（initial ramdisk） 和 引导程序 bootloader 具有哪些功能？还有，为什么以太网端口上的 LED 灯是常亮的呢？请继续阅读寻找答案。在 GitHub 上也提供了 介绍演示和练习的代码。启动的开始：OFF 状态 局域网唤醒 Wake-on-LAN OFF 状态表示系统没有上电，没错吧？表面简单，其实不然。例如，如果系统启用了局域网唤醒机制（WOL），以太网指示灯将亮起。通过以下命令来检查是否是这种情况：# sudo ethtool <interface name> 其中 <interface name> 是网络接口的名字，比如 eth0。（ethtool 可以在同名的 Linux 软件包中找到。）如果输出中的 Wake-on 显示 g，则远程主机可以通过发送 魔法数据包 MagicPacket 来启动系统。如果您无意远程唤醒系统，也不希望其他人这样做，请在系统 BIOS 菜单中将 WOL 关闭，或者用以下方式：# sudo ethtool -s <interface name> wol d 响应魔法数据包的处理器可能是网络接口的一部分，也可能是 底板管理控制器 Baseboard Management Controller （BMC）。英特尔管理引擎、平台控制器单元和 MinixBMC 不是唯一的在系统关闭时仍在监听的微控制器（MCU）。x86\_64 系统还包含了用于远程管理系统的英特尔管理引擎（IME）软件套件。从服务器到笔记本电脑，各种各样的设备都包含了这项技术，它开启了如 KVM 远程控制和英特尔功能许可服务等 功能。根据 Intel 自己的检测工具，IME 存在尚未修补的漏洞。坏消息是，要禁用 IME 很难。Trammell Hudson 发起了一个 me\_cleaner 项目，它可以清除一些相对恶劣的 IME 组件，比如嵌入式 Web 服务器，但也可能会影响运行它的系统。IME 固件和 系统管理模式 System Management Mode （SMM）软件是 基于 Minix 操作系统 的，并运行在单独的 平台控制器单元 Platform Controller Hub 上（LCTT 译注：即南桥芯片），而不是主 CPU 上。然后，SMM 启动位于主处理器上的 通用可扩展固件接口 Universal Extensible Firmware Interface （UEFI）软件，相关内容 已被提及多次。Google 的 Coreboot 小组已经启动了一个雄心勃勃的 非扩展性缩减版固件 Non-Extensible Reduced Firmware （NERF）项目，其目的不仅是要取代 UEFI，还要取代早期的 Linux 用户空间组件，如 systemd。在我们等待这些新成果的同时，Linux 用户现在就可以从 Purism、System76 或 Dell 等处购买 禁用了 IME 的笔记本电脑，另外 带有 ARM 64 位处理器笔记本电脑 还是值得期待的。引导程序除了启动那些问题不断的间谍软件外，早期引导固件还有什么功能呢？引导程序的作用是为新上电的处理器提供通用操作系统（如 Linux）所需的资源。在开机时，不但没有虚拟内存，在控制器启动之前连 DRAM 也没有。然后，引导程序打开电源，并扫描总线和接口，以定位内核镜像和根文件系统的位置。U-Boot 和 GRUB 等常见的引导程序支持 USB、PCI 和 NFS 等接口，以及更多的嵌入式专用设备，如 NOR 闪存和 NAND 闪存。引导程序还与 可信平台模块 Trusted Platform Module （TPM）等硬件安全设备进行交互，在启动最开始建立信任链。在构建主机上的沙盒中运行 U-boot 引导程序。包括树莓派、任天堂设备、汽车主板和 Chromebook 在内的系统都支持广泛使用的开源引导程序 U-Boot。它没有系统日志，当发生问题时，甚至没有任何控制台输出。为了便于调试，U-Boot 团队提供了一个沙盒，可以在构建主机甚至是夜间的持续集成（CI）系统上测试补丁程序。如果系统上安装了 Git 和 GNU Compiler Collection（GCC）等…