Kernelmodul und Crosscompilierung für PowerPC



  • Hallo zusammen!

    Ich habe folgendes kleines Modul geschrieben:

    #include <linux/module.h>
    #include <linux/config.h>
    #include <linux/init.h>
    #include <linux/version.h>
    
    MODULE_LICENSE("GPL");
    
    static int __init mod1_init (void)
    {
    printk("Funktion 'init_module' wurde aufgerufen!");
    return 0;
    }
    
    static void __exit mod1_exit(void)
    {
    printk("Funktion 'cleanup_module' wurde aufgerufen!");
    return;
    }
    
    module_init(mod1_init);
    module_exit(mod1_exit);
    

    dazu folgendes Makefile:

    ifeq ($(KERNELRELEASE),)
    
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build
    
    PWD := $(shell pwd)
    
    modules:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
    modules_install:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
    
    clean:
        rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.symvers
    
    .PHONY: modules modules_install clean
    
    else
    
        obj-m := mod1.o
    
    endif
    

    Soweit klappt das ganze inzwischen Problemlos unter Linux.
    Jetzt soll das ganze aber auch noch auf einem PowerPC laufen.
    Den gepatchten und konfigurierten Kernel habe ich.
    Wie das ganze jetzt weiter geht verstehe ich aber noch nicht so ganz.
    Der Parameter "-C $(KERNELDIR)" zeigt bei meinem normalen Linuxsystem auf "/lib/modules/2.6.8/build".
    Wohin muß der denn im falle des Kernels für den PPC zeigen?
    Müssen noch weiter Optionen rein?
    Hat jemand hilfreiche Links?

    Vielen Dank schonmal!



  • nun ja, wie ich dir schon bei fun-soft.de gesagt habe: Lies dir einfach http://lwn.net/Kernel/LDD3/ durch. Das ist ene gute Einführung.

    /lib/modules/2.6.8/build ist ein Symlink auf die Sources, von denen der 2.6.8 Kernel gebaut wurde. Meinstens kompiliert man Module für den laufenden Kernel, deswegen habe ich in der Makefile KERNELDIR ?= /lib/modules/$(shell uname -r)/build. Du kannst aber auch sowas haben wie

    KERNELDIR ?= /usr/src/linux-powerpc-2.6.schlagmichtot

    und dann werden deine Module mit den linux-powerpc Kernel Sources kompilert. Crosscompiling auf den Kernel habe ich nie selber angewandt, ich denke, sollte im Prinzip nicht schwer sein. Einfach das entsprechende gcc zu Verfügung stellen.

    Gruss
    Pablo



  • okey, nochmal danke Supertux!
    Habe das Forum hier jetzt erst gefunden. Scheint etwas mehr los zu sein.
    Inzwischen habe ich das mit der Crosskompilierung hinbekommen.
    Dazu mein Makefile

    TOOLPREFIX=/opt/crosstool/bin/powerpc-405-linux-gnu-
    CC=$(TOOLPREFIX)gcc
    
    ARCH := ppc
    CROSS_COMPILE := /opt/crosstool/bin/powerpc-405-linux-gnu-
    
    ifeq ($(KERNELRELEASE),)
    
    KERNELDIR ?= /kernel-2-6-18-ppc/linux-2.6.18-rc3/
    
    PWD := $(shell pwd)
    
    modules:
            $(MAKE) -C $(KERNELDIR) M=$(PWD) modules ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE}
    
    modules_install:
            $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE}
    
    clean:
            rm -rf *.o *~ code .depend .*.cmd *ko *.mod.c .tmp versions *.symcers
    
    .PHONY: modules modules_install clean
    
    else
            obj-m := driver.o
    endif
    

    Danke für die Hilfe!
    Das mit dem Kerneldir habe ich bisher falsch verstanden. Jetzt ist es klar!



  • berton schrieb:

    okey, nochmal danke Supertux!
    Habe das Forum hier jetzt erst gefunden. Scheint etwas mehr los zu sein.

    Ja, hier ist immer mehr los, leider auch mit den Trollen 😉

    berton schrieb:

    Inzwischen habe ich das mit der Crosskompilierung hinbekommen.
    Dazu mein Makefile

    na siehst du? Es war nicht so schwer hinzukriegen. Ich habe Linux nie mit Crosscompiler kompilieren müssen, deswegen wusste ich nicht auf anhieb, was man an der Makefile ändern muss. Meistens genügt es die CC Variable zu ändern und vielleicht auch die CFLAGS (-march=... oder -<arch spezifisches Flag> oder was weiß ich). Dann hättest du die Variable EXTRA_CFLAGS gebraucht.

    Lies dir <linux source Code dir>/Documentation/kbuild durch

    Da sind Beispiele, wie man die Makefiles schreibt. "The kernel build system is a complex beast" [1]

    Gruss
    Pablo

    [1] LDD3 Seite 23


Anmelden zum Antworten