ユーザー空間プログラムでドライバ機能を呼び出す方法(ドライバを正しく登録したと仮定)

ユーザー空間プログラムでドライバ機能を呼び出す方法(ドライバを正しく登録したと仮定)

私の質問は絶望的にアマチュアのように見えると思います。しかし、私は最近Linuxを真剣に使い始めており、この非常に簡単な質問に対する明確な答えを見つけることができませんでした。この投稿の下部にいくつかの追加の質問があります。

ユーザー空間プログラムで(適切なシステムコールを使用して)ドライバ固有の機能実装を呼び出す方法を知りたいです。正しいコード行を探しています。ドライバに割り当てられているプラ​​イマリデバイス番号とマイナーデバイス番号があり、/ devや他のディレクトリに適切なファイルがあると想定できます。必要なコードは次のとおりです。

system_call(major number, minor number, function ID, parameters, more parameters);

ちなみに、以下はMadieuの本(LDD3)からそのままコピーした私のドライバinit()コードです。

static int __init my_init(void)
{
int i;
dev_t curr_dev;

/*Kernel EEP_NBANK devices*/
alloc_chrdev_region(&dev_num, 0, number_of_lanes, DEVICE_NAME);
/*Create device class*/
driver_class = class_create(THIS_MODULE, DEVICE_CLASS);
/*this loop is sort of overkill, but you could change NUMBER_OF_DEVICES
so I'll use the loop just in case someone meddles with my source*/
for(i=0;i<number_of_lanes;i++){
    cdev_init(&driver_cdev[i], &driver_fops);
    driver_cdev[i].owner = THIS_MODULE;
    curr_dev = MKDEV(MAJOR(dev_num), MINOR(dev_num)+i);
    cdev_add(&driver_cdev[i], curr_dev, 1);
    device_create(  driver_class,
            NULL,
            curr_dev,
            NULL,
            DEVICE_NAME "%d",i);
}
return 0;
}

ご覧のとおり、私は少なくともその本に従ってプログラムにアクセスするために必要な4つのステップを完了しました。私はfile_Operations構造、cdev構造などを正しく実装したと仮定できます。また、プロトタイプを持つフォームの読み取りまたは書き込み機能を実装したと仮定することもできます。

ssize_t (*write)(struct file *filp, const char __user *buf, size_t count, loff_t *pos)

読み取りも同じですが、(*書き込み)の代わりに(*読み取り)を使用します。それでは、*filp(暗黙的でカーネルが私に適している)、* buf(ユーザー空間で渡されると仮定)、count(ユーザー空間で渡されると仮定)、および*の正しい値をどのように取得できますか? * pos(再びユーザー空間から渡すと仮定します)、特定のドライバに対してユーザー空間でこれらの関数をどのように呼び出すことができますか?

質問が十分に明確であることを願っていますが、説明が必要な場合は、今後数日間感染症に苦しむでしょう。ありがとうございます。

ベストアンサー1

おすすめ記事