मैं कर्नेल स्पेस से लॉग फ़ाइल में लिखना चाहता हूं। मैं फ़ाइल बना सकता हूं, खोल सकता हूं और बंद कर सकता हूं (/var/log/my_kern_module.log) लेकिन अगर मैं कुछ लिखने की कोशिश करता हूं, तो मेरा मॉड्यूल क्रैश हो जाता है ... इसलिए मुझे पता है कि कर्नेल स्पेस से फाइल पढ़ना/लिखना खराब है, लेकिन मुझे करना होगा यह इस मॉड्यूल में. क्या आपके पास मेरी मदद करने के लिए कोई सुझाव है? धन्यवाद

यहां आप वह कोड पा सकते हैं जो मेरे कर्नेल मॉड्यूल पर लिखता है। यह कोड एक थ्रेड (kthread) में चलता है

mutex_lock(&gl_mtx_writelog);
      printk(KERN_EMERG "Readed : %s\n", buffer);

      fd = filp_open("/var/log/my_kern_module.log", O_CREAT | O_WRONLY | O_APPEND, S_IRWXU);
      if (!IS_ERR (fd)) {
        fs = get_fs();
        set_fs(KERNEL_DS);

        do_sync_write(fd, buffer, readed, 0);

        set_fs(fs);
        filp_close(fd, NULL);
      }
      mutex_unlock(&gl_mtx_writelog);

इसलिए, मैंने fd->f_op->write(...) का उपयोग करने का प्रयास किया है, लेकिन मॉड्यूल क्रैश भी।

BUG: unable to handle kernel NULL pointer dereference at (null)
IP: [<c10df83a>] do_sync_write+0x6a/0xe0
*pde = 00000000
Oops: 0000 [#1] SMP
last sysfs file: /sys/module/snd_mixer_oss/initstate
Modules linked in: trigger_server snd_seq_dummy snd_seq_oss snd_seq_midi_event s                          nd_seq snd_seq_device snd_pcm_oss snd_mixer_oss ipv6 pcmcia pcmcia_core agpgart                           lp fuse ppdev snd_intel8x0 snd_ac97_codec ac97_bus thermal i2c_piix4 snd_pcm the                          rmal_sys i2c_core snd_timer e1000 parport_pc parport snd rtc_cmos rtc_core rtc_l                          ib joydev psmouse soundcore snd_page_alloc evdev usbhid serio_raw hid hwmon ac b                          utton sg [last unloaded: pcmcia_core]

Pid: 2468, comm: kthread_cli Not tainted 2.6.33.4-smp #1 /VirtualBox
EIP: 0060:[<c10df83a>] EFLAGS: 00010287 CPU: 0
EIP is at do_sync_write+0x6a/0xe0
EAX: f6434000 EBX: 00000000 ECX: 00000200 EDX: f5c26400
ESI: f653ca80 EDI: f5cf1f14 EBP: f5cf1f98 ESP: f5cf1f0c
 DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
Process kthread_cli (pid: 2468, ti=f5cf0000 task=f6434000 task.ti=f5cf0000)
Stack:
 c103de14 00000441 00000000 00000442 00000000 00000001 ffffffff f653ca80
<0> 00000000 00000000 00000000 00000000 f6434000 00000000 00000000 c10384a6
<0> 0000052b 00000000 0000052b ffffffff f5c26400 00000400 f5cf1f98 00000442
Call Trace:
 [<c103de14>] ? vprintk+0x184/0x3d0
 [<c10384a6>] ? try_to_wake_up+0x226/0x350
 [<f887b226>] ? thread_client+0x106/0x130 [trigger_server]
 [<f887b120>] ? thread_client+0x0/0x130 [trigger_server]
 [<c1058cf4>] ? kthread+0x74/0x80
 [<c1058c80>] ? kthread+0x0/0x80
 [<c10035be>] ? kernel_thread_helper+0x6/0x10
Code: 94 00 00 00 00 c7 45 98 00 00 00 00 c7 45 9c 00 00 00 00 c7 45 a0 00 00 00                           00 89 45 a4 c7 45 a8 00 00 00 00 c7 45 ac 00 00 00 00 <8b> 03 8b 53 04 89 4d c8                           89 45 b0 89 55 b4 eb 13 8d b6 00 00 00
EIP: [<c10df83a>] do_sync_write+0x6a/0xe0 SS:ESP 0068:f5cf1f0c
CR2: 0000000000000000
---[ end trace 32d03f08f128f335 ]---
5
0xBAADF00D 18 जून 2011, 16:49
शीर्षक में [लिनक्स] न डालें, उसके लिए टैग का उपयोग किया जाना चाहिए। संपादित।
 – 
orlp
18 जून 2011, 16:52
इसमें c++ टैग नहीं होना चाहिए।
 – 
Dipstick
18 जून 2011, 18:28
क्या मैं इस मॉड्यूल का उद्देश्य जान सकता हूँ?
 – 
Sumit Gemini
1 जिंदा 2017, 16:36

3 जवाब

सबसे बढ़िया उत्तर

एक स्पष्ट समस्या यह है कि do_sync_write() का चौथा पैरामीटर एक सूचक है जहां फ़ाइल ऑफ़सेट संग्रहीत है (इसलिए इसे अपडेट किया जा सकता है)। आप 0 पास कर रहे हैं जो नल पॉइंटर समस्या की व्याख्या कर सकता है। प्रयत्न कर सकता:

 loff_t ppos = 0;
 do_sync_write(fd, buffer, readed, &ppos);
4
Dipstick 18 जून 2011, 18:22
1
बेशक हाँ, धन्यवाद। लेकिन एक नया वेरिएबल बनाने की कोई आवश्यकता नहीं है, यह do_sync_write(fd, buffer, readed, &fd->f_pos); के साथ काम कर रहा है। इसलिए यदि आप हैंडल अनुरोध के अनुरूप होना चाहते हैं (यानी: आप उसी समय टेल कमांड के साथ राइटन फाइल देखते हैं जहां मेरा मॉड्यूल लिखता है) -> vfs_write(fd, buffer, strlen(buffer), &fd->f_pos);
 – 
0xBAADF00D
18 जून 2011, 20:57

आपको जो चाहिए वह करने के लिए समकक्ष विधियां यहां सूचीबद्ध हैं।

कर्नेल से फाइल लिखना क्यों खराब है ?

3
sigjuice 18 जून 2011, 20:51
क्या आप कृपया मुझे यह समझने में मदद कर सकते हैं कि हम कर्नेल स्पेस से कब लिख सकते हैं। मैंने यह प्रश्न यहाँ पूछा है .com/questions/41410168/…
 – 
Sumit Gemini
1 जिंदा 2017, 16:45

यह एलकेएमएल पर हर समय आता है, और इसका उत्तर हमेशा "ऐसा मत करो" होता है। हमेशा एक बेहतर तरीका होता है।

0
Chris 18 जून 2011, 18:54