カーネル モードでプログラムを実行すると、標準 C ライブラリの使用が禁止されます。これは、プログラムがリンクされるのはカーネル自体だけだからです。そのため、カーネルで定義された関数を使用することは許可されています。ただし、カーネル自体は C で記述され、特定のアーキテクチャ用にコンパイルされたプログラムです。また、C 標準ライブラリを使用するべきではありませんが、ドライバーはロード可能なモジュールであるため、ドライバーも使用すべきではありません。そこで、私の質問は、カーネルを記述するときに実際にどの C 関数が使用されるかということです。カーネルを介さずにハードウェアと対話するにはどうすればよいですか。ソースを見るように言わないでください。それは私にとってはレベルが高すぎます。ありがとうございます。
答え1
Unixカーネルには伝統的にいくつかのアセンブリ言語コード。最近はソースコードを見ていませんが、まだそうだと思います。
見るドライバーは実際にどのようにハードウェア デバイスと通信するのでしょうか? そのトピックの概要については、この質問に対する回答を参照してください。この質問に対する回答では、2種類のコンピュータアーキテクチャについて説明しています。ポートマップI/O(PMIO)を使用するシステムでは、カーネルはしなければならないアセンブリ言語で部分的に記述することもできますが、非常に短いルーチンをいくつか記述するだけで済む場合もあります。メモリマップド I/O (MMIO) を使用するシステムでは、デバイス ドライバーもすべて C で記述できます。必要なのは、ポインターを宣言し、それをデバイスの仮想アドレスに設定し、それを使用して、メモリにアクセスするのと同じようにデバイスを操作することだけです。
答え2
すべてのドライバーがロード可能なモジュールであるわけではありません。ロード可能であることは単なるオプションですが、一部の重要なドライバーは動的にロードされず、カーネルの一部です。
答え3
カーネルは、libc によって提供される機能のすべてをカーネル内で静的に再現します。
ユーザー モードの C プログラミングと同様に、関数を 1 つのコンパイル ユニットで定義し、別のユニットでそれを参照するだけで (通常はヘッダー ファイル経由で)、コンパイラはそれを未定義の参照にし、リンカーはそれを実際にシンボルを提供するコンパイル ユニットにリンクします。
カーネルモジュールのロードは、動的読み込みここで説明されています: http://www.tldp.org/LDP/tlk/modules/modules.html