问题描述
正如您在 changelog for the Linux kernel 中看到的,有更新消息,如“Bump ABI – Maverick ABI 28”。
根据 Ubuntu Wiki ,ABI 就像是内核空间和其他模块之间的桥梁(我的解释)。
这样的更新是否增加了额外的功能和/或错误修复?我应该将我的内核升级到下一个版本吗?
最佳方法
首先,您没有查看 linux 内核的变更日志。您正在查看元包,它是依赖于最新内核的包。你可能想要这样的东西:http://changelogs.ubuntu.com/changelogs/pool/main/l/linux-image-2.6.35-28-generic/linux-image-2.6.35-28-generic_2.6.35-28.50/changelog
这个 meta-package 的目的是让用户通过这些 ABI 颠簸。
我对 ABI 和内核的看法和你一样。实际上,ABI 碰撞意味着所有模块都需要针对更新的内核进行重建。
我的理解也与 Roland 一致,因为 ABI bump 并不意味着新功能,只是关键修复和安全更新。
次佳方法
注意:我不是内核专家 – 所以这是基于收集的知识和经验。
ABI “bump” 不应带来新功能,即使它可能在某些正在寻找更高版本 ABI 的模块/应用程序中出现 “fix” 错误。您仍应安装这些更新,因为通常保持所有组件同步将确保稳定性和安全性。
第三种方法
ABI 是应用程序二进制接口(不要与 API,应用程序编程接口混淆)。 ABI 定义应用程序使用的数字的大小、符号和顺序。
为了清楚起见,这里有一个例子:我想对建筑物的年龄进行编码,以年表示。为此,我可以使用 C unsigned char
,这是一种大小为 1 字节的类型,可以对 0 到 255 之间的值进行编码。现在假设我发现 255 是一个太低的限制,因为有些建筑物是建造的超过 255 年前。然后我可以使用 C unsigned int
,它有 4 个字节长,可以对 0 到 65535 之间的值进行编码。
将类型从 char
更改为 int
,我没有更改该字段的语义(这是一个以年表示的年龄,现在仍然如此),但是我更改了它的大小。每个与我的应用程序交互的软件都不需要更改,但它会说不同的 “language”。
因此,当内核更改其 ABI 时,意味着它更改了它使用的语言,但没有添加、删除或修改任何功能。所有必须与内核交互的第三方模块都需要重新编译才能使用这种新语言,但无需以任何方式更改它们即可正常工作。