[질문]프로세스 상태 저장에 관한 질문입니다

jerry_builder의 이미지

안녕하십니까? ^^
저는 얼마전부터 홍지만 저 "커널 프로그래밍"이라는 책의 프로젝트를 구현하고 있는 학생입니다.
주제는 프로세스의 상태를 tast_struct의 정보를 사용하여 파일로 백업시키고 그 상태저장파일을 후에 복구시키는 것입니다.
책의 내용은 그저 실행프로그램 자신이 자신의 상태를 저장하는 형식으로 되어있습니다.
해서 그것을 조금 변경을 하고있는데요, 요는 다른 임의의 프로세스가 실행프로그램을 실행시켜 그 대상(실행된 프로그램)프로세스의 상태정보를 저장하는 것입니다. 결국 부모프로세스가 자식프로세스(실행프로그램)의 상태를 저장하도록 한것입니다.
그런데 해당 프로세스의 task_struct를 pid를 인자로넘겨 찾는것 까지는 좋았는데 vm_area_struct부분에서 자꾸 segment에러가 나는것입니다.
해당 코드는 바로 이부분입니다.

for(tmp=target->mm->mmap; tmp; tmp=tmp->vm_next)
{
set_fs(KERNEL_DS);

n = sizeof(struct vm_area_struct);
if(write(file, (char*)tmp, n, &file->f_pos) != n){
printk("vm_area_struct write error\n");
goto close_exit;
}

set_fs(USER_DS);
n = tmp->vm_end - tmp->vm_start;
if(write(file, (char*)tmp->vm_start, n, &file- >f_pos) != n)
{
printk("pid number : %d\n",pid);
printk("segment write error\n");
goto close_exit;

}

}

segment error가 나는 것으로 보면 분명 set_fs(USER_DS)부분인것 같습니다. 기존의 소스코드를 변형하던 것이라서 이부분은 이전의 것과 바뀐것이 없습니다만, 현재 수행중인 프로세스는 부모 프로세스이구요 자식프로세스의 상태를 저장하는 과정이기때문에 이전에 현재수행중이던 프로세스의 virtual memory영역을 저장하던 부분을 바꾸어야 할것 같습니다.
그런데 자식프로세스(실행프로그램)의 virtual memory영역은 사용자 영역에 있을테고요, 그것을 커널 영역으로 불러들이는것 같은데요, 그렇다면 어떻게 사용자 영역의 정보를 불러들일수 있는지 알고싶습니다.

이 부분에 대해 알고계신분이 있다면 답변 부탁드립니다.
그리고 혹시 set_fs(USER_DS)의 자세한 동작이 어떻게 되는지 알고계신분이 있다면 알려주셨으면 고맙겠습니다.(혹시몰라서 일부 프로세스 상태만을 저장하는 부분만을 첨부하겠습니다.)

어떻게 쓰다보니 횡설수설한 얘기가 되었습니다.
매일 행복한 하루들 보내십시요 .^-^

File attachments: 
첨부파일 크기
파일 ckpt_bak.c8.22 KB
방준영의 이미지

부모 프로세스로부터 자식 프로세스 링크를 쫓아가서 그 task_struct를 저장하면 되지 않나요. 굳이 사용자 모드로 전환할 필요는 없는 듯 합니다. 레지스터 컨텍스트를 저장하는 것이 목적이라면 일단 자식한테 시그널을 날려서 정지시켜야 하겠구요.

그리고 세그멘트 에러(x) -> 세그멘테이션 폴트 (또는 줄여서 세그폴트)

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.