간단한 프로그램을 만들다 Oops가 발생했습니다.
글쓴이: study / 작성시간: 금, 2022/02/11 - 7:35오전
오랫만에 Kernel thread를 만들어보다가, Kernel Oops가 발생했습니다.
아래 코드는 첨부했는데요,
Oops가 발생한 이유를 혹시 조언해주실 분 있으면 감사하겠습니다.
일단 코드는..
#include <linux/module.h> #include <linux/kmod.h> #include <linux/kthread.h> #include <linux/time.h> #include <linux/timer.h> #include <linux/delay.h> int monitor_main(void) { int i = 0; daemonize("monitor_main"); for(;;) { if (i == 10) { break; } printk("in monitor_main\n"); mdelay(1000); i++; } return 0; } static int __init init_activity_monitor(void) { printk("Hello - init_activity_monitor\n"); monitor_main(); return 0; } module_init(init_activity_monitor); static void __exit exit_activity_monitor(void) { printk("Bye - exit_activity_monitor\n"); } module_exit(exit_activity_monitor);
에러메시지는요..아래와 같았습니다.
Feb 10 12:50:26 server kernel: Hello - init_activity_monitor Feb 10 12:50:26 server kernel: in monitor_main Feb 10 12:50:35 server last message repeated 9 times Feb 10 12:50:36 server kernel: monitor_main[14835]: segfault at 0000003c2dccda8a rip 0000003c2dccda8a rsp 00007fff8f454cf8 error 4 Feb 10 12:50:36 server kernel: Unable to handle kernel NULL pointer dereference at 000000000000006c RIP: Feb 10 12:50:36 server kernel: [<ffffffff802076e9>] _raw_spin_lock+0xd/0xf2 Feb 10 12:50:36 server kernel: PGD 0 Feb 10 12:50:36 server kernel: Oops: 0000 [1] SMP Feb 10 12:50:36 server kernel: CPU 0 Feb 10 12:50:36 server kernel: Modules linked in: activity_monitor(P) autofs4 hidp rfcomm l2cap bluetooth sunrpc bridge ipv6 joydev dm_multipath video sbs i2c_ec button battery asus_acpi ac parport_pc lp parport snd_hda_intel snd_hda_codec snd_seq_dummy snd_seq_oss snd_seq_midi_event snd_seq snd_seq_device snd_pcm_oss snd_mixer_oss snd_pcm pcspkr i2c_i801 snd_timer snd soundcore snd_page_alloc i2c_core shpchp sky2 8139cp 8139too mii serio_raw dm_snapshot dm_zero dm_mirror dm_mod ext3 jbd ehci_hcd ohci_hcd uhci_hcd Feb 10 12:50:36 server kernel: Pid: 14835, comm: monitor_main Tain ted: P 2.6.19 #9 Feb 10 12:50:36 server kernel: RIP: 0010:[<ffffffff802076e9>] [<f fffffff802076e9>] _raw_spin_lock+0xd/0xf2 Feb 10 12:50:36 server kernel: RSP: 0000:ffff81001ba03c68 EFLAGS: 00010092 Feb 10 12:50:36 server kernel: RAX: 0000000000000000 RBX: 0000000000000068 RCX: 000000000000000a Feb 10 12:50:36 server kernel: RDX: ffff81001ba03fd8 RSI: 0000000000000000 RDI: 0000000000000068 Feb 10 12:50:36 server kernel: RBP: 0000000000000060 R08: ffff810037f85040 R09: 0000000000000004 Feb 10 12:50:36 server kernel: R10: 0000000000000004 R11: 0000000000000000 R12: 000000000000000b Feb 10 12:50:36 server kernel: R13: 000000000000000b R14: 0000000000000000 R15: ffffffff80574b40 Feb 10 12:50:36 server kernel: FS: 00002ba71b66c230(0000) GS:ffffffff80618000(0000) knlGS:0000000000000000 Feb 10 12:50:36 server kernel: CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b Feb 10 12:50:36 server kernel: CR2: 000000000000006c CR3: 0000000000201000 CR4: 00000000000006e0 Feb 10 12:50:36 server kernel: Process monitor_main (pid: 14835, threadinfo ffff81001ba02000, task ffff810037f85040)
커널에서 daemonize() 함수가 있나요? 첨보는
커널에서 daemonize() 함수가 있나요? 첨보는 함수인데...
커널에서 thread 만들 땐 kthread_create 등의 함수를 사용합니다. pthread_create 등의 함수와 비슷한데...
개인적으로 kernel 에서 thread 만드는건 이유가 있지 않으면 신중하는게...
원인을 찾았습니다.
kernel thread의 body 함수를 kernel_thread()를 써서 호출해줘야 하는건데, 그걸 빼 먹었네요.
아래와 같이 하니까 이젠 Oops가 없어졌습니다.
그리고 daemonize()은 Kernel 2.6에는 존재했지만, 3.10 이후인가에서 부터 없어진 것 같네요.
지금 좀 예전 Kernel을 보는 중이라 ~ ^^
댓글 달기