両方のプロセスが同時に文字デバイスファイルに書き込むときに何が起こるかを知りたいです。現在最大の関心事はRaspberry piの/dev/spidev0.0です。
ドライバのタスクが同時書き込みを処理することであると仮定すると、ドライバはどのプロセスがどのデータを書き込んでいるかを知ることができますか?それとも、ドライバはすべての並行書き込みが混在している連続したデータストリームを表示しますか?
答え1
Linux 5.4.97カーネルのソースコードを見ると、次のようなものが表示されますdrivers/spi/spidev.c
。そのファイルには書き込み要求を処理する関数があります。
ssize_t
spidev_write(struct file *filp, const char __user *buf,
size_t count, loff_t *f_pos)
{
struct spidev_data *spidev;
ssize_t status = 0;
unsigned long missing;
/* chipselect only toggles at start or end of operation */
if (count > bufsiz)
return -EMSGSIZE;
spidev = filp->private_data;
mutex_lock(&spidev->buf_lock);
missing = copy_from_user(spidev->tx_buffer, buf, count);
if (missing == 0)
status = spidev_sync_write(spidev, count);
else
status = -EFAULT;
mutex_unlock(&spidev->buf_lock);
return status;
}
mutex_lock()
との呼び出しを参照してくださいmutex_unlock()
。文字デバイスを呼び出すプロセスは、write()
ミューテックスを取得し、すべてのデータを書き込み、ミューテックスのロックを解除します。このプロセス中に他の作成者が登場すると、その作成者はmutex_lock()
既存の作成者が呼び出すまでその作成者への呼び出しをブロックしますmutex_unlock()
。
すべてのライター書き込みは、他のライターとインタリーブせずにフルバッファ書き込みを保証します。