3
我寫了一個小驅動程序來讀取一些數據並將其提供給用戶。我的驅動程序可以被多個應用程序使用,即它是一個可重入驅動程序,因此使用自旋鎖。但我發現copy_to_user
不應該被稱爲與自旋鎖持有。在以下代碼中爲char_device_buf
爲共享數據;我必須保護它。除互斥體之外是否有任何機制使用自旋鎖並使用copy_to_user
?如果需要調用copy_to_user,如何使用旋轉鎖定?
static ssize_t char_dev_read(struct file *file,
char *buf,
size_t lbuf,
loff_t *ppos)
{
int maxbytes; /* number of bytes from ppos to MAX_LENGTH */
int bytes_to_do; /* number of bytes to read */
int nbytes; /* number of bytes actually read */
maxbytes = MAX_LENGTH - *ppos;
if(maxbytes > lbuf) bytes_to_do = lbuf;
else bytes_to_do = maxbytes;
if(bytes_to_do == 0) {
printk("Reached end of device\n");
return -ENOSPC; /* Causes read() to return EOF */
}
/* Tesing for accidental release */
// accidental_release();
printk(KERN_DEBUG "READER: trying for critical region lock \n");
spin_lock(&myspin);/*begin of critical region */
printk(KERN_DEBUG "READER : acquired lock: executing critical code\n");
nbytes = bytes_to_do -
copy_to_user(buf, /* to */
char_device_buf + *ppos, /* from */
bytes_to_do); /* how many bytes */
spin_unlock(&myspin); /* end of critical region */
*ppos += nbytes;
return nbytes;
}
在多處理器中,進程B將有機會在其他處理器上執行。因此,系統不會停止。一旦頁表正確加載,它將從睡眠中出來,代碼將被正確執行。我在這裏看不到多處理器上的任何問題。無論如何,自旋鎖在單處理器中無用,因爲我們都知道這一點。我不明白在多處理器上的例子sleep()的缺點。你可以在多處理器環境中拋出問題嗎? –
在多處理器上,你可能遇到同樣的問題。假設進程A在保持螺旋鎖的同時被調度出來。現在,調度程序可以將任何任務放在任何CPU上。假設它無意中安排所有的CPU運行一些恰好鎖定該自旋鎖的代碼,那麼你會遇到死鎖,因爲原來的線程永遠不會被喚醒釋放它。在等待螺旋鎖的CPU上不會發生調度。 'copy_to_user'示例只是需要調度程序休眠的情況的一個示例。對於任何其他情況下,您持有自旋鎖,然後安排 - 您可能會陷入僵局。 –