[c] eigen linux driver maken *

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • liquid_ice
  • Registratie: Februari 2001
  • Laatst online: 08-09 14:43
Ik ben het boek "Linux Device drivers" van O'Reilly aan het doornemen om m'n eerste eigen linux driver te kunnen maken.

In het boek staat een beetje code van een Hello_world-driver.
Nou moet ik de code bouwen en een .mod.o en een .ko file krijgen, maar dat lukt me niet.

als ik gewoon gcc aanroep krijg ik dit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
rode@rode-laptop:~/Desktop/drivers/Hello world$ gcc ./Hello.c 
./Hello.c:1:24: error: linux/init.h: No such file or directory
./Hello.c:2:26: error: linux/module.h: No such file or directory
./Hello.c:3: error: expected declaration specifiers or ‘...’ before string constant
./Hello.c:3: warning: data definition has no type or storage class
./Hello.c: In function ‘hello_init’:
./Hello.c:7: error: ‘KERN_ALERT’ undeclared (first use in this function)
./Hello.c:7: error: (Each undeclared identifier is reported only once
./Hello.c:7: error: for each function it appears in.)
./Hello.c:7: error: expected ‘)’ before string constant
./Hello.c: In function ‘hello_exit’:
./Hello.c:13: error: ‘KERN_ALERT’ undeclared (first use in this function)
./Hello.c:13: error: expected ‘)’ before string constant
./Hello.c: At top level:
./Hello.c:16: warning: data definition has no type or storage class
./Hello.c:16: warning: parameter names (without types) in function declaration
./Hello.c:17: warning: data definition has no type or storage class
./Hello.c:17: warning: parameter names (without types) in function declaration


ook met dit commando krijg ik zo goed als dezelfde meldingen:
rode@rode-laptop:~/Desktop/drivers/Hello world$ gcc -DMODULE -D__KERNEL__ -O6 -c Hello.c

en van een andere site had ik dit commando gevist, maar ook dat werkte net:
code:
1
2
3
4
5
rode@rode-laptop:~/Desktop/drivers/Hello world$ make -C /usr/src/linux-headers-2.6.29.3-rode/ SUBDIRS=$PWD Hello.c
make: Entering directory `/usr/src/linux-headers-2.6.29.3-rode'
/usr/src/linux-headers-2.6.29.3-rode/arch/x86/Makefile:41: /usr/src/linux-headers-2.6.29.3-rode/arch/x86/Makefile_32.cpu: No such file or directory
make: *** No rule to make target `/usr/src/linux-headers-2.6.29.3-rode/arch/x86/Makefile_32.cpu'.  Stop.
make: Leaving directory `/usr/src/linux-headers-2.6.29.3-rode'


wat doe ik fout??

PS: de code is:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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);

Klus page: http://klusthuis.blogspot.com


Acties:
  • 0 Henk 'm!

Verwijderd

Heb er niet al teveel verstand van, maar ik zou eens kijken naar het stukje

./Hello.c:1:24: error: linux/init.h: No such file or directory
./Hello.c:2:26: error: linux/module.h: No such file or directory

Als hij die bestanden niet vinden kan, zijn errors verklaarbaar..

Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

linux headers installeren.

i3 + moederbord + geheugen kopen?


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:51
Je hebt sowieso Linux kernel headers nodig, maar je kunt net zo goed gelijk de hele kernel source tree downloaden, tenzij je die natuurlijk al hebt staan ergens (bijvoorbeeld in /usr/src/linux).

Als je de kernel source installeert heb je ook de documentatie erbij, en kun je in Documentation/kbuild/modules.txt precies lezen hoe je modules het beste kunt compileren. ;)

[ Voor 20% gewijzigd door Soultaker op 26-05-2009 22:53 ]


Acties:
  • 0 Henk 'm!

  • liquid_ice
  • Registratie: Februari 2001
  • Laatst online: 08-09 14:43
Ik heb onder ubuntu een verse kernel gedownload en gecompileerd, ook heb ik een directory genaamt kernel/linux-2.6.29.3/include/linux waar beide files in staan.

de headers heb ik dus lijkt me zo.

@Soultaker, ik zal dat ff doorlezen ja.

Klus page: http://klusthuis.blogspot.com


Acties:
  • 0 Henk 'm!

  • Super_ik
  • Registratie: Maart 2001
  • Nu online

Super_ik

haklust!

Hoi,

je moet compilen tegen je kernel source:
hier heb je een Makefile die je een eind op weg zou moeten helpen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Makefile for Linux kernel version 2.6 only
MODULE_NAME = hello_world

DEBFLAGS = -O2 -fomit-frame-pointer
EXTRA_CFLAGS += -Wall $(DEBFLAGS)

ifneq ($(KERNELRELEASE),)
        obj-m += $(MODULE_NAME).o
else
        KDIR:= /usr/src/linux
        PWD := $(shell pwd)

all:    module
module:
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

clean:
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
        rm -f Modules.symvers

endif


houd er rekening mee dat make nogal gevoelig is voor spaties ipv tabs, zorg er dus voor dat je het inspringen met tabs doet.

[ Voor 12% gewijzigd door Super_ik op 26-05-2009 23:10 ]

8<------------------------------------------------------------------------------------
Als ik zo door ga haal ik m'n dood niet. | ik hou van goeie muziek


Acties:
  • 0 Henk 'm!

  • liquid_ice
  • Registratie: Februari 2001
  • Laatst online: 08-09 14:43
Ik zit nu eventjes nog op m'n werk, dus kan het eventjes niet uitproberen.

Maar ik moet die makefile dan gewoon aanroepen met:
code:
1
make Hello_world.c


of nog extra parameters?

Klus page: http://klusthuis.blogspot.com


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:56

Creepy

Tactical Espionage Splatterer

Geen extra parameters nodig. Maar het is denk ik verstandig om je eerst in het kernel build process en makefiles in z'n algemeen te verdiepen voordat je met dit soort zaken echt aan de slag gaat.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • liquid_ice
  • Registratie: Februari 2001
  • Laatst online: 08-09 14:43
Erg bedankt allemaal, het lukt me om de module te bouwen en in te laden met insmod.
Maar de printk komen niet op m'n console terecht.

ik ben aan het zoeken via google, maar overal staat dat het gewoon bij default wel zou moeten gebeuren.

Klus page: http://klusthuis.blogspot.com


Acties:
  • 0 Henk 'm!

  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
printk echo'd niet naar de console, maar naar de kernel log files.

Volgens: http://www.linuxchix.org/...es/kernel_hacking/lesson5 moet je dmesg | less gebruiken om het uit te lezen.

Acties:
  • 0 Henk 'm!

  • liquid_ice
  • Registratie: Februari 2001
  • Laatst online: 08-09 14:43
in dmesg vind ik de logging wel terug ja, maar ik dacht dat je het ook op console kon krijgen.

Klus page: http://klusthuis.blogspot.com


Acties:
  • 0 Henk 'm!

  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
Dat wordt ook op die pagina uitgelegd. Heeft te maken met de loglevel die je meegeeft.

Acties:
  • 0 Henk 'm!

  • liquid_ice
  • Registratie: Februari 2001
  • Laatst online: 08-09 14:43
van de loglevens wist ik al, maar wat als KERN_ALERT, KERN_DEBUG of zelfs KERN_EMERG niet worden weergegeven??

Klus page: http://klusthuis.blogspot.com


Acties:
  • 0 Henk 'm!

  • Super_ik
  • Registratie: Maart 2001
  • Nu online

Super_ik

haklust!

kijk in /proc/sys/kernel/printk om je kijken wat je levels zijn
je kunt dit opschroeven naar alles printen met 'echo 7 > /proc/sys/kernel/printk'

maar ik heb 't vermoeden dan je niet naar je primaire console zit te kijken, maar ergens een xterm oid. doe een ctrl+alt+f1 om te switchen naar die console. of een tail -f /var/log/messages als je dat niet wilt.

8<------------------------------------------------------------------------------------
Als ik zo door ga haal ik m'n dood niet. | ik hou van goeie muziek


Acties:
  • 0 Henk 'm!

Verwijderd

Volgens mij moet je het boek even iets beter doorlezen want dit wordt allemaal in de eerste hoofdstukken uitgelegd.
Pagina: 1