Forberedelse
Du skal have et funktionelt VM-Ware Image og et Devkit8000.
Desuden skal følgende være udført:
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
- Checkout kode fra https://svn.iha.dk/svn/phm/exercises/mps/makefile og switch til local rep
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);
#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
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
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
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





No comments:
Post a Comment