neo2k
06-11-2003, 17:25
Hallo,
Ich brauche etwas Erklaerungshilfe bei Kernelprogrammierung.
Ich nutze die Funktion alloc_skb() des Kerns. Einmal im Kern selber und einmal in meinem eigenen Modul.
Wenn ich diese Funktion im Kern aufrufe, dann klappt das ohne Probleme.
Wenn ich diese Funktion in meinem Modul aufrufe, dann bekomme ich ein:
Kernel panic: Kernel mode fault at addr 0x28, ip 0xa003d050
Als Doku zu der Funktion steht noch:
Buffers may only be allocated from interrupts using a @gfp_mask of %GFP_ATOMIC
Und nochetwas. Ich befinde mich jedes mal wenn ich diese Funktion aufrufe (in meinem Modul und auch im kern) im Sendepfad des TCP-Stacks.
Jetzt ein paar Fragen:
Warum ist im sendepfad ueberhaupt ein Interrupt eingerichtet ?
Und wieso verlasse ich den Interrupt wenn ich eine funktion in meinem Modul aufrufe ?
Kann ich diesen externen aufruf auch innerhalt des interrupts ablaufen lassen ?
Dieses GFP hat etwas damit zu tun, wie der Speicher allokiert werden soll, was hat es damit auf sich ? Kann mir da jemand bischen helfen ?
Hat sonst jemand irgendeine idee ?
Bin fuer alles dankbar, da ich schon ziemlich verzweifel daran.
Vielen Dank
Torsten
PS: evtl noch kurz das Ziel des ganzen, ich versuche den TCP FastPath auszulagern aus dem Kern. Dazu bilde ich die Funktion tcp_sendmsg komlpett in meinem Modul nach.
Ich brauche etwas Erklaerungshilfe bei Kernelprogrammierung.
Ich nutze die Funktion alloc_skb() des Kerns. Einmal im Kern selber und einmal in meinem eigenen Modul.
Wenn ich diese Funktion im Kern aufrufe, dann klappt das ohne Probleme.
Wenn ich diese Funktion in meinem Modul aufrufe, dann bekomme ich ein:
Kernel panic: Kernel mode fault at addr 0x28, ip 0xa003d050
Als Doku zu der Funktion steht noch:
Buffers may only be allocated from interrupts using a @gfp_mask of %GFP_ATOMIC
Und nochetwas. Ich befinde mich jedes mal wenn ich diese Funktion aufrufe (in meinem Modul und auch im kern) im Sendepfad des TCP-Stacks.
Jetzt ein paar Fragen:
Warum ist im sendepfad ueberhaupt ein Interrupt eingerichtet ?
Und wieso verlasse ich den Interrupt wenn ich eine funktion in meinem Modul aufrufe ?
Kann ich diesen externen aufruf auch innerhalt des interrupts ablaufen lassen ?
Dieses GFP hat etwas damit zu tun, wie der Speicher allokiert werden soll, was hat es damit auf sich ? Kann mir da jemand bischen helfen ?
Hat sonst jemand irgendeine idee ?
Bin fuer alles dankbar, da ich schon ziemlich verzweifel daran.
Vielen Dank
Torsten
PS: evtl noch kurz das Ziel des ganzen, ich versuche den TCP FastPath auszulagern aus dem Kern. Dazu bilde ich die Funktion tcp_sendmsg komlpett in meinem Modul nach.