2009-07-15 4 views
2

Following my previous question非常に長い機能の背後にある理論的根拠については、piece of codeに関する特定の質問をお伝えしたいと思います。これは、Linuxカーネルの機能であり、かなり長い(412行)複雑なものです(MCC index3の133)。基本的に、それは長くて入れ子になったスイッチのステートメントですこのカーネル関数を読みやすくすることはできますか? (学術研究に必要なアイディア)

率直に言って、私はこの混乱を改善する方法を考えることはできません。ディスパッチテーブルは巨大で非効率的であると思われ、サブルーチン呼び出しではコードの大部分をカバーするためには考えられない数の引数が必要になります。

この機能を効率的に失うことなく、より読みやすい方法で書き換えることができると思いますか?そうでない場合は、コードが読みやすいように見えますか?

言うまでもなく、私の研究に表示される回答は、ここと提出された論文の両方で全面的に評価されます。

Link to the function in an online source browser

+0

あなたは非常に興味深い研究を進めています... –

+1

このトピックに関するこれ以上の投稿は、コミュニティWiki、IMHOでなければなりません。 –

+1

私は、カーネルコードを通常のアプリケーションコードとは非常に異なるものとして扱います。そして、特に変更や進化が必要ではない非常によく定義され、理解された概念を実装するコード。 – nos

答えて

1

非常に恐ろしい、IMHO。明白な一次修正は、スイッチ内の各ケースを関数への呼び出しにすることです。そして、誰もが効率性について不安を覚える前に、私はちょうど1つの言葉 - 「インライン化」を言いましょう。

編集:このコードはLinux FPUエミュレータの一部ですか?もしそうなら、これはFPUを持たない386のようなIntelのチップでLinuxを動かすためのハックだった非常に古いコードです。そうであれば、おそらく歴史家を除いて学者にとっては適切な研究ではないでしょう!

+0

私が考えることができる唯一の結論は、渡す必要がある引数の不当に長い数です。 –

+0

ニール:もっと言葉:それはLinuxだ。おそらく、さまざまなコンパイラをベースに構築する必要があります。また、研究を行っている人を除いて、誰もこのコードを見ない可能性が非常に高いです。 –

+0

@ Udi FPUと何らかの関係があるように見えるので、何らかのFPU構造を渡すことが順調であるようです。 –

0

私は、カーネルについてや、彼ら​​が働くかもしれない再ファクタリング方法について多くを知りません。

私の頭に浮かべている主なことは、switch文を使って、各サブステップをセクションが何をしているのかを記述する名前を持つ別の関数に分割することです。基本的に、よりわかりやすい名前。

しかし、私はこれがもう機能を最適化するとは思わない。それはちょうど役立つかもしれない小さい機能にそれを壊す...私は知らない。

これは私の2セントです。

+0

関数呼び出しオーバーヘッドは禁止されます。割り込みハンドラの一部のように見えますが、入り口に出る必要があります。 –

4

私は機能が混乱しているとは思わない。私はそのような混乱を前に書く必要がありました。

この関数は、マイクロプロセッサ製造元のテーブルのコードに変換されます。これは非常に低レベルのもので、特定の割り込みやエラーの理由で適切なハードウェアレジスタをコピーします。この種のコードでは、ハードウェアによって埋め尽くされていないレジスタには触れないことが多く、バスエラーの原因となります。これにより、より一般的なコード(すべてのレジスタをコピーするようなコード)の使用を防ぎます。

私はいくつかのコードの重複があるように見えました。しかし、このレベル(割り込みレベルで動作)では、速度が重要です。私は、抽出されたメソッドがインライン化されることが分かっていない限り、共通コードで抽出メソッドを使用しません。


ところで、そこにいる間(カーネル)には、このコードの変更履歴を必ず記録してください。ハードウェアに縛られているので、ここにはあまり多くの変更がないことがわかります。この種のコードの経時的な変更の性質は、ほとんどのユーザーモードコードが経験する変更の性質とはまったく異なります。

これは、たとえば、新しい統合IOチップが実装された場合に変更されるものです。その場合、変更は、変更されたレジスタに対応するために既存のコードを変更するのではなく、コピー&ペーストして新しいコピーを変更する可能性があります。

+0

ありがとう、それは有益かつ有用でした。 –

1

まず、さまざまなクラスの定数を定義します。このコードが寒くなると、それはスイッチングのための謎です。切り替えが名前付き定数に反する場合、私は出発点を持っていました。

更新:ケースがMAJOR_0C_EXCPを返すところで約70行を取り除くことができます。単純にそれらがルーチンの最後まで落ちるようにします。これはカーネルコードなので、特にケースオーダーが既に最適化されている場合はパフォーマンス上の問題があるかもしれませんが、対処する必要があるコードの量は少なくて済むでしょう。

1

ここでは規則性がありますが、私はドメイン専門家にとってこれは実際に非常に一貫していると考えています。

また、近くに近接したバリエーションを持つことで、すぐに目視検査が可能です。

このコードをリファクタリングする必要はありません。

関連する問題