2017-03-21 5 views
0

Linux 드라이버에서 char 장치 드라이버를 구현하려고합니다. 드라이버에 문자열을 에코하려고하면 결과가 매우 이상합니다.Dmesg가 char 장치 모듈에서 linux 커널로 출력합니다.

문자열을 I 입력을 저장하는 내 코드 :

int max_size = 1; 
char store[1] = {0}; 
char message[100] = {0}; 
ssize_t hello_write(struct *filep, const char *buffer, size_t length, loff_t *position) 

{ 
    if(length> max_size) 
    length = max_size; 
    if(copy_from_user(message, buffer, length)) 
    return -EFAULT; 
    strncpy(store, message, max_size); 
    printk(KERN_INFO "Actually stored in kernel:%s", store); 
    return max_size; 
} 
ssize_t hello_read(struct file *filep, char *buffer, size_t length, loff_t *postion) 
{ 
    int error_count = 0; 
    error_count = copy_to_user(buffer, store, max_size); 
    if(error==0){ 
    printk(KERN_INFO "read message from kernel: %s", store); 
    return 0; 
    } 
    else{ 
    printk(KERN_INFO "failed to send %d chars to user", error_count); 
    return -EFAULT; 
    } 
} 

테스트 :

echo ginger > /dev/test 
cat /dev/test 

나는 기능을 가진 첫 번째 각 입력 문자열의 편지, 아무것도 저장하려는 strncpy? write 콜에 의해 반환

store the string one by one

답변

2

값 가공 바이트 번호로 해석된다. 이 모든 입력이 바이트 을 처리 할 때까지 반복적으로을 write()를 호출 echo 다른 표준 출력 유틸리티처럼

.

입력의 단일 바이트 만 저장하려는 경우 처리 된 것으로 표시하기 위해 입력의 전체 길이를 반환해야합니다. .write

더 정확한 구현은 다음과 같습니다 종류의 조언을

ssize_t hello_write(struct *filep, const char * __user buffer, size_t length, loff_t *position) 
{ 
    if((*position == 0) && (length > 0)) { 
    // Store the first byte of the first input string. 
    if(copy_from_user(message, buffer, 1)) 
     return -EFAULT; 
    strncpy(store, message, 1); 
    } 
    printk(KERN_INFO "Actually stored in kernel:%s", store); 
    // But mark the whole string as processed 
    *position += length; 
    return length; 
} 
+0

감사합니다, 나는 포인터를 재배치하는 것을 잊었다 깨달았다. 이제는 꽤 잘 작동합니다. 다시 한 번 감사드립니다! – Ethan