私は最近これをよく研究しており、さまざまな記事やスタックオーバーフローの投稿を調べましたが、明確な答えが見つからないようです. カーネルモジュールを作成するとき、私はほとんどのコードが次のようになっているのを見てきました:
#include <linux/init.h>
static int test_init(void) {return 0;}
static void test_exit(void) {;}
module_init(test_init);
module_exit(test_exit);
私が見つけた考えられる理由の 1 つは、これを行うと、実行中のモジュールに悪意のあるコードを挿入することが難しくなるということです。
もう 1 つは、名前空間の乱雑さを軽減することですが、それは、リンクしてコンパイルしているカーネル モジュールのコンテキストでのみ問題になるのではないでしょうか? 実際に ld のようにコードをカーネルにリンクすると
insmod
、名前の衝突がシステムを台無しにすることがわかります。これが理由ですか?
他の理由は考えられません。慣習をやみくもに使い始める前に、これを明確にしたいと思います。
前もって感謝します