[英]How can I get the OS X version number in a kext?
我有一个需要知道它运行的 OS X 版本的 kext。 CocoaDev 有一篇文章描述了如何使用 Gestalt() 获取 OS X 版本信息,但代码需要 Cocoa。
我可以从 kext 调用 Gestalt() 吗?
如果是这样,我用什么#include 来定义它?
如果没有,还有其他解决方案吗?
背景:
我想在从 10.4 到 10.7 的所有 OS X 版本上使用相同的 kext。
但是: kexts 调用cdevsw_add
,它在 Lion 中以非向后兼容的方式进行了更改。 随着(显然)对调用它的一些 kernel 程序的更改,这些更改意味着 - 根据例程之前的注释 - 在 10.7 上调用cdevsw_add
时应使用与 OS X 10.0 到 10.6 不同的第一个参数。 (Lion 为-12,早期版本为-1。)
如果 kexts 可以确定它们在哪个版本的 OS X 上运行,那就很容易了。 (如果没有,这样做会很痛苦——可能是一个可怕的组合,比如构建两个不同版本的 kext,然后让 kext 加载代码选择要加载的一个。)
Kernel.framework 提供 <libkern/version.h>。 声明了一些外部变量,如 version_major、version_minor 等。AFAIK 这些是从 libkern.kpi 导出的。
希望能帮助到你。
您可以使用sysctl
获取 kernel 版本(向下滚动到方法 3)。 据称它在您开发 kernel 模块时有效。
这是该方法的一个示例,以防网站出现故障。
#include <sys/param.h>
#include <sys/sysctl.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
int mib[] = {CTL_KERN, KERN_OSRELEASE};
size_t len;
sysctl(mib, sizeof mib / sizeof(int), NULL, &len, NULL, 0);
char* kernelVersion = malloc(len);
sysctl(mib, sizeof mib / sizeof(int), kernelVersion, &len, NULL, 0);
printf("Kernel version is %s\n", kernelVersion);
free(kernelVersion);
}
当然,您需要弄清楚 Snow Leopard 和 Lion 的 kernel 版本,但这应该不难。 (我可以证明当前 Lion 版本的 kernel 版本是11.0.0
。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.