WinRing0 Alpha6
今回は、hambox 氏から頂いたアイディアをサクッと実装してみました。RDMSR, WRMSR, CPUID を実行する Process Affinity Mask が設定できるので、ちょっとした検証には便利かと思います。が、マルチスレッド環境ではよく考えて使ってください。あと、効率も落ちるので大量に実行するときは要注意です。
今回の主な修正点
- RdmsrEx, WrmsrEx, CpuidEx を追加
Process Affinity Mask が指定できます。 - RDMSR, WRMSR, CPUID 仕様および序数変更
- HLT 序数変更
- サンプルアプリのバグを修正(CPUID の調査範囲が間違ってました。)
序数は変更してしまう場合があるので、API は名前で探してくださいね。また、OpenLibSys 固有の API は 100 以降を使用するつもりです。
あと、ヘッダファイル周りの問題は次回以降に修正します。というか、Beta 移行時辺りになるかも・・・。
◇Alpha6 API (@以下は序数)
- GetDllStatus @1
- GetDllVersion @2
- GetDriverVersion @3
- GetDriverType @4
- IsCpuid @11
- IsMsr @12
- RDMSR @21
- RdmsrEx @22
- WRMSR @23
- WrmsrEx @24
- CPUID @25
- CpuidEx @26
- HLT @27
- ReadIoPortByte @31
- ReadIoPortWord @32
- ReadIoPortDword @33
- WriteIoPortByte @34
- WriteIoPortWord @35
- WriteIoPortDword @36
- ReadMemBlock @41
- WriteMemBlock @42
- SetPciMaxBusNo @50
- ReadPciConfigByte @51
- ReadPciConfigWord @52
- ReadPciConfigDword @53
- WritePciConfigByte @54
- WritePciConfigWord @55
- WritePciConfigDword @56
- FindPciDeviceById @57
- FindPciDeviceByClass @58
ダウンロード:WinRing0 Alpha6
>サクッと実装してみました
ををを!ありがとうございます。
実は、.NET側でProcessor Affinityを設定する方法で実装を進めていたのですが、WinRing0側で対応いただけたので、ありがたくそちらを活用させていただきます。
これで、おかげさまで、プログラムの実装が断然美しくなります。
では早速・・・と思ったら”Internal Server Error”と表示されてダウンロードできませんでした。
Alpha5はダウンロードできるので、Server側のちょっとした不具合ですかね。
ダウンロードできるようになったら、速攻で試したいと思います。
すっ、すいません。
アップロードするの忘れてました(汗
よろしくお願いします。
>hambox さん
.NET がスレッドの Processor Affinity を設定を許さなかったのは一応理由があります.
もともと MSCLR は,SQL Server の Fiber-mode 上でも動くことを目標としていました.Fiber-mode 上で MSCLR が動くときは,.NET アプリケーションから見えるスレッド (ソフトスレッド) は,SQL Server が管理する物理スレッド (ハードスレッド) の上を行ったり来たりすることになります.
このモードを正当化するために,.NET のアプリケーションから見えるスレッドが物理スレッドに 1:1 に対応すると仮定にしないよう,Microsoft は以前から注意を呼びかけていました.たとえば,物理スレッドの Thread Local Storage (TLS) を直接使うのは危険で,Thread クラス (ソフトスレッド) を経由して TLS を使うことが求められています.同様の理由で,Thread クラスは物理スレッドの ID を返しません.
また,Thread.BeginThreadAffinity というメソッドもあって,ソフトスレッドが同じハードスレッドで実行されるように要請されます.
しかし,この Fiber-mode ですが,.NET Framework 2.0 の出荷前にみつかった高負荷環境で発生するメモリ破壊バグを直す時間が無くて,結局無効化されてしまいました.
現在の MSCLR は,あるソフトスレッドをハードスレッドにいったん結びつけると,その関係は固定されてしまいます.
http://blogs.msdn.com/dinoviehland/archive/2005/09/15/469642.aspx
一応ご参考までに.
なお,Win32 スレッド (ハードスレッド) の Processor Affinity については,ProcessThread.ProcessorAffinity から行うことが可能です.
また,Xbox 360 ようの CLR では,Thread.SetProcessorAffinity という専用のメソッドが用意されています.
http://msdn2.microsoft.com/en-us/library/microsoft.xna.net_cf.system.threading.thread.setprocessoraffinity.aspx
> NyaRuru さん
深いコメント誠にありがとうございます。
WinRing0 も正式版リリース前には C# から扱うサンプルコードを作る予定です。.NET 深いですねぇ~。
NyaRuruさん> このモードを正当化するために
ほぉぉ、勉強になります。
「細かいことは気にせずにスレッドを使い給え」というマイクロソフト社の親心(?)で、あえてスレッドに対するProcessor Affinity の容易な設定を許していないのだと想像していました。(^^;;)
まぁ、実際はProcessThread.ProcessorAffinityを使えば、(実装が多少汚くなりますが) できちゃうわけですが。私もいままでコレをつかって、C#でスレッドに対するProcessorAffinityをかけてきました。