2017-12-06 26 views
0

리눅스 커널 모듈 char 장치 (SuSE 13.2 Kernel 3.16.6)와이 장치를 사용하기위한 응용 프로그램을 작성했습니다.커널 모듈에 대한 액세스

원칙적으로 드라이버, 응용 프로그램 및 통신이 작동합니다. 응용 프로그램은 char 장치를 열고 읽고 쓰고 닫을 수 있습니다.

그러나 때때로 응용 프로그램이 모듈의 쓰기 기능에 대한 참조를 '잃어 버렸습니다'라는 간헐적 인 문제가 있습니다. 응용 프로그램에서 모듈로 3 - 4 (언젠가는 훨씬 더 많은) 명령을 쓰면 모듈의 쓰기 기능이 실행되지 않습니다.

I는 감소 및 기록 모듈 내부 기능 :

int main (int argc, char **argv) 
{ 
    unsigned short buffer=0xffff; 
    fd = open ("/dev/MYPCI" , O_SYNC | O_RDWR); 
    OUTPW (0, buffer ,fd); 
    OUTPW (2, buffer,fd); 
    OUTPW (4, buffer,fd); 
    OUTPW (196, buffer,fd); 
    OUTPW (70000, buffer,fd); 
    OUTPW (400, buffer,fd); 

    printf("DEV-Handle: %d\n", fd); 
    close (fd); 
} 

int OUTPW (unsigned short ByteAddr, unsigned short value, int fd) 
{ 
    int x; 
    int size = (ByteAddr/2) <<16; 
    size +=2;    

    printf ("\nByteAddr:0x%08hX value:0x%08hX size:0x%08hX WRITE-Handle: 0x%04hX\n" , ByteAddr,value,size, &write); 

    x= write(fd, &value, size) ; 

    return x; 
} 

출력이 loke 같습니다

static ssize_t fWrite(struct file *file, const char *buffer, size_t length, loff_t *offset) 
{ 
    printk(KERN_ERR "INSIDE\n"); 
    return 0; 
} 

그리고 또한 applcation 감소. 언젠가는 3 번 읽을 수 있지만 언젠가는 4 번 읽을 수도 있고 때로는 훨씬 더 읽을 수도 있습니다. screenshoot of outputs

쓰기 함수 핸들이 유효합니다. 하나의 쓰기 명령이 실패하면 모두 다음 명령도 실패합니다. &을 닫으면 장치가 다시 열리고 (응용 프로그램 내부에서) 쓰기가 임시로 수정됩니다.

읽기 명령에도 동일한 동작이 있습니다.

아이디어가 있으십니까? 0 대신 드라이버 코드가

static ssize_t fWrite(struct file *file, const char *buffer, size_t length, loff_t *offset) 
{ 
printk(KERN_ERR "INSIDE\n"); 
return length; 
} 
+0

드라이버의 기능에 fwrite()를 호출 길이 –

+0

fWrite() 충분하지 않습니까? 운전자는 꽤 길며 내부에 몇 가지 노하우/상업용 민감 부품이 있습니다. 어떤 부분이 필요합니까? – Tobias

+0

내부 파일 포인터가 유효합니까? 코드에서 어떤 경쟁 조건으로 인해 손상 되었습니까? –

답변

0

?