我注意到,當我在我的塊設備驅動程序文件(/ dev/mybd)上調用lseek64時,它總是失敗。 (我可以打開,在/ dev/mybd上讀寫)。lseek64是否會引發任何設備特定的操作?
但是,如果我可以在/ dev/sdb上使用相同的參數lseek64,它是一個SATA磁盤,它總是成功。
lseek是否需要任何塊設備支持?或者它是一個純粹的內核功能?
我注意到,當我在我的塊設備驅動程序文件(/ dev/mybd)上調用lseek64時,它總是失敗。 (我可以打開,在/ dev/mybd上讀寫)。lseek64是否會引發任何設備特定的操作?
但是,如果我可以在/ dev/sdb上使用相同的參數lseek64,它是一個SATA磁盤,它總是成功。
lseek是否需要任何塊設備支持?或者它是一個純粹的內核功能?
看代碼,默認尋求塊設備是在fs/block_dev.c
:
static loff_t block_llseek(struct file *file, loff_t offset, int origin)
{
struct inode *bd_inode = file->f_mapping->host;
loff_t size;
loff_t retval;
mutex_lock(&bd_inode->i_mutex);
size = i_size_read(bd_inode);
retval = -EINVAL;
switch (origin) {
case SEEK_END:
offset += size;
break;
case SEEK_CUR:
offset += file->f_pos;
case SEEK_SET:
break;
default:
goto out;
}
if (offset >= 0 && offset <= size) {
if (offset != file->f_pos) {
file->f_pos = offset;
}
retval = offset;
}
out:
mutex_unlock(&bd_inode->i_mutex);
return retval;
}
沒有調用特定的塊設備。唯一特別的要求是i_size_read
,這只是一些SMP魔術。
lseek是一個系統調用。它是內核特定的。您必須爲您的設備實現此功能,並且應該在llseek調用中添加設備驅動程序的「file_operations」結構。
在file_operation結構中,所有與設備相關的函數都將與相關的系統調用進行映射。像讀取,寫入,打開所有將與特定的設備驅動程序代碼鏈接。因此,無論何時調用這些函數,內核都會運行與該調用鏈接的設備驅動程序代碼。如果設備驅動程序從不實現一個調用,則相應的值將被指定爲NULL。在這種情況下,如果您調用NULL指定的調用,則調用將始終失敗。
但在lseek中,如果'file_operations'結構鏈接爲NULL,則內核將在'file'結構指針指向文件位置。這可能會產生不可預知的結果。但無論如何,這個調用將起作用(根據o'relley出版物的Linux設備驅動程序)。
所以我不確定這裏真正的問題是什麼。所以如果你還沒有真正實現lseek調用,那麼再次實現並嘗試它。
是的。你嘗試了什麼? – 2012-03-05 09:09:16
@BasileStarynkevitch那麼我應該怎麼做才能讓我的設備驅動程序支持lseek? – yangsuli 2012-03-05 09:13:32
我不是內核專家。你讀過http://www.makelinux.net/ldd3/chp-16-sect-2 – 2012-03-05 09:17:53