Pages

Wednesday, September 26, 2012

MPS - Exercise 4 - Kernel Modules

Forberedelse

Du skal have et funktionelt VM-Ware Image og et Devkit8000.
Desuden skal følgende være udført:
  • Du skal have en udpakket version af linux-3.2.6 source træet (brug 7zr fra pakken p7zip pakken, som skal installeres)
  • Det at bygge en kerne er en flertrins raket. Først bruges en default konfiguration iha_devkit8000_defconfig, dernæst kompiles kernen. Se nedenfor:
~/source/linux-3.2.6$ make ARCH=arm CROSS_COMPILE=arm-angstrom-linux-gnueabi- iha_devkit8000_defconfig
~/source/linux-3.2.6$ make ARCH=arm CROSS_COMPILE=arm-angstrom-linux-gnueabi- -j4 uImage
Som det fremgår laves der et uImage (makefile target). Dette uImage kan I lægge ned på partitionen der hedder LABEL1 på jeres SD kort, hvorved at det bliver denne kerne som systemet booter på næste gang.
Bemærk at kompileringen af kernemoduler kan være lidt besværlig første gang, men når først tingene er sat rigtig op vha. make filer, source tree mm, så kører det ret gnidningsløst.

Step 1: Lav dit første  Kernemodul

a) "Hello World" programmet
fil: hello.c

#include <linux/init.h>
#include <linux/module.h>

MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
    printk(KERN_ALERT "Hello, world\n");
    return 0;
}

static void hello_exit(void)
{
    printk(KERN_ALERT "Goodbye, cruel world\n");
}

module_init(hello_init);
module_exit(hello_exit);


b) Opret Makefile
Fil: Makefile
# To build modules outside of the kernel tree, we run "make"
# in the kernel source tree; the Makefile these then includes this
# Makefile once again.
# This conditional selects whether we are being included from the
# kernel Makefile or not.
ifeq ($(KERNELRELEASE),)

    # Assume the source tree is where the running kernel was built
    KERNELDIR = ~/sources/linux-3.2.6
    # The current directory is passed to sub-makes as argument
    PWD := $(shell pwd)

modules:
 $(MAKE) ARCH=arm CROSS_COMPILE=arm-angstrom-linux-gnueabi- -C $(KERNELDIR) M=$(PWD) modules

.PHONY: modules clean

else
    # called from kernel build system: just declare what our modules are
    obj-m := hello.o
endif

c) Kompilere og kopiere til target
Host:
Vi kompilere vha. ovenstående Makefile ved at skrive make


Vi kopiere til target


d + e) Indsæt modul (insmod) og udtag modul (rmmod)
Target:
Vi indsætter module i første linje insmod ./hello.ko og i anden linje udtager vi modul rmmod ./hello.ko





Step 2: Få lysdioden fra sidste øvelse til at lyse

Løsningen

Host:
Fil: hello.c













































Target:

Vi indsætter module i første linje insmod ./hello.ko og i anden linje udtager vi modul rmmod ./hello.ko

Vi observer at lysdioden, LED2, tænder når vi bruger insmod og slukker når vi bruger rmmod








No comments:

Post a Comment