0

こんにちは、ユーザー空間から次の関数を呼び出す/実行する方法を知りたいです。

static ssize_t lm70_sense_temp(struct device *dev,
        struct device_attribute *attr, char *buf)

{ //何らかのコード . . status = sprintf(buf, "%d\n", val); /* 摂氏ミリ度 */ . . //いくつかのコード}

この関数は、Linux ソースの kernel/drivers/hwmon フォルダーにある lm70.c ドライバーで定義されていますか? この関数の内部変数の値をユーザー アプリケーションに渡すことはできますか? 上記の関数で val 変数の値を取得したいのですが...

4

3 に答える 3

1

カーネルの内部はよくわかりません。ただし、lm70_sense_tempカーネル ソース ツリー全体で grep を実行したところ、ファイルにのみ表示されlinux-3.7.1/drivers/hwmon/lm70.c、最初は静的関数として、次にDEVICE_ATTR.

それから私はグーグルで検索しlinux kernel DEVICE_ATTR、すぐにdevice.txtを見つけました。これは、sysfsを介して、つまり/sys. sysfs-rules.txt を読む; したがって、ユーザーアプリケーションは、おそらく関連するものを以下で読み取ることができます/sys/

私がしたように数分で検索できたと思うので、あなたの質問に反対票を投じています(そして私はカーネルの専門家ではありません)。

于 2013-01-02T08:27:10.133 に答える
0

ユーザー空間から直接ドライバー関数を呼び出すことはできません。

その関数がEXPORT_SYMBOLorでエクスポートされる場合EXPORT_SYMBOL_GPL、単純なカーネル モジュールを記述して、その関数を直接呼び出すことができます。結果は、FIFO または共有メモリを介してユーザー空間に送信できます。

しかし、あなたの場合、この関数はエクスポートされません。したがって、このようにしてはいけません。

于 2013-01-03T09:02:09.890 に答える