简体中文 | English | 正體中文 | 日本語 | 한국어
本仓库维护 gentoo-zh/overlay 中 Gentoo 内核及部分 CachyOS、XanMod 内核所使用的 cjktty 补丁。
补丁源自 gentoo-zh/linux-cjktty,并作了少量修改。
- 自 Linux 5.10 起,内核配置选项
CONFIG_FONT_16x16_CJK已重命名为CONFIG_FONT_CJK_16x16。 - 如需在高分辨率屏幕上使用较大的字体,建议应用 32x32 字体数据补丁。
- 补丁内置的字体预期与 8x16 或 16x32 字体配合使用。改用其他字体尺寸时,字符可能无法正确显示。
- 当前的 CJK 点阵字体数据衍生自 GNU Unifont 15.1.04。32x32 数据的半角字符范围取自 Terminus Font,并通过主线内核的
font_ter16x32.c引入。
字体与代码现在是两份独立的补丁,这是本仓库与其他 cjktty 补丁集最大的不同。 以往每个 内核都是一份 12 MB 的合并文件,字模占其中的 99%,移植时要在这样一份文件里辨认出几百行真 正的改动。现在字模补丁由八个内核共用,各内核只有约 25 KB 的代码补丁,审阅和移植看的是后者。 两种形式都保留,产生的源代码树逐字节相同。
补丁
- 为 kernel.org 列出的每个内核添加补丁;先前的 longterm 补丁只适用于各系列的
.0版本,而这些版本已无法使用 GCC 15.3 构建。 - 使用 Unifont 15.1.04 重新构建 5.10、5.15 和 6.1 的字体,使八个内核绘制相同的字形。
- 为每个维护中的内核提供拆分形式:一份共用字体补丁和一份 25 KB 的源代码补丁,对应原有的 12 MB 合并文件。
- 在
font_cjk_16x16.c和font_cjk_32x32.c中注明字体来源。
修复
- 在 7.1.x 上使用
kvmalloc_array预先分配旋转后的 32x32 缓冲区;否则系统只绘制两个字形,却仍报告成功。 - 两个字体选项均关闭时不构建任何内容。
- 将
CONFIG_FONT_CJK_32x32设为默认关闭。基础补丁提供的是空字体,而这个选项自 2021 年加入以来一直默认开启,构建出的内核会把 8 MiB 的全零数据编进去并报告成功。 - 按照其他补丁的顺序排列 5.10 的描述符,使 32x32 数据补丁能够应用到 5.10。
- 滚动时让
clear随dst和src一同前移,使第二次 memset 清除 Unicode 平面,而不是覆盖擦除字符。 - 根据 CJK 字形的
0xfe标记跳过其后的单元格,不再根据高于 U+0080 的任意码位判断;旧判断会丢失窄字符旁的字符。 - 通过
con_putcs重绘高亮的 CJK 单元格,因为从 6.6 起,fbcon_putc已将参数缩窄为一个u16。 - 在旋转光标路径中设置
FB_CUR_SETIMAGE,使硬件光标后端能够取得新的位图。 - 使用四行帮助文本说明两个字体选项,并注明各自的开销。
- 让 Unicode 平面随主平面一同移动。在含 CJK 的行中插入单元格会丢失该行第一个字形,并在行尾留下无关字符;挂接
vc_uniscr系列函数即可一次覆盖CSI @、CSI P、插入模式、清除与备用屏幕。 - 该平面改为从
vc_screenbuf定址,而不是vc_pos,使其指向分配的内存,而非控制台驱动恰好持有的内存。
工具
每个工具的用途与用法见 tools/README.md。
- 添加
tools/gen-font.py,可根据 Unifont 逐字节重建两个字体数组,并输出可加载的 PSF2。 - 将控制台与预期的 Unifont 位图比较;之前的检查在屏幕上仅有两个亮像素时也会通过。
- 按
WARN_ON格式匹配内核日志,并在dmesg失败时判定失败。 - 让压力测试判定读取其收集的全部内容,包括此前被丢弃的 lockdep 模式。
- 添加
tools/test-stress.sh、经 GRUB 和 dracut 的引导加载程序路径、可加载字体验证、--cjk32和--cell。 - 所有内核 tarball 均通过
tools/fetch-kernel.sh获取;该脚本知道候选版本位于 git 快照中,而不在testing/下。 - 统一为版本选择补丁;此前的选择逻辑将当前 6.12 longterm 报告为不受支持。
- 拒绝与合并形式不再匹配的拆分补丁,以及描述符使 32x32 数据补丁无法应用的基础补丁。
- 固定测试镜像并记录其 systemd 版本;此前测试镜像跟随最新 stage3,重新构建便会使原本通过的测量变为失败。
- 使用固定的 OpenRC 镜像启动 Linux 5.10,因为当前 systemd 无法启动该版本。
- 文件缺失时让
regen.sh失败,不再输出不完整的补丁。 - 以
fgconsole确认chvt确实切换了控制台,并统计真正生效的 fbcon 绑定次数,而不是尝试次数。 - 等控制台绘制完成后再发出截图信号:串口是模拟 UART,而 fbcon 逐像素绘制,因此持续集成曾拍到仍显示内核日志的画面。
- 在持续集成中执行拆分形式与 32x32 描述符两项检查;此前它们已写好却从未接入。
文档
- 根据补丁、选择规则和已记录的测量生成
SUPPORTED.md,并将每项测量绑定到测量时所用的文件字节。 - 说明数据附带的字体许可条款:32x32 数组采用 OFL-1.1,两个上游的版权声明现均随数据一同分发。
- 添加持续集成以测试拉取请求中的变更,并添加针对 kernel.org 的每日适用性变化检查和五种语言的 README。
- 添加适用于 linux 6.12.102 和 6.18 的补丁。
- 更新至 linux 7.1.7。
- 使用
kvfree释放 CJK 字体缓冲区,并释放此前从未释放的fontbuffer_utf。 - 修复 6.12.63、6.16 和 6.17.8 的构建。
- 添加两阶段测试工具
tools/。
完整的版本记录见 CHANGELOG.zh-CN.md,工具本身的说明见 tools/README.md。
从 v<major>.x/ 中选择 major.minor 与内核版本相符的补丁。假设本仓库检出于 ../cjktty-patches,请在内核源码根目录执行:
patch -p1 --fuzz=0 < ../cjktty-patches/v6.x/cjktty-6.18.patch启用以下所有内核配置选项:
CONFIG_FONTS=yCONFIG_FONT_CJK_16x16=yCONFIG_FRAMEBUFFER_CONSOLE=y
如需使用 32x32 字体,请另行应用其数据补丁:
patch -p1 --fuzz=0 < ../cjktty-patches/cjktty-add-cjk32x32-font-data.patch然后启用 CONFIG_FONT_CJK_32x32=y。该选项默认关闭。
必须使用 framebuffer console;vgacon 无法显示 CJK。
| 年份 | 位置 |
|---|---|
| 2011–2020 | gentoo-zh/linux-cjktty,由 microcai 维护,每个内核版本各有一个分支 |
| 2020–2024 | zhmars/cjktty-patches,抽取为补丁集合 |
| 2022– | bigshans/cjktty-patches,仍在维护;本仓库由此派生 |
补丁采用 GPL-2.0-only,与补丁所新增文件中的许可证声明一致。
- youbest 提供原始 univt 补丁
- microcai 和 gentoo-zh/linux-cjktty 提供原始 cjktty 补丁
- AOSC-Dev/aosc-os-abbs 提供部分 univt 修改
- Unifont 提供字体数据
- Terminus Font 提供字体数据