블록 장치 드라이버 파일 (/ dev/mybd)에서 lseek64를 호출하면 항상 실패합니다. (나는/dev/mybd ok에서 읽고 읽고 쓸 수있다).lseek64에 장치 별 조치가 있습니까?
그러나 sata 디스크 인/dev/sdb에서 동일한 인수로 lseek64를 사용할 수 있으면 항상 성공합니다.
lseek에 블록 장치가 필요합니까? 아니면 순수한 커널 함수입니까? 코드를 보면
블록 장치 드라이버 파일 (/ dev/mybd)에서 lseek64를 호출하면 항상 실패합니다. (나는/dev/mybd ok에서 읽고 읽고 쓸 수있다).lseek64에 장치 별 조치가 있습니까?
그러나 sata 디스크 인/dev/sdb에서 동일한 인수로 lseek64를 사용할 수 있으면 항상 성공합니다.
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 출판사에서 리눅스 장치 드라이버 당) 작동합니다.
그래서 실제 문제가 무엇인지 잘 모르겠습니다. 따라서 lseek 호출을 아직 구현하지 않았다면 구현하고 다시 시도하십시오.
예. 너 무슨 짓을 한거야? –
@BasileStarynkevitch 그렇다면 장치 드라이버를 지원하기 위해 어떻게해야합니까? – yangsuli
저는 커널 전문가가 아닙니다. 읽었습니까 http://www.makelinux.net/ldd3/chp-16-sect-2 –