![원하는 양의 메모리를 읽으려면 process_vm_readv를 사용하십시오.](https://linux55.com/image/147780/%EC%9B%90%ED%95%98%EB%8A%94%20%EC%96%91%EC%9D%98%20%EB%A9%94%EB%AA%A8%EB%A6%AC%EB%A5%BC%20%EC%9D%BD%EC%9C%BC%EB%A0%A4%EB%A9%B4%20process_vm_readv%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%8B%AD%EC%8B%9C%EC%98%A4..png)
process_vm_readv의 경우 Linux 매뉴얼 페이지에는 다음과 같이 명시되어 있습니다.
[...] (방지) 단일 원격 iovec 요소에서 스패닝 메모리 페이지(일반적으로 4KiB). (대신 원격 읽기를 두 개의 remote_iov 요소로 분할하고 이를 다시 단일 쓰기 local_iov 항목으로 병합합니다. 첫 번째 읽기 항목은 페이지 경계까지 올라가고 두 번째 읽기 항목은 다음 페이지 경계에서 시작됩니다.)
이것이 왜 문제인지는 이해하지만 문제를 해결하는 방법은 잘 모르겠습니다. 페이지 경계가 어디에 있는지 알아내야 합니까? 아니면 2개의 remote_iov 요소를 제공하는 한 함수가 이 문제를 자체적으로 해결합니까? 4kiB 이상을 읽고 2페이지 경계에 걸쳐 있을 수 있는 경우 원격 요소를 3개 부분으로 분할해야 합니까?
답변1
실제로 전체 단락을 읽어야 합니다. iovec을 분할하는 이러한 방법은 필수 사항이 아닙니다. 이것은 단지~해야 한다부분적으로 읽는 경우 도움이 되지만 어떻게 도움이 되는지 확실하지 않습니다. ;-)
맨페이지는 다소 복잡하고 혼란스럽습니다. 내 테스트에 따르면 process_vm_readv()
목록의 첫 번째 iovec이 유효한 주소가 아니지만 iovec이 임의의 페이지에 걸쳐 있거나 나머지 iovec이 매핑 해제된 경우(예상되고 유용하지만) 항상 오류가 발생합니다. 아래 강조 표시된 섹션과 모순됩니다).iov_start
remote_iov
iov_start + iov_len
그러나 이러한 시스템 호출은 원격 프로세스의 메모리 영역을 확인하지 않는다는 점에 유의하십시오.읽기/쓰기 작업이 수행될 때까지. 그러므로부분 읽기/쓰기(반환 값 참조)
remote_iov
이는 요소 중 하나가 원격 프로세스의 잘못된 메모리 영역을 가리키는 경우 발생할 수 있습니다. 이 시점 이후에는 더 이상 읽기/쓰기가 시도되지 않습니다. 원격 프로세스에서 길이를 알 수 없는 데이터(예: null로 끝나는 C 문자열)를 읽으려고 할 때 이 점을 명심하고 단일 원격 iovec 요소에서 메모리 페이지(일반적으로 4KiB)를 확장하지 마십시오. (대신 원격 읽기를 두remote_iov
요소로 분할하고 다시 단일 쓰기local_iov
항목으로 병합합니다. 첫 번째 읽기 항목은 페이지 경계까지 올라가고 두 번째 읽기 항목은 다음 페이지 경계에서 시작됩니다.)[...]
부분 읽기/쓰기가 발생한 경우 이 반환 값은 요청된 총 바이트 수보다 작을 수 있습니다. (부분 이전iovec 요소에 적용되는 세분성입니다. 이러한 시스템 호출은 개별 iovec 요소를 분할하는 부분 전송을 수행하지 않습니다..)