13

カーネル開発の学習を始めたばかりで、少し疑問がありました。cライブラリとリンクした後、カーネル開発でc関数を使用できないのはなぜですか?printk()カーネルがacライブラリにリンクされていないのに、の代わりにいくつかの標準c関数の独自の実装があるのはなぜですかprintf()。カーネルがcで記述され、acコンパイラを使用してコンパイルされている場合、cライブラリの標準関数を使用できないのはなぜですか?

4

1 に答える 1

22

おなじみのGNUCライブラリは、カーネルモードではなく、ユーザーモードで実装されているためです。カーネルはユーザースペースAPIにアクセスできません(Linuxカーネルへのシステムコールを呼び出す可能性があります)。

KernelNewbiesFAQから

カーネルでライブラリ関数を使用できますか?

ユーザースペースプログラマーが通常利用できるシステムライブラリー(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

于 2012-11-21T02:07:18.677 に答える