カーネルモードでプログラムを実行すると、標準Cライブラリは使用できません。プログラムがリンクする唯一のターゲットはカーネル自体だからです。したがって、カーネルで定義された関数を使用できます。ただし、カーネル自体はCで書かれ、特定のアーキテクチャ用にコンパイルされたプログラムです。 C標準ライブラリを使用してはいけませんが、ドライバもロード可能なモジュールなので、どのドライバも使用しないでください。だから私の質問は、カーネルを書くときに実際にどのC関数が使用されますか?カーネルを介さずにハードウェアと対話する方法は?ソースを確認するように言わないでください。これは私にとってとても新しいです、TY。
答え1
Unixカーネルは伝統的に次のもので構成されています。一部アセンブリ言語コード。最近はソースコードを見たことはありませんが、これはまだ本当だと思います。
バラよりドライバは実際にハードウェアデバイスとどのように通信しますか? このトピックの概要を見てください。この質問に対する答えは、2つのコンピュータアーキテクチャについて説明します。ポートマッピングI / O(PMIO)を使用するシステムでは、カーネル〜しなければならない一部はアセンブリ言語で書かれていますが、いくつかの非常に短いルーチンを使用して実行することもできます。 MMIO(メモリマッピングI / O)を使用するシステムでは、デバイスドライバも完全にCで書くことができます。彼らがしなければならないのは、ポインタを宣言し、それをデバイスの仮想アドレスと同じに設定してから、メモリにアクセスするかのようにデバイスを操作するためだけに使用することです。
答え2
すべてのドライバはロード可能なモジュールではなく、ロード可能はオプションですが、一部の主要ドライバは動的にロードされず、カーネルの一部です。
答え3
カーネルはlibcが提供する完全な機能セットを独自に静的に再現します。
ユーザーモードCプログラミングと同様に、関数は1つのコンパイル単位で定義することができ、他の単位は単に参照することができます(通常はヘッダファイルを介して)。コンパイラはそれを未定義の参照にし、リンクはそれをリンクします。実際にシンボルを提供するコンパイル単位に。
カーネルモジュールのロードがどのように機能するかは次のとおりです。動的ローディング説明は次のとおりです。 http://www.tldp.org/LDP/tlk/modules/modules.html