2011-09-26 5 views
0

저는 커널 프로그래밍에 익숙하지 않으므로 그 질문에 변명하십시오. 본질적으로, 커널 모듈에 문자열 (char *)을 보내서 출력하려고합니다. 아주 간단합니다.copy_from_user이 (가) char *에 대해 작동하지 않습니다.

char *text = "some text.";  
ioctl(fd,OUTPUT_TEST,text); 

을하고 모듈 내부에있다 :

나는 사용자 수준 코드에서 다음이

char *text; 
case OUTPUT_TEST: 
    copy_from_user(text,(char *)arg,sizeof(char*); 

그러나, 텍스트가 null 남아있다. 이것은 문자열에 대한 포인터가 아니어야합니까?

사용자 수준에서 :

typedef struct 
{ 
    int size; 
    char *text; 
}Message; 

    int fd = open ("/proc/ioctl_test", O_RDONLY); 
    Message message; 
    message.text = "This message was sent via OCTL."; 
    message.size = strlen(message.text); 

    ioctl(fd,OUTPUT_TEST,message); 

그리고 커널 공간 :

copy_from_user(&message,(Message *)arg,sizeof(Message)); 

이 완벽하게 작동 다음과 같은 작업을 수행하기 때문에

나는 더욱 혼란 스러워요 . 나는 정말로 혼란스럽고 당신이 제공 할 수있는 어떤 도움도 좋아할 것입니다.

답변

3

내가 거친 소리를 의미하지 않는다하지만 난 당신이 이름이 의미 정확히 무엇을 조금

copy_from_user 나 :-) 커널 모듈을 작성하기 전에 C를 배울 필요가 있다고 생각 -을 복사 버퍼 형태의 사용자 공간을 제공 버퍼 커널 제공 버퍼로. 이것은 커널이 할당 한 버퍼를 제공해야한다는 것을 의미하며, 할당 된 버퍼는 없다.

char * 텍스트는 버퍼에 대한 포인터를 할당하지만 버퍼는 할당하지 않습니다. 버퍼 할당을 직접 수행해야합니다.

두 번째 예에서 메시지 구조체는 전역 또는 스택 (예 : 귀하의 예에서는 알 수 없음)으로 정의되므로 할당이 발생하고 작동합니다.

+0

감사합니다. 나는 버퍼를 할당 할 필요가 있다고 생각했기 때문에 메시지 구조체에 메시지 크기가 포함되어 있습니다. 나는 아직도 구조체 (int와 포인터)를 복사 할 때 왜 텍스트 버퍼를 복사하는지 이해할 수 없다. 또한 첫 번째 copy_from_user에서 텍스트가 여전히 null 인 이유가 혼란 스럽습니다. 아니요, 버퍼를 복사하지 않지만 내용 (예 : 사용자 공간 포인터)을 복사하면 안됩니까? 나는 포인터가 작동하지 않을 것이지만 텍스트가 null 인 이유를 모르겠습니다. – kodai

+1

@kodai :'Message' 예제는 텍스트 버퍼를 전혀 복사하지 않습니다. 단지 텍스트 버퍼의 (사용자 공간) 주소 만 복사합니다. 사용자 공간 포인터는 커널에 의해 직접 역 참조되어서는 안되기 때문에 버그가 있습니다. 모든 아키텍처에서 작동하지 않으며 안전하지 않은 곳에서도 작동합니다. – caf

+0

또한 전체 문자열을 복사해야 함을 잊지 마십시오. ''copy_from_user (text, (char *) arg, sizeof (char *));''는 포인터의 크기만을 복사합니다. ''copy_from_user (text, (char *) arg, strlen (arg));''와 같은 것이어야하지만 커널 코드가''strlen''을 구현하는지 기억이 안납니다. – Fred

관련 문제