Øvelse+4+-+Kernel+Modules

Exercise 4 - Kernel modules

__Lav dit første Kernemodul__
//Lav et ”hello_world” kerne modul og indsæt det i kernen //

**//a) //**
// Starter med at skrive et program som kan udskrive "Hello World" når vi sætter det ind i kernen, og "Goodbye, cruel world" når vi tager det ud af kernen //

 //Uddrag af vores kode://

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) //**
// Derefter laver vi en makefile til vores program //

//Vores makefile://

ifneq ($(KERNELRELEASE),) obj-m := hello_world.o

else KERNELDIR ?= /home/stud/source/linux-2.6.28-omap PWD := $(shell pwd)

default:

$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

endif

Til sidst, efter det hele var komilet, brugte vi insmod og rmmod.

insmod til at sætte ind i kernen, og rmmod til at tage den ud af kernen igen

ved at skrive dmesg kan vi se alle de beskeder der er i kernen, ved først at skrive insmod og derefter dmesg kan vi se at beskeden: "hello world" står i loggen, det samme gælder for rmmod, med beskeden "Goodbye, cruel world"

Step 2: Få lysdioden fra sidste øvelse til at lyse:
Den givne kode blev kopieret ind i kernemodulet fra øvelse 1.

I init-funktionen brugte vi følgende funktioner til at få dioden til at lyse


 * iowrite32(ioread32(REG_GPIO6_OE)|(1<<4), REG_GPIO6_OE);** bit 4 på GPIO6_OE sættes til output, der læses og bit 4 i det læste ORes med 1.
 * iowrite32(ioread32(REG_GPIO6_DOUT)|(1<<4), REG_GPIO6_DOUT);** - bit 4 på GPIO6_DOUT sættes til 1, der læses og bit 4 i det læste ORes med 1.

Disse 2 funktioner tænder lysdioden.

Under exit funktion indsættes følgende kode:

//Pointere til IO6 Registre// //volatile unsigned long *REG_GPIO6_OE;//

Tildele addresser til pointere (mappet til en anden end den fysiske) REG_GPIO6_OE = ioremap( 0x49058034, 1);


 * iowrite32(ioread32(REG_GPIO6_OE)&~(1<<4), REG_GPIO6_OE);** Ved at sætte dioden til input, slukkes denne.

// Frigiv memory release_mem_region (0x49058034, 12); printk(KERN_ALERT "Goodbye, cruel world\n");

På samme måde som i opgave 1 kompilede vi modulet og indsætte det i kernen.

Vi skrev et lille c-program, som kunne tage en kommando. t for a tænde dioden og s for at slukke denne. variablen fd bruges til at sætte hvilken systemdel der skal ændres på

modtog programmet et t, brugte vi en write funktion til at skrive er 1-tal til dioden. modtog programmet derimod et s, blev 0 skrevet til dioden.

Koden blev som følger:

Dette blev testet på boardet, og virkningen blev bekræftiget.