Skip to content
 
 

Repository files navigation

简体中文 | English | 正體中文 | 日本語 | 한국어

cjktty-patches

本仓库维护 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 的代码补丁,审阅和移植看的是后者。 两种形式都保留,产生的源代码树逐字节相同。

2026.8.11 / 5.10.264, 5.15.215, 6.1.182, 6.6.151, 6.12.103, 6.18.44, 7.1.8, 7.2-rc7

补丁

  • 为 kernel.org 列出的每个内核添加补丁;先前的 longterm 补丁只适用于各系列的 .0 版本,而这些版本已无法使用 GCC 15.3 构建。
  • 使用 Unifont 15.1.04 重新构建 5.10、5.15 和 6.1 的字体,使八个内核绘制相同的字形。
  • 为每个维护中的内核提供拆分形式:一份共用字体补丁和一份 25 KB 的源代码补丁,对应原有的 12 MB 合并文件。
  • font_cjk_16x16.cfont_cjk_32x32.c 中注明字体来源。

修复

  • 在 7.1.x 上使用 kvmalloc_array 预先分配旋转后的 32x32 缓冲区;否则系统只绘制两个字形,却仍报告成功。
  • 两个字体选项均关闭时不构建任何内容。
  • CONFIG_FONT_CJK_32x32 设为默认关闭。基础补丁提供的是空字体,而这个选项自 2021 年加入以来一直默认开启,构建出的内核会把 8 MiB 的全零数据编进去并报告成功。
  • 按照其他补丁的顺序排列 5.10 的描述符,使 32x32 数据补丁能够应用到 5.10。
  • 滚动时让 cleardstsrc 一同前移,使第二次 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。

2026.8.8 / 6.12.102, 6.18, 7.1.7

  • 添加适用于 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=y
  • CONFIG_FONT_CJK_16x16=y
  • CONFIG_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,与补丁所新增文件中的许可证声明一致。

致谢

About

Custom cjktty patches

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages