Möchte ISO C90 einhalten, aber wie?
-
greif dir ein buch ueber kernel/linux systemprogrammierung?
-
slayer977 schrieb:
Cool,
habe gerade mein C Buch in der Hand und hatte auch überlegt es mit malloc() zu machen. ABER mein kleines Programm ist ein Kernelmodul! Was für eine Headerdatei brauche ich denn um malloc() verwenden zu können? stdlib.h oder? Ich glaube die kann ich im Kernelspace nutzen oder? Zumindest meckert der Kompiler.
Ja die stdlib.h -> http://de.wikibooks.org/wiki/C-Programmierung:_stdlib.h
Zum Kernelspace und Userspace .. keine Ahnung würde mich aber auch mal interessieren, denn in Kernelmodulen muss ja auch Speicher allokiert werden
-
evtl. noch alloca(). Ist aber nicht wirklich zu empfehlen (siehe manpage).
-
Wenn wir schon dabei sind...
In Wikipedia steht
In C ( anders als in C++) sollte man aber auf den cast verzichten, da dieser dann den Fehler verbirgt, welchen man bekommen könnte wenn man malloc() nicht Inkludiert hat.
Wie ist das zu verstehen?
-
ich glaube in C könnte
char *str = (char) malloc( 10 );
ohne bekanntsein der Funktion malloc( ) wie eine lokale Funktionsdefinition aussehen!?
Greetz, Swordfish
-
es gibt für den Kernelspace den Befehl kmalloc().
http://ezs.kr.hsnr.de/TreiberBuch/html/a9387.html
Habe es gerade mal in mein Programm verbaut. Mal schauen ob ich gleich nen Absturz erlebe
-
Hm,
mein Modul läuft einwandfrei, jedoch bekomme ich in der Logfile messages immer wenn kmalloc() benutzt wird Fehlermeldungen:
Debug: sleeping function called from invalid context at mm/slab.c:2126 Aug 9 21:16:31 slayer977 kernel: in_atomic():1, irqs_disabled():0 Aug 9 21:16:31 slayer977 kernel: [<c015c351>] __kmalloc+0x80/0x82 Aug 9 21:16:31 slayer977 kernel: [<e0a2346e>] getOneRule+0x2e/0x79 [s3] Aug 9 21:16:31 slayer977 kernel: [<e0a2368e>] firewalling+0xce/0x5d6 [s3] Aug 9 21:16:31 slayer977 kernel: [<c011be46>] __wake_up_common+0x39/0x59 Aug 9 21:16:31 slayer977 kernel: [<e0a23bc9>] main_hook+0x33/0x77 [s3] Aug 9 21:16:31 slayer977 kernel: [<c0313039>] nf_iterate+0x60/0x84 Aug 9 21:16:31 slayer977 kernel: [<c0328b46>] ip_rcv_finish+0x0/0x2ca Aug 9 21:16:31 slayer977 kernel: [<c0313312>] nf_hook_slow+0x4d/0xe6 Aug 9 21:16:31 slayer977 kernel: [<c0328b46>] ip_rcv_finish+0x0/0x2ca Aug 9 21:16:31 slayer977 kernel: [<c032882c>] ip_rcv+0x1a6/0x4c0 Aug 9 21:16:31 slayer977 kernel: [<c0328b46>] ip_rcv_finish+0x0/0x2ca Aug 9 21:16:31 slayer977 kernel: [<c0308e07>] netif_receive_skb+0x1cf/0x274 Aug 9 21:16:31 slayer977 kernel: [<c0308f13>] process_backlog+0x67/0xe4 Aug 9 21:16:31 slayer977 kernel: [<c030904b>] net_rx_action+0xbb/0x2bf Aug 9 21:16:31 slayer977 kernel: [<e08f58d4>] ppp_async_process+0x1e/0x61 [ppp_async] Aug 9 21:16:31 slayer977 kernel: [<c01282de>] __do_softirq+0x3e/0x8a Aug 9 21:16:31 slayer977 kernel: [<c0105c29>] do_softirq+0x3e/0x42 Aug 9 21:16:31 slayer977 kernel: ======================= Aug 9 21:16:31 slayer977 kernel: [<c01283a5>] local_bh_enable+0x7b/0x7d Aug 9 21:16:31 slayer977 kernel: [<c03051c2>] datagram_poll+0xc5/0xe3 Aug 9 21:16:31 slayer977 kernel: [<c0371552>] packet_poll+0xba/0x1ae Aug 9 21:16:31 slayer977 kernel: [<c025f7ba>] normal_poll+0xe5/0x143 Aug 9 21:16:31 slayer977 kernel: [<c0259f3d>] tty_poll+0x57/0x61 Aug 9 21:16:31 slayer977 kernel: [<c02fdcc1>] sock_poll+0x12/0x14 Aug 9 21:16:31 slayer977 kernel: [<c019396e>] do_select+0x219/0x4c2 Aug 9 21:16:31 slayer977 kernel: [<c01935c1>] __pollwait+0x0/0x96 Aug 9 21:16:31 slayer977 kernel: [<c0193e0e>] sys_select+0x1df/0x38d Aug 9 21:16:31 slayer977 kernel: [<c017b8d7>] vfs_write+0xb1/0x110 Aug 9 21:16:31 slayer977 kernel: [<c0103a51>] syscall_call+0x7/0xb
-
Ha!
Ich habe nun das eine Flag veändert nun nu wird nicht mehr gemeckert.
Hab's von GFP_KERNEL auf GFP_ATOMIC geändert. Ob es nun richtig ist, und ob es gut ist, dass ich keine Meldungen mehr bekomme. Wer weiß?So sieht nun meine Speicherreservierung aus:
dynamicArray = kmalloc((pos+1)*sizeof(char), GFP_ATOMIC);
Und dann einfach wieder freigeben:
kfree(dynamicArray);
-
slayer977 schrieb:
Ha!
Ich habe nun das eine Flag veändert nun nu wird nicht mehr gemeckert.
Hab's von GFP_KERNEL auf GFP_ATOMIC geändert. Ob es nun richtig ist, und ob es gut ist, dass ich keine Meldungen mehr bekomme. Wer weiß?Kommt darauf an was du machst.
GFP_KERNEL
Normale Allokation von Kernel-Speicher. Kann schlafen.GFP_ATOMIC
Wird dazu verwendet, Speicher aus Interrupt-Handlern und anderem Code außerhalb von Prozeß-Kontexten zu allozieren. Schläft nie.http://www.oreilly.de/german/freebooks/linuxdrive2ger/get.html
@Swordfish:
Habe sogar hier was zum Thema casten von malloc in C gefunden:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-12864-and-start-is-0-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-.html
-
Was nehme ich denn da am besten? Habe jetzt ATOMIC.
Was ich mache (vereinfacht) ist ich schaue in meinem ProcfsBuffer und suche nach dem ersten Auftauchen des Semikolons. Dann erzeuge ich diesen dynamicArray, der genau so lang sein soll, so dass alles von Anfang des Procfs Strings bis zum Semikolon da rein passt.Ist dafür ATOMIC nun gut?
-
codefrag schrieb:
@Swordfish:
Habe sogar hier was zum Thema casten von malloc in C gefunden:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-12864-and-start-is-0-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-.htmlJa, so meinte ich das
Greetz, Swordfish
-
wieso kompilierst du denn nicht einfach als c99? Oder hast du vor dein Linux-Kernel-Modul mit irgendwas anderem als gcc zu kompilieren?