2017-03-13 9 views
-5

루프 내에서 copy_to_user()을 사용해 보았습니다.커널 프로그램에서 copy_to_user()를 사용하는 방법은 무엇입니까?

for_each_process(p) { 
    copy_to_user(buf, "data of p", len); 
} 

하지만 출력은 다릅니다. 사용자 공간에 마지막 행의 데이터 만 있습니다 (예 :

#Data expected to copy to user space 

123 1234 12 21 
1243 124 423 12 
1234 422 42 423 

#Current Output: 
1234 422 42 423 

커널 공간에서 각 줄을 사용자 공간에 복사하는 방법은 무엇입니까?

+3

코드를 표시하십시오. 문제가 무엇인지 생각하게하는 대신 (완전히 잘못된 것일 수 있습니다) 우리에게 코드를 보여주고 우리 자신의 결론에 도달하게하십시오. 모든 수단을 통해 자신의 평가를 실시하고 검사하고 검증 할 데이터 (즉, 코드)도 제공하십시오. – kaylum

+2

"* 나는 copy_to_user()'* '에 전달 된 데이터를 생각했다. 아니요, 리눅스의'copy_to_user (src, dst, len)'는 여러분이 가리키는 (사용자 프로세스의 주소 공간에있는)'dst' 위치에 데이터를 복사합니다. 같은 포인터로 여러 번 호출하면 해당 위치의 기존 데이터를 덮어 씁니다. – dhke

답변

5

커널 프로그램에서 copy_to_user()를 몇 번 사용할 수 있습니까?

원하는만큼. 그러나 그들은 (어떤 종류의 프로그램에서나하는 일이 의미를 갖기 때문에) 이해해야합니다.

copy_to_user()에 전달 된 데이터가 데이터를 다음 행에 추가하는 경우 생각했습니다.

아니요, copy_to_user에는 아무 것도 추가하지 않습니다. 네가 그 아이디어를 어디에서 얻었는지 모르겠다. 실제로 덮어 쓰기 한 후,

글쎄, 당신은 두 번째 프로세스에 대한 데이터로 덮어 쓰기 한 후, 첫 번째 프로세스에 대한 데이터를 복사하는 일이 무엇

그 세 번째 프로세스에 대한 데이터를 , 등등. 마지막에는 세 번째 프로세스의 데이터가 남아 있습니다.

커널 공간에서 세 줄을 모두 사용자 공간으로 전송하는 방법은 무엇입니까?

다른 위치에 각 프로세스의 데이터를 저장하십시오.

+0

어떻게 다른 위치에 보관합니까? 어떻게 다른 위치에서 액세스합니까? – Yggdrasil

+0

@ Yggdrasil 알아내는 프로그램입니다. 첫 번째 매개 변수 (이 경우'buf')는 데이터가 복사되는 주소입니다. – immibis