3

我有一个需要知道它运行的 OS X 版本的 kext。CocoaDev 有一篇文章描述了如何使用 Gestalt() 获取 OS X 版本信息,但代码需要 Cocoa。

我可以从 kext 调用 Gestalt() 吗?
如果是这样,我用什么#include 来定义它?
如果没有,还有其他解决方案吗?


背景:

我想在从 10.4 到 10.7 的所有 OS X 版本上使用相同的 kext。

但是:kexts callcdevsw_add,在 Lion 中以非向后兼容的方式进行了更改。随着(显然)对调用它的一些内核程序的更改,这些更改意味着 - 根据例程之前的注释 -cdevsw_add在 10.7 上应该使用与 OS X 10.0 到 10.6 不同的第一个参数来调用它。(Lion 为-12,早期版本为-1。)

如果 kexts 可以确定它们在哪个版本的 OS X 上运行,那就很容易了。(如果没有,这样做会很痛苦——可能是一个可怕的组合,比如构建两个不同版本的 kext,然后让 kext 加载代码选择要加载的版本。)

4

2 回答 2

3

Kernel.framework 提供 <libkern/version.h>。声明了一些外部变量,如 version_major、version_minor 等。AFAIK 这些是从 libkern.kpi 导出的。

希望能帮助到你。

于 2011-08-29T13:13:22.753 回答
2

您可以使用sysctl获取内核版本(向下滚动到方法 3)。据称它在您开发内核模块时有效。

这是该方法的一个示例,以防网站出现故障。

#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 的内核版本,但这应该不是很难。(我可以证明当前 Lion 版本的内核版本是11.0.0.)

于 2011-08-13T20:03:21.460 回答