DBMS LinterおよびReactOS、技術的詳細

主にReactOS財団の活動原因で、Habrの常連読者が「フリーWindows」の非常に野心的なプロジェクトについて聞いたことがあると考えるのは大きな間違いではありません。 私も例外ではなく、 DBMS LINTERの アセンブリシステムの作成作業中にさえ、このオペレーティングシステムのサポートを含めるというアイデアに度も訪れました。 最近では、それを実現することができまし







実際のハードウェアにReactOSを展開した経験や、このプロジェクトについての私の主観的な意見など、作業の技術的な詳細を待っています。



最初の実験:メールスロットからの読み取りをブロックするエラー



最初は勇気づけられました-ReactOSへのWindows Linterディストリビューションのインストールは成功しました。サービスが正しく登録され、データベースが作成され、サーバーは一見正常に動作しているように見えました。 ただし、最初の機能テストでは結果が得られませんでした。 文字通りの意味では何もありません-クライアントはローカルDBMSカーネルを見つけ、接続を確立しようとしましたが、サーバーはこれらの試みに応答しませんでした。 問題がIPCにあることは明らかでした。 Linterは複数のプロセス間通信メカニズムをサポートしています。ローカルソケット、共有メモリ、メールスロットですが、 後者はデフォルトでテストがカーネルと通信する方法でした。 共有メモリを使用してテストを再構成および再構築した後、仮定を確認することができました-問題はReactOSでのメールスロットの実装であり、詳細な調査でも理由が見つかりました:パラメーターlReadTimeout = MAILSLOT_WAIT_FOREVERでCreateMailslot関数を呼び出すと、エラーコードERROR_SEM_TIMOTIMOTIMOTですぐに戻りました:



hMailslotClient = CreateMailslot(LMS, 0L, MAILSLOT_WAIT_FOREVER, (LPSECURITY_ATTRIBUTES) NULL); if (hMailslotClient == INVALID_HANDLE_VALUE) { dbgError(GetLastError(),__LINE__); return 1; }
      
      



完全な例はこちらから入手できます



適切なバグレポートが制定されましたが、 すぐに修正されました 。 判明したように、値MAILSLOT_WAIT_FOREVER(-1LL)はタイムアウトパラメータとしてチェックせずにKeWaitForSingleObject関数に渡されました。後者はミリ秒単位ではなく、数百ナノ秒単位で動作するため、エラーでした。このエラーを修正するために、ReactOSのMAILSLOT_WAIT_FOREVERは100ナノ秒でした。

パッチボットのレポートはこちらから入手できます



スロットからの非同期読み取りエラー



タイムアウトの問題はメールスロットの実装における唯一の問題ではないことが判明しました。クライアントアプリケーションとカーネルの通信が開始された直後、デッドロックスロットが現れました。 理由を探し始めたとき、ReactOS実装のメールスロットファイルシステム(msfs.sys)ドライバーがスロットからの非同期読み取りをサポートしていないことがわかりました。



  if (!ReadFile(hMailslotClient, lpszBuffer, LENMSG, &cbRead, &stOverlapped)) { //ERROR_IO_PENDING (997) is not a failure!! dbgError(GetLastError(),__LINE__); _tprintf(TEXT("starting writer...\n")); startWriter(); if (!GetOverlappedResult( hMailslotClient, &stOverlapped, &cbTr, TRUE)) { dbgError(GetLastError(),__LINE__); return 1; } }
      
      



完全な例はこちらから入手できます



修正の量を考えると、新しいバグレポートはすぐに閉じられなくなりました。 したがって、私はドライバーの最終決定を支援することにしましたが、Windowsドライバーが学生時代に書かれた最後の時は認めます。

msfs.sysに対する私の改善は、 Cancel-Safe IRPキューを使用してIRPパケットを処理することになり、スロットからの非同期読み取りを整理できるようになりました。 最もエレガントなオプションではなく、非常にシンプルで信頼性の高いオプションです。 コミット69475で編集が追加された後、LINTERカーネルのすべての機能テストを正常に「実行」することができました。

パッチボットのレポートはこちらから入手できます



mbstowcsおよびwcstombsのエラー



ReactOSで私が見つけた最後のエラーは、最初はLINTER管理ツールのGUIの行にアーティファクトの形で「表面化」しました。 これらのアプリケーションはすべて、クロスプラットフォームUIライブラリであるRelAPIに基づいています。 判明したように、最も無害なバグは、ReactOSで最も重大なエラーの現れであることが判明しました。mbstowcsおよびwcstombs関数は、最初のパラメーターがNULLである状況を適切に処理しませんでした。



 char rosStr[BUFFER_SIZE] = "Reactos"; cnt = mbstowcs(NULL,rosStr,BUFFER_SIZE); wchar_t rosStr[BUFFER_SIZE] = L"Reactos"; cnt = wcstombs(NULL,rosStr,BUFFER_SIZE);
      
      



完全な例はこちらから入手できます



対応するバグレポートは非常に早く閉じられたため、ReactOSを実行している製品のテストを完了できました。

パッチボットのレポートはこちらから入手できます



鉄テスト



ReactOSの議論では、「このOSは実際の最新のハードウェアで動作しますか?」という精神に疑問を投げかけることがあります。私の場合は、答えはイエスです。 それらの最初のものは、ehciコントローラー、usbキーボードおよびマウスの操作不能で、BIOSによってレガシーとして正常にエミュレートされて機能しましたが、usbehci.sysドライバーがコントローラーをリセットするまで、私はそれを拒否しなければなりませんでした(ドライバー)アイドルUSBデバイスの形での結果。 2番目の問題は、OSの不安定な動作であり、定期的にhdaudbus.sys(高解像度オーディオのバスドライバー)のBSODに「クラッシュ」しました。 この問題は、BIOS設定で適切なコントローラーを無効にすることで解決しました。

すべての操作が実行された後、ReactOS(ビルド20151025-r69700)の制御下にあるシステムは安定して動作し、必要なすべてのテストとパフォーマンス測定を「実行」することができました。

すべての実験は機器で行われました:
pechenkin @ big:〜$ lspci -nn

00:00.0ホストブリッジ[0600]:Intel Corporation第2世代コアプロセッサフ​​ァミリーDRAMコントローラー[8086:0100](rev 09)

00:01.0 PCIブリッジ[0604]:Intel Corporation Xeon E3-1200 /第2世代コアプロセッサフ​​ァミリーPCI Expressルートポート[8086:0101](rev 09)

00:16.0通信コントローラー[0780]:Intel Corporation 6シリーズ/ C200シリーズチップセットファミリーMEIコントローラー#1 [8086:1c3a](rev 04)

00:1a.0 USBコントローラー[0c03]:Intel Corporation 6シリーズ/ C200シリーズチップセットファミリーUSB Enhanced Host Controller#2 [8086:1c2d](rev 05)

00:1c.0 PCIブリッジ[0604]:Intel Corporation 6シリーズ/ C200シリーズチップセットファミリPCI Expressルートポート1 [8086:1c10](rev b5)

00:1c。3 PCIブリッジ[0604]:Intel Corporation 82801 PCIブリッジ[8086:244e](rev b5)

00:1c.4 PCIブリッジ[0604]:Intel Corporation 6シリーズ/ C200シリーズチップセットファミリPCI Expressルートポート5 [8086:1c18](rev b5)

00:1c.5 PCIブリッジ[0604]:Intel Corporation 6シリーズ/ C200シリーズチップセットファミリPCI Expressルートポート6 [8086:1c1a](rev b5)

00:1d.0 USBコントローラー[0c03]:Intel Corporation 6シリーズ/ C200シリーズチップセットファミリーUSB拡張ホストコントローラー#1 [8086:1c26](rev 05)

00:1f.0 ISAブリッジ[0601]:Intel Corporation Z68 ExpressチップセットファミリーLPCコントローラー[8086:1c44](rev 05)

00:1f.2 SATAコントローラー[0106]:Intel Corporation 6シリーズ/ C200シリーズチップセットファミリーSATA AHCIコントローラー[8086:1c02](rev 05)

00:1f.3 SMBus [0c05]:Intel Corporation 6シリーズ/ C200シリーズチップセットファミリーSMBusコントローラー[8086:1c22](rev 05)

01:00.0 VGA互換コントローラー[0300]:NVIDIA Corporation GF104 [GeForce GTX 460] [10de:0e22](rev a1)

01:00.1オーディオデバイス[0403]:NVIDIA Corporation GF104 High Definition Audio Controller [10de:0beb](rev a1)

03:00.0 PCIブリッジ[0604]:Integrated Technology Express、Inc. デバイス[1283:8892](rev 10)

05:00.0 USBコントローラー[0c03]:Etron Technology、Inc. EJ168 USB 3.0ホストコントローラー[1b6f:7023](rev 01)

06:00.0 USBコントローラー[0c03]:Etron Technology、Inc. EJ168 USB 3.0ホストコントローラー[1b6f:7023](rev 01)



fat32のReactOSでのTPC-Bテストの結果、LINTERプールサイズは390 MBです。

 Mode = PESSIMISTIC Accounts = 1000 .... Transactions: 817600 Working time: 299 seconds Speed = 2727.333 tps
      
      







Windows 7、fat32でのTPC-Bテストの結果、LINTERプールサイズは390 MBです。

 Mode = PESSIMISTIC Accounts = 1000 .... Transactions: 688400 Working time: 299 seconds Speed = 2298.881 tps
      
      







少し主観的



ReactOSは現在アルファ状態にあり、プロジェクトの公式ウェブサイトが正直に報告しており、本番環境での使用には適していませんが、必要であれば、限られたセットで特定の機器で作業するためにOSを許容時間内に思い浮かべることができるという印象を受けましたソフトウェア。 a睡、私は、鉄を「手に入れる」ことや、OSの内部を掘り下げることを好む人にとって、このプロジェクトは間違いなく興味深いものになると思います。 それとは別に、ReactOSコミュニティの親しみやすさと、結果の達成に注力していることに注目する価値があります。



All Articles