저는 커널 프로그래밍에 익숙하지 않으므로 그 질문에 변명하십시오. 본질적으로, 커널 모듈에 문자열 (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));
이 완벽하게 작동 다음과 같은 작업을 수행하기 때문에
나는 더욱 혼란 스러워요 . 나는 정말로 혼란스럽고 당신이 제공 할 수있는 어떤 도움도 좋아할 것입니다.
감사합니다. 나는 버퍼를 할당 할 필요가 있다고 생각했기 때문에 메시지 구조체에 메시지 크기가 포함되어 있습니다. 나는 아직도 구조체 (int와 포인터)를 복사 할 때 왜 텍스트 버퍼를 복사하는지 이해할 수 없다. 또한 첫 번째 copy_from_user에서 텍스트가 여전히 null 인 이유가 혼란 스럽습니다. 아니요, 버퍼를 복사하지 않지만 내용 (예 : 사용자 공간 포인터)을 복사하면 안됩니까? 나는 포인터가 작동하지 않을 것이지만 텍스트가 null 인 이유를 모르겠습니다. – kodai
@kodai :'Message' 예제는 텍스트 버퍼를 전혀 복사하지 않습니다. 단지 텍스트 버퍼의 (사용자 공간) 주소 만 복사합니다. 사용자 공간 포인터는 커널에 의해 직접 역 참조되어서는 안되기 때문에 버그가 있습니다. 모든 아키텍처에서 작동하지 않으며 안전하지 않은 곳에서도 작동합니다. – caf
또한 전체 문자열을 복사해야 함을 잊지 마십시오. ''copy_from_user (text, (char *) arg, sizeof (char *));''는 포인터의 크기만을 복사합니다. ''copy_from_user (text, (char *) arg, strlen (arg));''와 같은 것이어야하지만 커널 코드가''strlen''을 구현하는지 기억이 안납니다. – Fred