技術メモ -64bit,Device Driver,Camera,programming-
Windows programmingとMachine Visionを中心にした、日頃気づいた技術をメモします。
プロフィール

iamhideyon

Author:iamhideyon
普通の技術者です。
職業プログラマしています。
主に画像入力、画像処理、
画像ビューアー、ネットワ
ークライブラリ等を開発し
ています。
日頃気になった技術や製品
のメモを自分のために、書
き溜めて置きます。アドバ
イスやご指摘がありました
らコメントをください。



カテゴリー



全記事(数)表示

全タイトルを表示



ブロとも申請フォーム

この人とブロともになる



リンク

このブログをリンクに追加する




にほんブログ村 IT技術ブログへ
Vista と デバイスドライバの未来

元リンクは元麻布春男さんの記事です。


第8回 Vistaにおけるデバイスドライバのゆくえ


http://plusd.itmedia.co.jp/pcuser/articles/0609/05/news012.html


上記記事にもありますが、Vistaではx64でカーネルモードで動作するsys/dll/exeはデジタル署名が必須になります。


Windowsロゴも32/64ビット両方パスする必要があるそうです。


テーマ:プログラミング - ジャンル:コンピュータ

カーネル・ドライバ メモリマッピング

  • ユーザーメモリからカーネルメモリにアクセスするためにはマッピングする必要があります。



Windows NT システムで実行されるあらゆるプロセスは、0x00000000 から 0xFFFFFFFF まで使用できる 4GB の仮想アドレス範囲を持っています。この中で、0x8000000 から 0xFFFFFFFF の上くらい 2GB のアドレス範囲は、システム内のすべてのプロセス実行に共通に使用され、これはカーネル空間またはシステムアドレス空間と呼ばれています。0x00000000 から 0x7FFFFFFF の下くらい領域範囲は、ユーザアドレス空間と呼ばれています。

プロセスから見て、仮想アドレスの各要素は 1 バイトの物理メモリを概念的に参照します。それぞれの仮想アドレスを対応する物理アドレスに翻訳 (またはマップ) するのは、プロセッサのメモリ マネージャ ユニット (MMU) と関連した仮想メモリ マネージャ( VMM )の仕事です。VMM のマッピング方法は、RAM を固定サイズのページフレームに分割し、これらのページフレームの情報を保管して、それらをマップするためのページテーブルを作成します。各 PTE はページフレームを表し、VMM がページを配置するために必要な情報を含んでいます。



上記説明のように仮想メモリはMMUとVMMがページ単位で管理してます。



4KB のページサイズを使う x86 ベースのシステムで、2GB のアドレス空間をマップするために必要な PTE の最大値は、524,288 ( 2 GB/4 KB )になります。普通のシステムでは、最大 50,000 の PTE(約 195MB のアドレス空間) が一般的な目的で予約され、残りはシステムキャッシュ、ハイパースペース、ページドプール、ノンページドプール、クラッシュダンプ領域などをマッピングするために使用されます。この PTE プールサイズは、システムの物理メモリサイズによって、システム起動時に自動的に決定されます。このプールは、ページドプールとノンページドプールから獲得され、システムの物理メモリサイズによって増減します。



1プロセス2GB以下のメモリ制限があります。PTE の最大値は、524,288(約 195MB ) になります。PTEサイズはレジストリで上限値まで変更できるようです。私が使用している1GB搭載のXPでは以下のサイズでした。



HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager
  \MemoryManagement\SystemPages = 405504




上記レジスト値は405504(約160MB)程度までのPTEが使用できる事になります。なのでDeviceIoControl等でIO_PENDINGにてドライバへバッファを渡すときは、1.6MB/コールで計算すると100コールでバグチェック(NO_MORE_SYSTEM_PTES)が入ります。このバグチェックの様子を見るにはパフォーマンスモニター追加で「Memory」「Free System Page Table Entries 」を観察するとよーくわかります。


 マッピング方法は2つあります。




  • セクション オブジェクト ZwMapViewOfSection




    • 最大マッピング:??








    • 最大マッピング: 32bitのOSで64MB未満. 64bitのOSで32MB未満




 


上記MSDNの引用先はこちら


http://support.microsoft.com/default.aspx?scid=kb;ja;189327


テーマ:プログラミング - ジャンル:コンピュータ

Driver Verifier (DDK ドライバ検証ツール)

Driver Verifier はWindows OSにインストールされているドライバ検証ツールです。


ここではドライバ開発向けの使用方法のメモを書きます。



  • Special pool  メモリのオーバーラン・アンダーラン等を監視します

  • Pool traching ドライバアンロード時にメモリ割り当ての開放をチェックします

  • Force IRQL checking ページドメモリへの誤ったIRQLレベルでスピンロック保持中にアクセスする事をチェックします。

  • I/O verifacation 専用プールからのIRP割り当てドライバのI/O操作を検証します

  • Deadlock detect デットロックを監視します

  • DMA checking WIndows XP以降で、DMAルーチン(バッファ、アダプタ、マップ等)を監視します。

  • Low resource simulation ランダムにプール確保やリソース要求を失敗させて、リソースエラーチェックを監視します。


使用方法はDDKがインストールされていれば、「Tools」「Driver verifier」にあります。GUIとCUIがありますが好みで使用してください。基本的に上記チェック項目を任意に選択して、自分のドライバファイル(***.sys)を選択してリブートすれば自動的に検証してくれます。以下WinDbgで検出されたエラーと警告。



WDM DRIVER ERROR: [*******.sys @ 0xF85852E4] IRP_MJ_SYSTEM_CONTROL has been
                  completed by someone other than the ProviderId. This IRP
                  should either have been completed earlier or should have
                  been passed down (Irp = 832C2F00 ). The IRP was targetted
                  at DeviceObject 82306A50
IRP_MJ_SYSTEM_CONTROL.IRP_MN_BOGUS
[ DevObj=82254020, FileObject=00000000, Parameters=82306A50 00000000 00000000 00000000 ]
http://www.microsoft.com/hwdq/bc/default.asp?os=5.1.2600&major=0xc9&minor=0x220&lang=0x9
Break, Ignore, Zap, Remove, Disable all (bizrd)? remove
r
Breakpoint removed



上記エラー情報とコードが出てきます。次に進むには



input> remove 又は disable とプロンプトに入力します。



エラーの意味はたくさんあるので全て説明できませんが、DDKヘルプの「Blue Screen Data」や「Bug Check Codes」で表示されているmajor番号で意味を理解してください。


※ちなみにターゲットPCではなく自身のPCでVerifierすると、ブルースクリーンになりますので、そのときはリブートしてセーフモードでVerifierを立ち上げて、「Delete existing settings」を選択して全ての検証項目を外してください。


テーマ:プログラミング - ジャンル:コンピュータ





FC2 Blog Ranking FC2 Blog Ranking