2010-06-17 5 views
13

리눅스 2.6.30 이상 사용자 공간에서 (비공유) mmap 페이지의 오염도에 액세스 할 수 있습니까? 플랫폼 별 해킹 및 klugege 환영.사용자 공간에서 mmap 페이지의 먼지가 발견 될 수 있습니까?

이상적으로, mmap'ed 영역의 페이지 당 하나 (4kB?)의 비트 배열을 찾고 있습니다.이 영역이 mmap'ed 되었기 때문에 해당 페이지가 작성된 경우 설정됩니다.

는 (나는 쓰기를 수행하는 과정이 정보를 추적 할 수 있다는 것을, 알고 -하지만 커널 어쨌든 그 일을하는 경우는 그렇게 바보 같다.)

감사합니다,

크리스.

답변

10

/proc/*/pagemap /proc/kpageflags 인터페이스를 참조하십시오. 먼저 PFN에 주소를 알려주고, 두 번째는 PFN이 지정된 더티 비트를 알려줍니다.

fs/proc/task_mmu.c, Documentation/vm/pagemap.txt, Documentation/vm/page-types.c를 참조하십시오.

2

generic_writepagesbalance_dirty_pages_ratelimited_nr은 더티 페이지와 관련된 커널의 시작점 (2.6.20) 인 것처럼 보입니다. 나는 그들이 2.6.30+에서 일하기를 희망한다. 흥미로운 질문입니다. 내가 작성한 내용에 페이지에 대한 이러한 통제가 필요한지 물어볼 수 있습니까?

+0

고맙습니다. generic_writepages를 사용해 보겠습니다. 나는 mmap이 대단위의 psuedo STM 시스템으로 악용 될 수 있는지 궁금하게 생각하고있었습니다. 기존 STM 시스템이 이미 그렇게했을 수도 있습니다. 잠시 시간이 지나면 몇 가지 코드를 거쳐야 할 것입니다. – fadedbee

+0

이들은 사용자 공간에 맞지 않습니다. –

4

일반적인 해결책은 mprotect를 읽기 전용으로 설정 한 다음 sigsegv를 처리하고 reprotecting 전에 쓰기를 허용하기 위해 dirty를 표시하는 것입니다. 오랫동안이 목적을 위해 ObjectStore에서이 작업을 수행했습니다.

+0

이 목적으로 SIGSEGV를 처리하고 복구하는 방법에 대한 예제를 제공하십시오. –

+0

'sigaction'과 'mprotect'의 어떤 부분이 당신에게 어려운 것 같습니까? – bmargulies

+1

OP는 이런 식으로 처리 할 수 ​​있음을 알고 있지만이 오버 헤드를 피하려고합니다. – pythonic

0

비트 배열이 충분히 작 으면 인텔에서 디버그 레지스터를 사용할 수 있습니다 (Linux에서 어떻게 수행되는지는 잘 모르겠지만).

1

이 데이터는 지속적으로 오래된 것입니다. 프로세스가 페이지가 더럽다고 본 후에 페이지가 다시 쓰여질 수 있습니다.

음색 방법은 한 페이지 청크로 매핑 한 다음 /proc/pid/smaps을 보면 청크가 더러운 지 확인할 수 있습니다. 즉, 커널이 페이지를 병합하면 실패 할 수 있습니다.

불행히도 페이지 테이블은 사용자 공간 프로세스에서 볼 수 없기 때문에 일종의 커널 패치없이 수행 할 수있는 최선의 방법입니다.

관련 문제