2011-08-13 9 views
3

私は実行中のOS Xのバージョンを知る必要があるkextを持っています。 CocoaDev has an articleは、Gestalt()を使用してOS Xのバージョン情報を取得する方法を説明していますが、コードにはCocoaが必要です。kextでOS Xのバージョン番号を取得するにはどうすればよいですか?

kextからGestalt()を呼び出すことはできますか?
もしそうなら、それを定義するのに#includeを使用しますか?
他の解決方法はありますか?


背景:

私は10.4から10.7を通じてOS Xのすべてのバージョンで同じのkextをで使用したいと思います。

しかし、kexts call cdevsw_addは、後方互換性のない方法でLionで変更されました。カーネルプログラムを呼び出すカーネルプログラムの変更に伴い、は、OS X 10.0から10.6ではなく、10.7で異なる最初の引数で呼び出される必要があります。 (ライオンで-12、以前のバージョンで-1)

kextsが実行中のOS Xのバージョンを判断できる場合は、簡単です。 (もしそうでないなら、kextsの2つの異なるバージョンを構築し、どのkext-loadコードをロードするかのような恐ろしいクルージュかもしれません)

+0

好奇心で、あなたはどんなドライバーを見ていますか?私はOSS tuntaposxドライバシステムのライオンバグを修正しているので、私は尋ねるだけです。それがこの質問に到着した理由です!ありがとう... –

+0

PPS: '' bsd_stubs.c'の '' cdevsw_add(...) 'に' '-1 'を送信することについてのコメントをかなり前に見ました。実際にはXNUのソースに長い間入っています。たとえば、ここは[10.6.0ソース]です(http://www.opensource.apple.com/source/xnu/xnu-1456.1.26 /bsd/kern/bsd_stubs.c)。コードを見れば、送信するのが理想的ではないとしても-1がライオンでうまくいくはずです。 –

+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>を提供しています。 version_major、version_minorなどのいくつかのextern変数が宣言されています。AFAIKはlibkern.kpiからエクスポートされます。

希望します。

+0

ありがとうございます。これも機能し、簡単です。 – user532477

2

You can use sysctl to get the kernel version(方法3までスクロールダウン) 。それは、あなたがカーネルモジュールを開発するときに動作すると言われています。

これは、サイトがダウンした場合のメソッドの例です。

もちろん、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が定義されていなかったので問題がありました。 h>)。私は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」、そしてあなたが言ったように、ライオン10.7です。 0はカーネル'11 .0.0 'です。再度、感謝します。 – user532477

関連する問題