惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
N
Netflix TechBlog - Medium
博客园 - 叶小钗
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
V
V2EX
IT之家
IT之家
J
Java Code Geeks
Hacker News - Newest:
Hacker News - Newest: "LLM"
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
GbyAI
GbyAI
D
Docker
S
Secure Thoughts
Recent Announcements
Recent Announcements
Webroot Blog
Webroot Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
云风的 BLOG
云风的 BLOG
博客园_首页
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Security Archives - TechRepublic
Security Archives - TechRepublic
酷 壳 – CoolShell
酷 壳 – CoolShell
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
N
News | PayPal Newsroom
S
Security @ Cisco Blogs
I
InfoQ
Last Week in AI
Last Week in AI
SecWiki News
SecWiki News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
W
WeLiveSecurity
T
Troy Hunt's Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Attack and Defense Labs
Attack and Defense Labs
美团技术团队
T
The Blog of Author Tim Ferriss
Google DeepMind News
Google DeepMind News
Martin Fowler
Martin Fowler
B
Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Scott Helme
Scott Helme
T
Tor Project blog
Know Your Adversary
Know Your Adversary
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - Blog
Recorded Future
Recorded Future
C
Cyber Attacks, Cyber Crime and Cyber Security
AI
AI
G
Google Developers Blog

See you soon

哟,好久不见,无线打印 | See you soon 试试将文章版本化管理吧 | See you soon 使用 Quadlet 将 Podman 中的 Postgres 当作 systemd 服务运行 | See you soon 大他者,那个无时无刻都在盯着你的东西 | See you soon Laws of Software Engineering,软件工程定律 | See you soon 浅记多因素身份认证 | See you soon 重置 GPG 智能密钥 | See you soon 向 NAS 引入 samba | See you soon 无法重复键入的 Fcitx5 | See you soon ZFS 降级事故 | See you soon 记被 XanMod Kernel 和 AppArmor 联合坑的一次踩坑 | See you soon agent 的 skill 与 toolcall | See you soon 记一次服务器被挂恶意挖矿二进制 | See you soon 活着的 Arc | See you soon 令 acme.sh 使用 Cloudflare 的 DNS API 签发与续签证书 | See you soon 于 Tokio 中卸载 CPU Bound 任务 | See you soon 如我所见,梦破碎的时候 | See you soon 74LS 家族手册 | See you soon JDK Projects 备忘录 | See you soon 关于历史 | See you soon 用 curl 下载 OnePlus 的 ROM | See you soon 实用命令切片 | See you soon 再见,Oh My Zsh。 | See you soon 你不应该复用 strings.Builder | See you soon 博客的明日 | See you soon 被 AppArmor 击杀的 Dockge | See you soon AI 时代的自我 | See you soon 支持删除的布隆过滤器 | See you soon 基于栈的虚拟机与基于寄存器的虚拟机 | See you soon RVA23 包含了什么 | See you soon Rust 的边界检查是否已经有很大的进步 | See you soon 使用 Rust 编写操作系统:Barebones | See you soon 使用 Rust 编写操作系统:引言 | See you soon 编译器笔记:rope | See you soon 编译器笔记:CST | See you soon Paradoxical 札记 | See you soon 简单的相似去重算法(基于向量) | See you soon 更加现代的 PaperMC Minecraft 插件设计指南 | See you soon 简单的 CFG 语法分析方法 | See you soon 简单地使用 Caddy 实现 CORS 配置 | See you soon 让 OpenCV 可以被静态链接 | See you soon 图片搜索笔笺 | See you soon 电路板设计笔记-保护 | See you soon 使用 Rust 实现 SnowflakeId | See you soon 农夫乐事 FaQ 启示 | See you soon 使用 Rust 实现拓展系统札记 | See you soon 遗传学定律的代码实现 | See you soon EN:The Journey of Rust and Procps | See you soon ZH:Rust 与 Procps 之旅 | See you soon 使用 debootstrap 与 schroot 构建一个纯净环境 | See you soon GPG添加新的用户信息 | See you soon GSoC2024 笔记:使用 Rust 重新实现 procps | See you soon JWT 小册 | See you soon 使用密钥登录 SSH | See you soon Guava:Cache | See you soon 编译器笔记:增量编译 | See you soon Gradle秘境:添加一个类似modCompileOnly的依赖块 | See you soon Minecraft:原始经济系统设计简述 | See you soon TinyRemapper笔记 | See you soon MicroOS:进阶 | See you soon MicroOS:起步 | See you soon Swapfile 指北 | See you soon GPG 物理密钥的安装与密钥的迁移 | See you soon 用GPG签名告诉大家这就是我的提交 | See you soon DFS:深度优先搜索 | See you soon 文章翻译:从init.vim到init.lua | See you soon 目录遍历攻击 | See you soon 如何挂载.img文件,以及如何使用QEMU模拟arm64环境 | See you soon 在树莓派上编译 OpenCV | See you soon 关于卸载BlueStacks后遇到的问题 | See you soon
Linux 内核中的度量单位 | See you soon
Krysztal Huang · 2026-04-16 · via See you soon

又是狠狠地被 Linux 中度量单位坑害的一天。

关于内核里的度量单位

在这里的度量单位主要是指诸如 /proc/meminfo 中的出现的单位:kB 等。

典型的 /proc/meminfo 输出值如下所示

cat /proc/meminfo

MemTotal: 48503556 kB

MemFree: 29195360 kB

MemAvailable: 41944808 kB

Buffers: 6960 kB

Cached: 12880504 kB

SwapCached: 0 kB

Active: 10123228 kB

Inactive: 5656716 kB

Active(anon): 3008104 kB

Inactive(anon): 0 kB

Active(file): 7115124 kB

Inactive(file): 5656716 kB

Unevictable: 264 kB

Mlocked: 264 kB

SwapTotal: 67110908 kB

SwapFree: 67110908 kB

Zswap: 0 kB

Zswapped: 0 kB

Dirty: 32 kB

Writeback: 0 kB

AnonPages: 2728952 kB

Mapped: 1793336 kB

Shmem: 115936 kB

KReclaimable: 569648 kB

Slab: 935144 kB

SReclaimable: 569648 kB

SUnreclaim: 365496 kB

KernelStack: 25792 kB

PageTables: 44688 kB

SecPageTables: 4924 kB

NFS_Unstable: 0 kB

Bounce: 0 kB

WritebackTmp: 0 kB

CommitLimit: 91362684 kB

Committed_AS: 16030888 kB

VmallocTotal: 34359738367 kB

VmallocUsed: 194032 kB

VmallocChunk: 0 kB

Percpu: 34688 kB

HardwareCorrupted: 0 kB

AnonHugePages: 827392 kB

ShmemHugePages: 0 kB

ShmemPmdMapped: 0 kB

FileHugePages: 1107968 kB

FilePmdMapped: 643072 kB

CmaTotal: 0 kB

CmaFree: 0 kB

Unaccepted: 0 kB

Balloon: 0 kB

HugePages_Total: 0

HugePages_Free: 0

HugePages_Rsvd: 0

HugePages_Surp: 0

Hugepagesize: 2048 kB

Hugetlb: 0 kB

DirectMap4k: 2532648 kB

DirectMap2M: 20756480 kB

DirectMap1G: 26214400 kB

如你所见,其中的值均为 kB 单位,而根据 SI 和 IEC 的推荐与定义,kB 表达的实际意义是

SI 与 IEC 的定义

十进制前缀(SI)

名字符号倍数
千字节kB
兆字节MB
吉字节GB
太字节TB
拍字节PB
艾字节EB
泽字节ZB
尧字节YB
容字节RB
昆字节QB

二进制前缀(IEC 60027-2)

名字符号倍数
kibibyteKiB
mebibyteMiB
gibibyteGiB
tebibyteTiB
pebibytePiB
exbibyteEiB
zebibyteZiB
yobibyteYiB
robibyteRiB
quebibyteQiB

事实?

事实上因为一些历史原因,Linux 内核的 kB 实际上意义是 KiB

深入内核

由于翻阅的是 /proc/meminfo,因此可以很方便的找到内核中生成这个文件的源码。

我在内核中找到了如下代码,用于生成 kB 数据

static void show_val_kb(struct seq_file *m, const char *s, unsigned long num)

{

seq_put_decimal_ull_width(m, s, num << (PAGE_SHIFT - 10), 8);

seq_write(m, " kB\n", 4);

}

NOTE

基于 Linux 7.0。在接下来的篇章中若无特别说明均基于 Linux 7.0。

注意到计算方式是使用左移,众所周知在二进制中进行左移 n 位实际上等于 ,因此在这里的 kB 实际意义是 KiB

历史渊源

在闲逛的时候发现 Wikipedia 有个专门的页面来展示 kilo 的演变,其中专门提到了 [Linux 内核使用 IEC 词头][https://en.wikipedia.org/wiki/Timeline_of_binary_prefixes#2001]。

并且给了两个参考链接:

这样看下来更像是一个历史问题,IEC 在 1998 年才正式确立了 KiB 等单位的意义,而内核在更早的时候已经开始使用 这个意义。

顺着 /proc/meminfo 这个伪文件系统的信息查下去,发现这个东西是 2.6 的内核版本里就有的东西,而很不幸的是——这是 2005 年发布的版本,在此之前使用的版本管理并不是 git。

在几乎碰到知识盲区的时候,我选择让 Codex 帮我继续追查线索。很显然在这方面 Codex 的知识充沛,工作完成的还挺出色。

NOTE

接下来的一些内容源于 Codex 的直接输出,并未实现 100% 的查证,请以批判的眼光阅读。

在 linux-0.99.tar.Z 的 linux/fs/proc/array.c 里已经有 get_meminfo(),而且 array_read() 里已经把它挂到 proc 条目上

如今是 2026 年 4 月,那么 /proc/meminfo 的出现已经是 33 年前了

我核到的边界是:

  • linux-1.3.0 里的 fs/proc/array.c,get_meminfo() 还没有 kB 标注,只输出原始 数值
  • linux-1.3.100 里的 fs/proc/array.c 已经明确写成:
    • “MemTotal: %8lu kB\n”
    • “MemFree: %8lu kB\n”
    • 数值转换直接用 >> 10 和 << (PAGE_SHIFT - 10)

也就是在这个实现里,kB 明确就是按 1024 字节算,不是十进制的 1000 字节。

你可以把结论理解成:

  • 对 Linux 这个用户可见接口语境,kB = 2^10 的用法,至少在 1996-05-10 对应的 1.3.100 时代就已经存在
  • 很可能更早,但我目前确认到的可靠下界是这里

我查到的归档来源:

确实是历史的残响了。