커널 패닉입니다. 조언 좀 부탁드립니다. ^^
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은 또 처음이라 아직 접근방법이 많이 서투릅니다.
댓글 달기