커널 모듈(character 디바이스 드라이버) 프로그래밍중 궁금한 점입니다.
글쓴이: hitman7 / 작성시간: 화, 2006/08/22 - 4:05오후
우선 아래와 같은 코드를 작성하였습니다.
(다른 부분의 코드들은 생략하였으며, 프로그램을 실행시키는데는 아무런 문제가 없었습니다. 커널은 2.4.20입니다.)
struct file_operations fops={ .write=d_write } static ssize_t d_write(struct file* file,const char* buf,size_t length,loff_t* offset) { printk(KERN_INFO "device write\n"); return 0; }
컴파일후 결과물을 insmod하고 디바이스 파일을 만들어 준후 아래와 같은 명령을 실행하면.
#echo "test" >> drv_test
device write 문자열이 무한 루프를 돌더군요.
궁금한점.
---------------------
1. write가 어떠한 방식으로 동작하기 때문에 무한 루프를 돌까요?
2. return 값을 바꾸면 1일때는 5번, 2일때는 3번, 3이상일 경우 2번의 문자열이 출력됩니다. 어떤 이유일까요?
3. write 함수의 두번째 인수인 const char* buf에서 왜 const 키워드를 붙일까요?
초보,중수,고수님들의 답변좀 부탁드리겠습니다.
머리가 나빠서인지 이런 궁금한점 때문인지 진도가 잘 안나아가 지네요. :)
Forums:
d_write()에서 write한
d_write()에서 실제로 write한 길이만큼 리턴해야 합니다. 만약 그게 원데이터보다 적으면 앞부분만 실제로 write되었다고 생각하고 나머지를 다시 시도합니다. 그냥 디버깅중이면 length를 리턴하면 되겠네요.
감사합니다. 머리가
감사합니다.
머리가 나빠서 다시 여러 문자열을 데이터를 넣어가면서 테스트 해보니 이해가 되는군요.
return 0 를 했을경우 답변처럼 write한것이 없다고 생각하게 됩니다. 즉 들어온 문자열이 "test"라면 총 5바이트가 들어왔는데 0바이트를 읽었으므로 다시시도를 합니다. 하드코딩으로 return 0를 해놓았기에 이번에도 재시도 되겠네요. 그러면서 무한루프...
return 1 을 했을경우 1바이트를 읽었으므로 총 5바이트에서 1바이트를 읽었으니 이러한 시도를 4번 더 하게 됩니다. 따라서 5번의 디버그 메시지 출력.
return 2 일 경우 2바이트 읽었으므로 5바이트에서 3바이트가 남고 또 2바이트를 읽었다고 하니 1바이트, 그리고 한번더 해서 3번의 디버그 메시지 출력.
ㅎㅎㅎ
머리나쁜사람은 이렇게 정리해야 되는거군요... :'(
far and hard way
const를 함수에서
const를 함수에서 사용하는 것은 함수 내부에서 그 값이 바뀌지 않도록 보장하는 의미를 가진다고 하네요.
답글
답글 감사합니다.
우선 3번은 put_user와 get_user를 헷갈려 했군요.
put_user의 경우 read에서 buf파라메터는 Destination이지만.
get_user의 경우 write에서 buf파라메터는 Source입니다.
즉 소스의 buf이므로 명기적으로 buf자체의 내용에는 변경이 없으므로 const 를 명기해 줍니다.
far and hard way
댓글 달기