1

Linux ドライバーを freebsd に移植しています。「filp->private_data」変数を使用して、ドライバーに必要な情報を保存します。(マルチスレッドの場合にロックを回避するため)。BSD は Linux で「ファイル」構造を使用せず、代わりに cdev を使用することがわかりました。cdev には「private_data」変数がありません。しかし、BSDには他の変数が必要だと思いますか?

私がやろうとしていることを達成する方法を知っている人はいますか。

ありがとう。

4

1 に答える 1

4

デバイスのインスタンスごとに、softc 構造体のインスタンスがあります。通常、これにはミューテックスがあります。si_drv1のメンバを使用cdevして、ポインタを に戻すことができますsoftc。何かのようなもの:

struct mydev_softc {
    struct mtx m_lock;
    struct cdev* m_cdev;
    device_t m_dev;
    /* ... whatever else you need ... */
};

static int mydev_attach(device_t dev)
{
    struct mydev_softc* sc = device_get_softc(dev);

    mtx_init(&sc->m_lock);
    sc->m_cdev = make_dev(...);
    sc->m_cdev->si_drv1 = sc;
    sc->m_dev = dev;
    /* Plus whatever else you need */
 }

この部分を見ることができるように、他のドライバーの初期化に関するものはすべて省略しています。

于 2013-03-19T03:27:42.797 に答える