繁体   English   中英

如何在 kext 中获取 OS X 版本号?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM