私は、常にドライバの小さなバッファにデータをプッシュしている外部デバイスがあるとします。私は、割り込みハンドラが待っているユーザプロセスを起動させる待機キューを使用しています(LDD(第3版) - ハンドラの実装に似ています)。Linuxデバイスドライバのバッファリング方法
irq_handler_t irq_handler(int irq, void *dev_id, struct pt_regs *regs)
{
flag = 1;
wake_up_interruptible(&wq);
return IRQ_HANDLED;
}
ssize_t my_read(struct file *dev, char __user *buf, size_t count, loff_t *f_pos)
{
wait_event_interruptible(wq, flag != 0);
flag = 0;
copy_to_user(usr_buf, drv_buf, count);
}
/***********************User program***********************/
while(1)
{
read(fid, buffer, size);
//do stuff with data
}
ユーザプログラムはreadを呼び出し、割り込みが外部デバイスから新しいデータを取得するまで待機します。外部デバイスはこのコードが実行できるよりも速くデータをプッシュする可能性があるため、ユーザプログラムがデータをコピーする前にデータを上書きしないようにするためにどのようなメカニズムを使用できますか?構造のようなリングバッファはここで動作しますか?その実装方法は不明です。
ありがとうございました
drv_bufはどのようにデータを取得しますか? copy_to_user(usr_buf、drv_buf、count)は、copy_to_user(buf、drv_buf、count)である必要があります。 –
* "ユーザープログラムがコピーする前にデータを上書きしないようにするために、どのようなメカニズムを使用できますか?" - 基本的に、ドライバはバッファオーバーランが発生するまで、できるだけ多くのバッファを格納できます。答えに提案されているように(静的に割り当てられた)リングバッファは、(リング)バッファがアンダーサイズである場合にのみオーバーランを延期することができます。よく書かれたドライバーは、そのような状態を検出し報告することができます。動的に割り当てられたバッファでさえ、「遅い」読者に対処するには不十分かもしれません。 IOWでは、ユーザー空間が少なくとも平均レートの到着データに追いつくことができるようにする必要があります。 – sawdust