원하는 양의 메모리를 읽으려면 process_vm_readv를 사용하십시오.

원하는 양의 메모리를 읽으려면 process_vm_readv를 사용하십시오.

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_startremote_ioviov_start + iov_len

그러나 이러한 시스템 호출은 원격 프로세스의 메모리 영역을 확인하지 않는다는 점에 유의하십시오.읽기/쓰기 작업이 수행될 때까지. 그러므로부분 읽기/쓰기(반환 값 참조) remote_iov 이는 요소 중 하나가 원격 프로세스의 잘못된 메모리 영역을 가리키는 경우 발생할 수 있습니다. 이 시점 이후에는 더 이상 읽기/쓰기가 시도되지 않습니다. 원격 프로세스에서 길이를 알 수 없는 데이터(예: null로 끝나는 C 문자열)를 읽으려고 할 때 이 점을 명심하고 단일 원격 iovec 요소에서 메모리 페이지(일반적으로 4KiB)를 확장하지 마십시오. (대신 원격 읽기를 두 remote_iov 요소로 분할하고 다시 단일 쓰기 local_iov항목으로 병합합니다. 첫 번째 읽기 항목은 페이지 경계까지 올라가고 두 번째 읽기 항목은 다음 페이지 경계에서 시작됩니다.)

[...]

부분 읽기/쓰기가 발생한 경우 이 반환 값은 요청된 총 바이트 수보다 작을 수 있습니다. (부분 이전iovec 요소에 적용되는 세분성입니다. 이러한 시스템 호출은 개별 iovec 요소를 분할하는 부분 전송을 수행하지 않습니다..)

관련 정보