vm_area_struct 를 참조해서 data영역의 정보를 얻고자 합니다.

lemk000의 이미지

제목 그대로입니다.
시스템콜을 만들어서 하려고 하는데요
인자로 알고자하는 프로세스의 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위치를 빼주면 크기가 나올겁니다
}

소스상으로 뭔가 틀린게 있을가요?
뭔가 잘못된값을 가져오는것 같네요 ㅠ

freemckang의 이미지

뭘 아는건 아니고.. 개인적으로 궁금해서 저도 한번 돌려봤습니다. 커널 버전은 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 환경에서는 이 주소가 어떻게 나올지 의문이네요. 혹시 확인 되시면 답변 좀 부탁드리겠습니다.. ㅎㅎ

句日新, 日新 日新 又日新.

lemk000의 이미지

지금 돌려볼 상황이아니라 돌려보진 못하지만
제가 돌려본버전은 2.4였는데 저의 코드로 수행이 되더군요
답변해주신 코드로도 한번 테스트 해봐야겠습니다. 감사합니다!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.