vm_area_struct 를 참조해서 data영역의 정보를 얻고자 합니다.
글쓴이: lemk000 / 작성시간: 목, 2011/12/01 - 10:41오후
제목 그대로입니다.
시스템콜을 만들어서 하려고 하는데요
인자로 알고자하는 프로세스의 pid를 얻고, 반환값을 포인터 인자로 넘겨줍니다.
제생각엔 아래와같이 프로그래밍했을때 틀린게 없는것 같거든요
근데 막상 유저 프로그램에서 실행을 해보면 음수값이 나옵니다.
end에서 start를 뺐늗네 음수가 나와요 ㅠㅠㅠ 어떤걸 잘못했을가요??
소스는 아래와같습니다.
search=&init_task; // 반복문으로 인자의 pid와 매칭되는 task_struct를 가져옵니다. while (search->pid!=id) { search=search->next_task; if (search->pid == init_task.pid) return (-1); } m = search->mm; // 그 task_struct의 mm_struct인 mm에 접근을 하죠 v = m->mmap; // 그다음에 vm_area_struct에 접근하기 위해 mmap에 접근을 합니다. v = v->vm_next; // data영역은 그 다음에 있으므로 next로 한번 가주고요 end = v->vm_end; start = v->vm_start; size = end-start; // end위치에서 start위치를 빼주면 크기가 나올겁니다 }
소스상으로 뭔가 틀린게 있을가요?
뭔가 잘못된값을 가져오는것 같네요 ㅠ
Forums:
저도 한번 해봤는데요...
뭘 아는건 아니고.. 개인적으로 궁금해서 저도 한번 돌려봤습니다. 커널 버전은 2.6.31-3 입니다.
다만 소스코드에서 이해가 안가는 부분이 있는데요,
search=&init_task; // 반복문으로 인자의 pid와 매칭되는 task_struct를 가져옵니다.
while (search->pid!=id)
{
search=search->next_task;
if (search->pid == init_task.pid) return (-1);
}
이 부분이 빌드에 문제가 없나요? 커널 버전이 달라서인지는 모르겠지만, 저는 빌드에러가 발생하더군요. 해서, 저는
for_each_process(search) {
if (search->pid == pid) {
break;
}
}
이렇게 변경하였습니다.
어쨌든, 이렇게 변경한 후에 print를 찍어보니
end : 0x004B8000
start : 0x004B7000
value : 0x00001000
문제가 없네요. 다만 위 코드에서 문제가 될만한 부분은 unsigned long을 사용하지 않고 그냥 long을 사용하셨다는 점입니다. 저는 MIPS 환경에서 테스트해보았는데요.. (제 개발환경이 MIPS라서요.. ㅎㅎ host PC는 windows라서..) 혹시 PC 환경에서는 이 주소가 어떻게 나올지 의문이네요. 혹시 확인 되시면 답변 좀 부탁드리겠습니다.. ㅎㅎ
句日新, 日新 日新 又日新.
감사합니다!
지금 돌려볼 상황이아니라 돌려보진 못하지만
제가 돌려본버전은 2.4였는데 저의 코드로 수행이 되더군요
답변해주신 코드로도 한번 테스트 해봐야겠습니다. 감사합니다!
댓글 달기