我有一个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加载代码选择要加载的那个。)
答案 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
。)