device driver 공부중인 학생인데, ioctl 관련 질문입니다.
글쓴이: yaeho12 / 작성시간: 수, 2015/12/09 - 2:59오후
fnd, dot 디바이스 드라이버를 통합해서 사용하기 위해
write함수를 ioctl 함수를 안에넣고 사용하려고 하는데,
make와 모듈적재는 문제없이 되고, fnd_clear는 정상작동하는데, fnd_write(a)의 경우 입력한 데이터가 fnd에 출력되지 않습니다.
write문을 저렇게 바꾸면 안되는건가요.
도움을 청합니다.
편의상 코드는 잘라서 올렸습니다.
//디바이스 드라이버
#define FND_CSX fnd 메모리주소 unsigned char disp[8] = {0}; int fnd_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { char[8] a=arg; switch(cmd) { case 1:fnd_clear(); case 2:fnd_write(a); break; default: break; } return 0; } //static ssize_t fnd_write (struct file *filp, const char *buf, size_t count, loff_t *f_pos) ssize_t fnd_write (const char *buf) { int i; i=1; get_user(disp, (unsigned char*)buf); //copy_from_user(disp, buf, count); //printk( "write data %x \n", disp[5]); for(i =1; i <= MAX_FND; i++){ switch(i) { case 1: FND_CS7 = disp[0]; break; case 2: FND_CS6 = disp[1]; break; case 3: FND_CS5 = disp[2]; break; case 4: FND_CS4 = disp[3]; break; case 5: FND_CS3 = disp[4]; break; case 6: FND_CS2 = disp[5]; break; case 7: FND_CS1 = disp[6]; break; case 8: FND_CS0 = disp[7]; break; default : break; } } return 0; } static struct file_operations fnd_fops = { .open =fnd_open, //.write =fnd_write, .release =fnd_release, .ioctl =fnd_ioctl, };
// 테스트프로그램
int main() { int n=0; int count=0; int dev=0; int len=0; int i=0; unsigned char buf[MAXFND+1]="7\0"; unsigned char new_buf[MAXFND+1]; dev = open( fnd_dev, O_RDWR); while(1) { memset(buf, 0, sizeof(buf)); memset(new_buf, 0, sizeof(new_buf)); i=0; printf("##########################################\n"); printf(" FND TEST\n"); printf(" press any numbers\n"); printf(" 'q' to exit \n"); printf("#########################################\n"); len=strlen(buf); for(n=MAXFND-len+1;n<MAXFND;n++) { new_buf[n]=asc_to_fnd( (buf[i]-48 )); i++; } usleep(2000000) ioctl(dev, 2, new_buf);// 이부분에서 출력이 안됩니다. 혹시 몰라 2초의 딜레이 추가후 입력되도록 해보았는데 결과가 마찬가집니다. }
Forums:
아래에서 값이 제대로 대입이 될까요? arg가
아래에서 값이 제대로 대입이 될까요? arg가 pointer로 넘겨주는 것 같은데. 메모리 복사를 해야하지 않나요???
그럼 메모리 카피를 이용해서 하면 해결이 될까요??
그부분 말고는 다른데 문제되는부분은 없을까요??
taeho
'그 부분'은 가독성을 떨어뜨리는 것 외의 다른
'그 부분'은 가독성을 떨어뜨리는 것 외의 다른 문제는 없을 정도로 아무 가치 없는 코드라서, 의도하셨던 하지 않으셨던 간에 별 문제는 없습니다.
아마도 컴파일러에 의해 제거되리라 생각됩니다.
get_user(dest, src_ptr) 은 pagefault handler 가 준비된다는 것을 빼면 memcpy(&dest, src_ptr, sizeof(*src_ptr)) 과 결과가 같습니다.
따라서 sizeof(*(unsigned char *)) 만큼만 복사됩니다.
노파심에...
get/put_user() 와 memcpy() 가 가장 크게 다른 점은 4 바이트(32bit arch), 혹은 8바이트(64bit arch) 이상은 취급하지 않는다는 것이고,
memcpy 와는 달리 각 arch 가 가지고 있는 가장 효율적인 1byte, 2byte, 4byte, 8byte 복사 instruction 을 사용해서 C 의 기본 type 인 char, short, int, long 에 대응하기 위한 목적으로 만들어졌기 때문입니다.
여기에 pagefault handler 를 추가해서 swap-out 되버린 상황이나 fork-clone 때의 COW 상황을 대비하는 것은 copy_to/from_user() 와 마찬가지입니다.
디바이스를 전문으로 하시는 곳을 찾아보는것이 좋겠습니다.
리눅스 디바이스 드라이버
http://search.naver.com/search.naver?ie=utf8&sm=stp_hty&where=se&query=%EB%A6%AC%EB%88%85%EC%8A%A4+%EB%94%94%EB%B0%94%EC%9D%B4%EC%8A%A4+%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84
http://www.google.co.kr/search?q=%EB%A6%AC%EB%88%85%EC%8A%A4+%EB%94%94%EB%B0%94%EC%9D%B4%EC%8A%A4+%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84&hl=ko&biw=&bih=&gbv=2&oq=%EB%A6%AC%EB%88%85%EC%8A%A4+%EB%94%94%EB%B0%94%EC%9D%B4%EC%8A%A4+%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84&gs_l=heirloom-serp.12..0l10.52216.52216.0.52930.1.1.0.0.0.0.166.166.0j1.1.0....0...1ac.1.34.heirloom-serp..0.1.165.hknyx29Qu9M
http://book.naver.com/search/search.nhn?sm=sta_hty.book&sug=&where=nexearch&query=%EB%A6%AC%EB%88%85%EC%8A%A4+%EB%94%94%EB%B0%94%EC%9D%B4%EC%8A%A4+%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기