2012-04-28 11 views
3

数年前に私はブログを読んでいました(今、リンクは忘却の中で失われています)、私の以前の組織のファームウェアのためのパッチを開発する際に関数ポインタを多用している例を見てきました。関数ポインタを使用してCでファームウェアパッチを作成しますか?

セキュリティ上の理由から/ NDAが署名したため、コードのコピーを取ることができませんでした(私はこれをやっておらず、ベストプラクティスに従うことを誇りに思います)。

私は、関数のようないくつかの命名規則でコーディングされていることを見てきました:(パッチの一部)コード化され

filename_func_<version>_<minor_string>(arguments,other arguments) 

と同様のファイルとROMに点滅し、関数が呼び出されたときには、アドレスを取りますパッチの場所からの関数の新しい定義の。

これに関するアイデアや詳細は?

+1

なぜですか?どのような問題を解決しようとしていますか? –

+0

関数ポインタの実用化と効率的な使用を私が念頭に置いています。 – Raulp

答えて

1

このシステムを設計する必要があります。

調整されなければならないさまざまな側面があります。

  • 関数ポインタを変更する方法がなければならないが。
  • コードは、ポインタを介して関数を呼び出さなければなりません。

詳細には複数の方法がありますが、最終的にはテーマにバリエーションがあります。あなたはfilename_func_1_1()filename_func_1_2()の両方が同じファイルで宣言されていませんかもしれません

/* Declaration of function pointer used to invoke the function */ 
extern int (*filename_func_ptr)(int arg1, char const *arg2); 

/* Two versions of the function */ 
extern int filename_func_1_1(int arg1, char const *arg2); 
extern int filename_func_1_2(int arg1, char const *arg2); 

/* Definition of function pointer - pointing to version 1.1 of the function */ 
int (*filename_func_ptr)(int arg1, char const *arg2) = filename_func_1_1; 

/* Use of function pointer */ 
static void some_function(void) 
{ 
    printf("%d\n", (*filename_func_ptr)(1, "pi")); 
} 

注意。私が描いている効果は「まるで」のようです。あなたは、これが書かれていたかのように

あなたが選ぶあらゆる手段によって、パッチ適用後、結果は次のとおりです。

int (*filename_func_ptr)(int arg1, char const *arg2) = filename_func_1_2; 

あなたは、新しいシンボルを取得するために動的ローディング(dlsym()、プラスdlopen()など)の問題に得ることができます。ライブラリを動的にロードするためのファイル名と、関数名を正しい関数へのポインタに変換する方法が必要です。

各パッチ可能な関数は、ポインタを通じて一様に呼び出す必要があります。これにより、関数を置き換えることができます。ダイナミック(共有)ライブラリで十分であるかどうかを検討してください(おそらくもっと簡単なので)。ファームウェアを使用している場合、おそらくその贅沢はありません。

多様なインターフェイスを持つ複数の機能をどのように処理するかを検討する必要があります。ここに示すような単一のグローバル変数、または各呼び出しで適切にキャストされなければならないいくつかのジェネリック関数のポインタ型、またはユニオン型、またはポインタを保持する構造体を使用しますか?物事を整理する方法はたくさんあります。

関連する問題