memory mapping을 구현하였는데, kernel error가 발생합니다.

powerson의 이미지

안녕하세요. 현재 memory mapping device driver를 작성하였습니다. 근데 어디서 문제가 발생했는지 중간중간 에러가 발생합니다. kernel error message 맨 아래 보면 spin_lock이 먼저 잡혀 있다고 나오는데 혹시 dead lock에 관련된 것인가 하고 생각해봤지만, 여전히 잘 모르겠네요. 혹시 locking에 있어서 제가 뭔가 잘못한 부분이 있는건가요? 현재 테스트중인지라 전혀 locking을 안 걸었는데, 이런 문제가 발생하네요.

참 한가지 더 궁금한 점이 있습니다. user program으로 memory의 데이터를 바꿨을 경우에요. 첫번째 수행에선 데이터가 안 바뀌고, 한번더 실행을 해줘야만 memory data가 바뀌고 있습니다.
가령 mapping 된 memory의 0번째에 1을 넣는 user program을 작성했다고 하면 한번 실행하면, 데이터가 예전 값이 그대로 유지하더라고요. 똑같은걸 한번 더 실행해줘야만, 적용되고 있습니다. 어제 cache 관련된 문서를 보다가 문득 혹 cache 문제인가? 하는 생각도 하긴 했는데, 정확한 이유는 모르겠습니다. ㅠㅠ

혹시 아시는 분 계시면 답변 부탁드립니다. ^^

다음은 mmap function에 대한 소스입니다.

typedef struct _keyword
{
       unsigned char   word[WORD_LEN];
       int                             type;
} KEYWORD;

KEYWORD                                         *keyword_area;

int keyword_mmap( struct file *file, struct vm_area_struct *vma )
{
       unsigned long pfn;
       unsigned long size = vma->vm_end - vma->vm_start;
       unsigned long start = vma->vm_start;
       int                     i;

       printk( "Size : %ld\n", size );
       if( size > MAX_SIZE )
       {
               printk( KERN_WARNING "size too big : %ld!\n", size );
               return -ENXIO;
       }

       if( (vma->vm_flags & VM_WRITE) && !(vma->vm_flags & VM_SHARED) )
       {
               printk( "writeable mappings must be shared, rejecting\n" );
               return -EINVAL;
       }

       vma->vm_flags |= VM_LOCKED;

       pfn = virt_to_phys(keyword_area) >> PAGE_SHIFT;

       if( remap_pfn_range(vma, start, pfn, size, PAGE_SHARED) )
       {
               printk( "remap_pfn_range call failed\n" );
               return -ENXIO;
       }

       for( i = 0; i < 10; i++ )
               printk( "word : %s, type : %d\n", keyword_area[i].word, keyword_area[i].type );

       return 0;
}

다음은 계속 그런건 아니지만, error가 발생했을 때 나오는 kernel message입니다.

============================================
------------[ cut here ]------------
kernel BUG at mm/rmap.c:437!
invalid operand: 0000 [#3]
Modules linked in: keyword_mapping i2c_i801
CPU: 0
EIP: 0060:[<c016a555>] Tainted: P VLI
EFLAGS: 00010202 (2.6.11)
EIP is at page_add_anon_rmap+0x6a/0x74
eax: 20000804 ebx: dc96968c ecx: c137a600 edx: dc972d08
esi: c137a600 edi: b7fd3010 ebp: dfb7a980 esp: dbea9e18
ds: 007b es: 007b ss: 0068
Process python (pid: 2390, threadinfo=dbea9000 task=df4b5230)
Stack: 00000000 c137a600 dc6fbe98 c0162f7f c137a600 dc96968c b7fd3010 00000008
00000010 dc98b380 dc98b3c8 7fffffff 00000000 1bd30067 dfb7a980 00000001
dc53fdf8 dc96968c c0163559 dfb7a980 dc96968c dc6fbe98 dc53fdf8 00000001
Call Trace:
[<c0162f7f>] do_anonymous_page+0x25f/0x374
[<c0163559>] do_no_page+0x4c5/0x5aa
[<c015f455>] pte_alloc_map+0x34/0x206
[<c0163a8e>] handle_mm_fault+0x2e5/0x35b
[<c0117e11>] do_page_fault+0x29b/0x73b
[<c013e9f9>] autoremove_wake_function+0x0/0x4b
[<c0179b07>] vfs_read+0xb5/0x133
[<c0117b76>] do_page_fault+0x0/0x73b
[<c0103bbf>] error_code+0x2b/0x30
Code: 5e 5f c3 89 51 14 89 71 10 c7 44 24 14 01 00 00 00 c7 44 24 10 10 00 00 00 5b 5e 5f e9 a8 82 fe ff 0f 0b b6 01 a0 27 3c c0 eb b3 <0f> 0b b5 01 a0 27 3c c0 eb a5 83 ec 08 8b 54 24 0c f6 42 10 01
mm/mmap.c:1987: spin_lock(kernel/fork.c:dfb7a9d0) already locked by mm/memory.c/1807

========================================================

hb_kim의 이미지

왜 디바이스 영역도 아닌 메모리에 mmap 을 하시나요? mmap 의 용도를 먼저 이해하시는게 우선 순서가 될것 같습니다.

댓글 달기

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