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

时间:2011-08-13 19:51:57

标签: macos kernel device-driver kernel-extension

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

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


背景:

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

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

如果kexts可以确定它们正在运行的OS X版本,那么很容易。 (如果没有,这将是一件痛苦的事情 - 也许是一个可怕的kludge,比如构建两个不同版本的kexts并使用kext加载代码选择要加载的那个。)

2 个答案:

答案 0 :(得分:3)

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

希望它有所帮助。

答案 1 :(得分:2)

You can use sysctl to get the kernel version(向下滚动到方法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。)