리눅스 커널 모듈 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 번 읽을 수도 있고 때로는 훨씬 더 읽을 수도 있습니다.
쓰기 함수 핸들이 유효합니다. 하나의 쓰기 명령이 실패하면 모두 다음 명령도 실패합니다. &을 닫으면 장치가 다시 열리고 (응용 프로그램 내부에서) 쓰기가 임시로 수정됩니다.
읽기 명령에도 동일한 동작이 있습니다.
아이디어가 있으십니까? 0 대신 드라이버 코드가
static ssize_t fWrite(struct file *file, const char *buffer, size_t length, loff_t *offset)
{
printk(KERN_ERR "INSIDE\n");
return length;
}
드라이버의 기능에 fwrite()를 호출 길이 –
fWrite() 충분하지 않습니까? 운전자는 꽤 길며 내부에 몇 가지 노하우/상업용 민감 부품이 있습니다. 어떤 부분이 필요합니까? – Tobias
내부 파일 포인터가 유효합니까? 코드에서 어떤 경쟁 조건으로 인해 손상 되었습니까? –