カーネル開発の学習を始めたばかりで、少し疑問がありました。cライブラリとリンクした後、カーネル開発でc関数を使用できないのはなぜですか?printk()
カーネルがacライブラリにリンクされていないのに、の代わりにいくつかの標準c関数の独自の実装があるのはなぜですかprintf()
。カーネルがcで記述され、acコンパイラを使用してコンパイルされている場合、cライブラリの標準関数を使用できないのはなぜですか?
1 に答える
おなじみのGNUCライブラリは、カーネルモードではなく、ユーザーモードで実装されているためです。カーネルはユーザースペースAPIにアクセスできません(Linuxカーネルへのシステムコールを呼び出す可能性があります)。
カーネルでライブラリ関数を使用できますか?
ユーザースペースプログラマーが通常利用できるシステムライブラリー(glibc、libreadline、libproplistなど)は、カーネルプログラマーは利用できません。プロセスがロードされているとき、ローダーは依存するライブラリをプロセスのアドレス空間に自動的にロードします。カーネルプログラマーはこのメカニズムを利用できません。ISOCライブラリを忘れてください。利用できるのは、カーネルにすでに実装(およびエクスポート)されているものと、自分で実装できるものだけです。
ライブラリをカーネルで動作するように「変換」することが可能であることに注意してください。ただし、それらはうまく適合せず、プロセスは面倒でエラーが発生しやすく、スタック処理に重大な問題が発生する可能性があります(カーネルは少量のスタックスペースに制限されていますが、ユーザースペースプログラムにはこの制限がありません)ランダムなメモリ破損を引き起こします。
一般的に要求される機能の多くは、カーネルにすでに実装されており、ユーザーランドの対応する機能ほど機能的でない「軽量」バージョンで実装されている場合もあります。独自のバージョンを最初から作成する前に、使用できる可能性のある関数のヘッダーを必ずgrepしてください。最も一般的に使用されるもののいくつかは、include / linux/string.hにあります。
ライブラリ関数が必要だと感じるときはいつでも、設計を検討し、代わりにコードの一部またはすべてをユーザースペースに移動できるかどうかを自問する必要があります。
標準ライブラリの関数を使用する必要がある場合は、単純な理由でその機能を再実装する必要があります。標準Cライブラリはありません。
Cライブラリは、基本的にLinuxカーネル(または他のオペレーティングシステムのカーネル)の最上位に実装されています。
たとえば、Cライブラリのmkdir(3)関数は、基本的にLinuxカーネルのシステムコールmkdir(2)のラッパーにすぎません。
http://linux.die.net/man/3/mkdir http://linux.die.net/man/2/mkdir