1 个不稳定版本

0.1.1 2023年3月25日

#1022硬件支持

无许可证

11KB
86

post-clock

系统启动后,将POST诊断代码显示用作时钟。

POST诊断代码的背景

在x86和x86-64系统的启动过程中,固件通常将诊断信息输出到I/O端口0x80。这些被称为开机自检(POST)代码,某些主板能够显示它们。还有一些附加卡可以显示POST代码。

在固件将执行权转交给操作系统内核后,不再输出POST代码。此时,某些主板可以配置为使用显示执行其他目的,例如读取板载温度传感器。

然而,内核和用户空间也可以将任意字节写入I/O端口0x80,如果POST代码显示没有切换到不同的输入,它将显示这些字节。

一个小问题是,一些程序(包括Linux内核)默认可能会将写入端口0x80作为短暂的延迟计时器使用。^1 但这种行为可以禁用:例如,Linux可以配置为使用端口0xED,这通常也是安全的。

系统要求和准备

post-clock需要一个最新的Linux内核和一个x86或x86-64系统。

内核应配置为使用不同于0x80的端口进行I/O延迟,或者根本不使用端口。这可以在构建时使用CONFIG_IO_DELAY_0XED和类似选项完成,或者更常见的是使用io_delay引导参数

io_delay=       [X86] I/O delay method
        0x80
                Standard port 0x80 based delay
        0xed
                Alternate port 0xed based delay (needed on some systems)
        udelay
                Simple two microseconds delay
        none
                No delay

使用端口0x80进行短暂延迟的其他程序也应配置为使用其他端口或延迟机制。

主板应配置为系统启动后不在该显示上输出其他信息。

最后,系统调用ioperm(2)需要CAP_SYS_RAWIO能力(post-clock将在进入主循环之前释放它和任何其他能力)。或者,post-clock可以作为root用户执行。

Linux软件包

发行版 软件包名称
ArchLinux post-clockAUR

手动安装

由于post-clock运行需要CAP_SYS_RAWIO权限,因此通常不应将其安装在用户可写位置。遗憾的是,这也意味着cargo install post-clock并不合适。

相反,手动安装post-clock的推荐方法是克隆最新发布标签的仓库,使用cargo构建,然后将生成的可执行文件复制到所需位置。

git clone https://github.com/jonasmalacofilho/post-clock --branch v0.1.1
cd post-clock
cargo build --release
sudo install -Dm0755 -t /usr/local/bin/ target/release/post-clock

作为服务运行

提供了一个systemd系统服务文件,位于post-clock.service。将其安装到合适的位置后,[^4]重新加载所有单元文件。

sudo install -Dm0644 -t /etc/systemd/system/ post-clock.service
sudo systemctl daemon-reload

然后,启用并启动服务。

sudo systemctl enable --now post-clock.service

[^3]:虽然可以传递--root /usr/local/bin,但这将需要以root身份运行cargo,并且会以root身份构建 post-clock,这不建议。

[^4]:请参阅systemd.unit(5)

依赖项

~1MB
~23K SLoC