2009-07-15 6 views
2

プログラムによって、プログラムがPCシステムを完全に制御できるようにするには、何も実行しないようにします。一時的にPCオペレーティングシステムを中断する

私はMS WindowsとLinuxの両方の環境からこれを行うことに興味があります。考慮する言語またはAPI。

私は、OSのプログラムのプリエンプトをやめ、仮想メモリの管理をやめ、デバイスドライバを停止し、サービスルーチンの実行を中断させ、基本的には離れさせたいと考えています。その後、自分のプログラムがベアメタルで邪魔になったとき、OSを再起動せずに元の状態に戻したい。

これも可能ですか?

+0

なぜこれをやりたいですか?私が考えることができる唯一の理由は、そうでなければ混乱させてはいけないこと(フラッシュBIOSなど)を混乱させることです。 – Powerlord

+0

私はユースケースがあまりにも小さいことを認めます。私の興味は主にパフォーマンスです。この種のものは古い8&16-bitの日には日常的でしたが、知的運動として価値があると思います。おそらく、OSベンダーは、これを不可能にするOSサポートハードウェアを追加するために、チップベンダーに十分な圧力をかけていたと思ったが、人間の創意工夫によって、この禁止を回避する方法が見つかるだろう。ここでいくつかの興味深い答え。 –

+0

OSが復活したときに問題を引き起こすものに踏み込めないように注意する必要があります。カスタムOSに再起動して元のOSに再起動できない理由は何ですか?パフォーマンスは、ほとんどあなたがしないことのための奇妙な理由のようです。 –

答えて

0

そうではありません。

基本的にはOSになるアプリケーションです。非常にカスタマイズされたツールや最小化されたツールと結びついたLinuxカーネルを大幅に削除して、これを行う方法があります。

+0

不可能ではありません。それは冬眠の変種として行われています。私のポストを参照してください。 :) – bdonlan

+0

確かに。私は訂正した。 –

14

Linuxでは、kexec jumpを使用して、制御を別のカーネル(つまりプログラム)に完全に転送できます。もちろん、大きな力を借りれば大きな責任があります。割り込みを処理し、古いカーネルのメモリを破壊しないようにすることは、あなた次第です。これを行うために、独自のOSカーネルを書く必要があります。また、カーネルはすべてのハードウェアの初期化を解除し、再開するときに再初期化する必要があるため、制御の転送にかなりの時間がかかります。 kexecジャンプはもともとハイバネーションサポートのために設計されていたので、これは元のコンテキストでは問題ではありませんが、何をしているかによって問題になるかもしれません。

代わりに、OSによって与えられたフレームワーク内で作業することを検討してください。あなたがやっていることのために普通のドライバを書くだけです。

最後にもう1つのオプションは、Linux Real-Time patchsetです。これにより、すべてに静的な優先順位を割り当てたり、ハンドラを中断させたりすることができます。何よりも高い優先度を持つプロセスを実行することで、システムは割り込みをほぼ中断することができますが、タイミング割り込みのような遅延は許されない特定の割り込みだけでなく、あなたがCPUのコントロールを放棄するまで、重い作業は延期されます。

RTパッチセットは仮想メモリなどを停止しないことに注意してください。mlockallは、有効なページのページフォールトを防止します。

また、システムBIOSは、マザーボードモデル固有の方法を除いて、無効にできないSMM trapsを引き続き発生させる可能性があることに注意してください。

1

オペレーティングシステムは基盤であり、あなたのプログラムはそれらの上で動作します。 OSがメモリーアクセス、ディスク書き込み操作、通信などを処理しているときに、アプリケーションが要求を出したときに、OSに移動するように要求すると、代わりにプログラムがOSのジョブを実行する必要があります。

-2

ええ、あなたは完全にそれを行うことができます、あなたは私のお金をすべてあなたに与えるために私の銀行に伝えるプログラムを書くことができ、あなたに熱いロシアを送る。

+0

この人について何が面白いのですか! – jDeveloper

+0

あなたは無意識のうちに私のまさかのアイデアに起こったのですよ、あなた! –

+0

+1:私はいくつかの愛を表示するよ! :) -2明らかなジョークのために厳しいように見えた。 :) –

2

これを行うには本当に醜い方法がたくさんあります。実行中のカーネルを変更するには、アプリケーションにコントロールを渡す/ dev/kmemにトランポリンコードを書き込んでください。しかし、私はそのような試みをすることをお勧めしません!

基本的に、アプリケーションを独自のオペレーティングシステムとして動作させる必要があります。ファイルからデータを読み取る場合は、データがディスク上のどこにあるのかを把握し、ディスクドライブと通信する独自​​のSCSI要求を生成する必要があります。データが準備されているときに通知を受け取るには、独自の割り込みハンドラを実装する必要があります。同様に、ページフォールト、メモリ割り当てなどを処理する必要があります。ほとんどのユーザーは、これは努力する価値がないと感じています...

なぜこれをやりたいですか?

あなたのアプリケーションは、OSがそれをさせないようにする必要があることはありますか?あなたはOSがパフォーマンスに与える影響について懸念していますか?他に何か?

+0

このようなことをしたい正当な理由があります。例えば、システムから信頼できるハードリアルタイム応答を得るために。下の私の答えを見てください。 –

+0

リアルタイム応答が必要な場合は、Windows(またはLinux)を手に入れたいと思うことに同意します。しかし、私はまだそれを達成するための純粋な方法は、ハードウェア間のリアルタイムオペレーティングシステム(またはエグゼクティブ)を実行することであり、アプリケーションが完全にHWを引き継ぐのではなく、アプリケーションであると主張します。それがOPの後にあるなら、私はRTXのアプローチが良いものであることに同意します。 (FWIW、何年も前、私はVenturComに勤務しました。技術は現在IntervalZeroのRTXの一部です...) –

0

あなたが悪意のある人で、オペレーティングシステムのハウスキーピングをたくさん避けたいのであれば、おそらく自分自身をドライバルーチンに巻き込むことができます。大声で考え、ハッキングに照らして考えてみましょう。 Googleのルートキットを書く方法。

2

現金を払う気にならない場合は、WindowsシステムでIntervalZero's RTXを使用してください。これはハードリアルタイムのサブシステムで、HALへのハックとしてWindowsボックスにインストールされ、マシンを引き継ぎ、WindowsにCPUサイクルが残っているかどうかを判断させます。

それは、独自のスケジューラおよびデバイスドライバを持っていますが、最RTXの優先度でプログラムを実行する場合、(期間または無効割り込み)任意のRTXデバイスドライバをインストールしていない、そしてはそれを中断しません。

また、Windows側のプログラムとの少々の対話もサポートしています。

私たちは、Windowsを実行するハードリアルタイムボックスを取得するための良い方法として使用します。

2

coLinux NTカーネルにCoLinuxDriverをロードするか、またはLinuxカーネルにcolinux.koをロードします。それは正確にあなたが尋ねたことを実行します–それはホストOSの "スケジュールを解除"し、独自のメモリ管理、割り込みなどで独自のコードを実行します。それが終わったら、ホストOSを "再スケジュールし"そこでは中断した。 coLinuxはこれを使用して、変更されたLinuxカーネルをホストOSと並行して実行します。

より一般的な仮想化技術とは異なり、coLinuxとベアメタルハードウェアの間には障壁が全くありません。しかし、coLinuxゲストがホストOSに戻る前に何も触れなければ、ハードウェアとホストOSは混乱する傾向があります。

関連する問題