커널 패닉입니다. 조언 좀 부탁드립니다. ^^

kyh1026의 이미지

EZ-X5보드에 linux-kernel 2.6.21을 올리고 있는 중입니다.

그리고 여기에 제가 구현한 시스템콜을 추가하여 커널 이미지를 올렸습니다.

부팅잘~ 되고 아무 이상이 없는데

제가 구현한 시스템콜을 콜 하면 커널 패닉이 생깁니다. ㅜ_ㅜ

시스템콜은 sys_fork를 그대로 따와서 만든건데

sys_fork(struct pt_regs *regs) 이렇게 되있으면

my_sys_fork(int x, int y, int *result, struct pt_regs *regs)

이렇게 만들어 놓고 do_fork역시 코드를 그대로 따와서 my_do_fork를 호출하여

x, y값을 task_struct에 저장하는 것만 더 추가를 했습니다.

중간중간에 printk를 찍어 봤을때 인자 전달이라던가 이런건 잘 되는거 같습니다.

app (test)입니다. (시스템콜을 유저레벨에서 호출)

1 #include
2 #include
3 #include
4 int main(void)
5 {
6 int lvn_pid = 10;
7
8 syscall(348, 10, 10, &lvn_pid);
9
10 printf("result %d\n", lvn_pid);
11 return 0;
12 }

시스템콜 구현입니다.

asmlinkage int sys_lvn_create_task (int lvn_prio, int lvn_limit_time, int *r esult, struct pt_regs *regs)
9 {
10 int error, res;
11
12 printk("<0> sys_lvn_create_task\n");
13 printk("<0> lvn_prio : %d\n lvn_limit_time : %d\n", lvn_prio, lvn_limit_ time);
14 printk("<0> regs : %p\n", regs);
15 printk("<0> regs->ARM_sp : %x\n", regs->ARM_sp);
16
17 error = access_ok(VERIFY_WRITE, result, sizeof(*result));
18 if (error < 0) {
19 printk("error in cdang\n");
20 printk("error is %d\n", error);
21 return error;
22 }
23
24 res = lvn_do_fork(SIGCHLD, regs->ARM_sp, regs, 0, NULL, NULL, lvn_prio, lvn_limit_time);
25 printk("<0> res : %d\n", res);
26 copy_to_user(result, &res, sizeof(int));
27 return 0;
28 }

시스템콜에서 호출하는 커널에 구현한 함수(lvn_do_fork)입니다.

1375, 1376 부분만 빼면 do_fork랑 똑같습니다. ^^;;

long lvn_do_fork(unsigned long clone_flags, unsigned long stack_start, struct pt_regs *regs, unsigned long stack_size, int __user *parent_tidptr, int __user *child_tidptr, int lvn_prio, int lvn_limit_tim e)
1356 {
1357 struct task_struct *p;
1358 int trace = 0;
1359 struct pid *pid = alloc_pid();
1360 long nr;
1361
1362 if (!pid)
1363 return -EAGAIN;
1364 nr = pid->nr;
1365 if (unlikely(current->ptrace)) {
1366 trace = fork_traceflag (clone_flags);
1367 if (trace)
1368 clone_flags |= CLONE_PTRACE;
1369 }
1370
1371 printk("<0> lvn_prio : %d\n lvn_limit_time : %d\nregs: %p\n, parent_tidptr : %p\n, child_tidptr : %p\n", lvn_prio, lvn_limit_time, regs, parent_tidptr, child_tidptr);
1372
1373 p = copy_process(clone_flags, stack_start, regs, stack_size, parent_tidptr, child_tidptr, nr);
1374
1375 p->lvn_rt_time = lvn_limit_time;
1376 p->lvn_rt_prio = lvn_prio;

.......

}

그리고 커널 패닉 메세지 입니다.

[root@falinux nfs]$ ./test
sys_lvn_create_task
lvn_prio : 10
lvn_limit_time : 10
regs : 0000000a
Unable to handle kernel NULL pointer dereference at virtual address 0000003e
pgd = c052c000
[0000003e] *pgd=a0dbc031, *pte=00000000, *ppte=00000000
Internal error: Oops: 3 [#1]
Modules linked in:
CPU: 0
PC is at sys_lvn_create_task+0x48/0xdc
LR is at 0xc032b15c
pc : [] lr : [] Not tainted
sp : c378ff70 ip : c032b15c fp : c378ffa4
r10: 40135f6c r9 : c378e000 r8 : 00000000
r7 : 0000000a r6 : befdbc44 r5 : 0000000a r4 : 0000000a
r3 : 00000000 r2 : 00000001 r1 : 00000001 r0 : 00000014
Flags: nZCv IRQs on FIQs on Mode SVC_32 Segment user
Control: 397F
Table: A052C000 DAC: 00000015
Process test (pid: 890, stack limit = 0xc378e250)
Stack: (0xc378ff70 to 0xc3790000)
ff60: 000084c4 40135f6c c378ff9c c378ff88
ff80: c002e178 0000000a 00000000 befdbc58 0000015c c0028d44 00000000 c378ffa8
ffa0: c0028ba0 c00553b4 00000000 befdbc58 0000015c 0000000a 0000000a befdbc44
ffc0: 0000000a 00000000 befdbc58 00000001 401397fc 000084c4 40135f6c befdbc54
ffe0: befdbc44 befdbc38 000084f0 400e89c0 60000010 0000015c 00000000 00000000
Backtrace:
[] (sys_lvn_create_task+0x0/0xdc) from [] (ret_fast_syscall)
r8 = C0028D44 r7 = 0000015C r6 = BEFDBC58 r5 = 00000000
r4 = 0000000A
Code: e1a01004 e59f008c ebffa1eb e3a08000 (e5941034)
Segmentation fault

글이 깁니다. 읽어주셔서 감사하고 ^^

조언좀 해주세요~~ arm은 또 처음이라 아직 접근방법이 많이 서투릅니다.

댓글 달기

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