내 프로세스 중 하나에 대해 커널이 관리하는 페이지 테이블을 보고 싶습니다. 내 경우에는 PID 4680이 에 매핑되어 있으므로 dhclient
페이지 테이블을 보기 위해 다음을 시도했습니다.
sudo cat /proc/4680/pagemap
그러나 이 명령은 출력 없이 Ubuntu 14.04에서 중단됩니다. 2분 정도 기다렸다가 죽이려고 했습니다.
더 좋은 방법이 있나요?
답변1
~에 따르면문서, /proc/PID/pagemap
각 가상 페이지에는 64비트 값이 포함됩니다.
4096바이트 페이지가 있고, 64비트 가상 주소 공간이 있고, 2**52
페이지가 있습니다. 따라서 전체 파일은 각각 8바이트의 항목이 pagemap
됩니다 . 2**52
매우 큰 파일입니다. 전체를 캡쳐하는데 시간이 많이 걸립니다. 2분 미만. 정말 오랜만이에요. 내 컴퓨터에서 속도 테스트를 한 결과 약 21년이 걸렸습니다.
대부분 0으로 채워집니다(프로세스에서 매핑되지 않은 모든 가상 주소에 대해). \0
터미널에 대한 여러 출력은 눈에 보이는 효과가 없습니다. 매달린 것이 아니라 원하는 대로 수행됩니다.
텍스트 파일이 아니므로 0이 아닌 항목도 터미널에서 보기 좋게 보이지 않을 것입니다.
페이지 맵 파일을 사용하는 올바른 방법은 찾고 있는 가상 주소를 알고 이를 찾아 8바이트를 읽는 것입니다. 또는 다양한 정보가 필요한 경우 8바이트의 배수를 읽으십시오. 0이 아닌 모든 항목을 원하는 경우 먼저 읽어 /proc/PID/maps
매핑된 범위를 찾으세요.
답변2
https://github.com/dwks/pagemap/proc/<PID>/pagemap
오프셋 사이에서 파일을 읽고 원하는 가상 주소에 대한 페이지 매핑 정보를 얻을 수 있는 옵션이 있는 것 같습니다 .
$ ./pagemap 11405 0x400000 0x406000
0x400000 : pfn c1719 soft-dirty 0 file/shared 1 swapped 0 present 1
0x401000 : pfn c1718 soft-dirty 0 file/shared 1 swapped 0 present 1
0x402000 : pfn c1717 soft-dirty 0 file/shared 1 swapped 0 present 1
0x403000 : pfn c1716 soft-dirty 0 file/shared 1 swapped 0 present 1
0x404000 : pfn c171a soft-dirty 0 file/shared 1 swapped 0 present 1
0x405000 : pfn c16ef soft-dirty 0 file/shared 1 swapped 0 present 1
답변3
나는 당신이 찾고 있다고 생각합니다 /proc/<pid>/maps
. 프로그램과 해당 라이브러리의 지도를 볼 수 있습니다. 각 영역의 내용에 접근하려면 /proc/<pid>map_files
각 블록의 메모리 범위에 따라 각 파일명이 설정된 디렉터리에 접근하면 됩니다.
이에 대한 자세한 내용은 man을 참조하세요.프로세스, /proc/[pid]/map_files/
다음 단락을 찾아보세요.
다음은 X11 기반 프로그램의 메모리 사용 블록(일부)의 예입니다.
답변4
걸어서 충돌하는 mm_struct.pgd
것은 쉬운 방법입니다. 테이블의 하위 주소가 다르고 상위 주소가 동일한 것을 볼 수 있습니다.
- 더 높은 주소의 경우 에서 커널 페이지 테이블 덤프를 볼 수 있습니다
debugfs
. - 더 낮은 주소의 경우 를 볼 수 있습니다
/proc/$PID/maps
.