2011-08-13 34 views
3

我有一個kext,需要知道它正在運行的OS X的版本。 CocoaDev has an article其中介紹瞭如何使用Gestalt()獲取OS X版本信息,但代碼需要Cocoa。如何獲取kext中的OS X版本號?

我可以從kext調用Gestalt()嗎?
如果是這樣,我用什麼#include來定義它?
如果不是,還有其他解決方案嗎?


背景:

我想通過10.7使用相同的kext在從10.4 OS X的所有版本。

但是:kexts call cdevsw_add,它在獅子以非向後兼容的方式進行了更改。除了(顯然)對某些調用它的內核程序的更改外,這些更改意味着 - 根據例程之前的註釋 - cdevsw_add應該在10.7上使用不同的第一個參數調用,而不是在OS X 10.0至10.6上調用。 (在Lion上是-12,在早期版本上是-1)

如果kexts可以確定它們在哪個版本的OS X上運行,那很容易。 (如果沒有,這將是一個痛苦 - 可能是一個可怕的kludge,如構建兩個不同版本的kexts並使kext加載代碼選擇加載哪一個代碼)。

+0

出於好奇,你在看什麼驅動?我只問,因爲我正在修復OSS tuntaposx驅動程序系統中的Lion bug - 這就是爲什麼我來到這個問題!謝謝... –

+0

PPS:我在'bsd_stubs.c'中看到關於很久以前發送'-1'到'cdevsw_add(...)'的註釋。它實際上已經在XNU的資源中很長一段時間了 - 例如,這裏是在[10.6.0源代碼](http://www.opensource.apple.com/source/xnu/xnu-1456.1.26 /bsd/kern/bsd_stubs.c)。並且看代碼,我認爲-1應該繼續在Lion中正常工作,即使它不是一個理想的值... –

+0

那些版本範圍看起來不對。也許你對'bdev' /'cdev'或'isfree' /'add'感到困惑?這裏是我得到的,可以檢查:** [10.0.0](http://opensource.apple.com/source/xnu/xnu-123.5/bsd/kern/bsd_stubs.c) - [10.4.11] (http://opensource.apple.com/source/xnu/xnu-792.25.20/bsd/kern/bsd_stubs.c)**:必須嚴格通過'-1'來自動插入;任何事情都不會中止。 ** [10.5.0](http://opensource.apple.com/source/xnu/xnu-1228/bsd/kern/bsd_stubs.c) - [10.7.5](http://opensource.apple.com /source/xnu/xnu-1699.32.7/bsd/kern/bsd_stubs.c)**:傳遞'-1'開始搜索'0',推薦使用'-12'。 (...) – jrodatus

回答

3

Kernel.framework提供了<libkern/version.h>。聲明瞭一些extern變量,如version_major,version_minor等。AFAIK這些變量是從libkern.kpi中導出的。

希望它有幫助。

+0

謝謝。這也起作用,並且更容易。 – user532477

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。)

+0

謝謝。這似乎起作用,至少在kext環境之外。我會在下一個kext中嘗試它。我確實必須將「sizeof nib」改爲「sizeof(nib)」,但這很容易/顯然只是一個錯字。 – user532477

+0

@ user532477,我很高興這對你有用。但是,你確定'sizeof'的圓括號嗎?據我所知,它們是當參數是一個類型時,但是當它是一個變量時是可選的。 – zneak

+0

對不起,我不知道它們是可選的。這在** C **測試中效果很好,但是當我將它放入** C++ ** kext代碼時,我遇到了麻煩,因爲沒有定義sysctl(),CTL_KERN和KERN_OSRELEASE(甚至包括)。我改變它使用sysctlbyname(「kern.osrelease」...),並且工作正常。爲了將來的參考:Tiger 10.4.11是內核'8.11.0',Leopard 10.5.8是內核'9.8.0',Snow Leopard 10.6.8是'10.8.0'內核,正如你所說的,Lion 10.7。 0是內核'11.0.0'。再次感謝。 – user532477